Skip to content
This repository has been archived by the owner on Dec 14, 2018. It is now read-only.

Commit

Permalink
[Fixes #3279] Added DiagnosticSource for filters
Browse files Browse the repository at this point in the history
  • Loading branch information
ajaybhargavb committed Oct 22, 2015
1 parent 493a556 commit f2bc1c0
Show file tree
Hide file tree
Showing 4 changed files with 725 additions and 47 deletions.
160 changes: 125 additions & 35 deletions src/Microsoft.AspNet.Mvc.Core/Controllers/FilterActionInvoker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using System.Threading.Tasks;
using Microsoft.AspNet.Mvc.Abstractions;
using Microsoft.AspNet.Mvc.Core;
using Microsoft.AspNet.Mvc.Diagnostics;
using Microsoft.AspNet.Mvc.Filters;
using Microsoft.AspNet.Mvc.Formatters;
using Microsoft.AspNet.Mvc.Infrastructure;
Expand Down Expand Up @@ -288,8 +289,16 @@ private async Task InvokeAuthorizationFilterAsync()
var current = _cursor.GetNextFilter<IAuthorizationFilter, IAsyncAuthorizationFilter>();
if (current.FilterAsync != null)
{
_diagnosticSource.BeforeOnAuthorizationAsync(
_authorizationContext,
current.FilterAsync);

await current.FilterAsync.OnAuthorizationAsync(_authorizationContext);

_diagnosticSource.AfterOnAuthorizationAsync(
_authorizationContext,
current.FilterAsync);

if (_authorizationContext.Result == null)
{
// Only keep going if we don't have a result
Expand All @@ -302,8 +311,16 @@ private async Task InvokeAuthorizationFilterAsync()
}
else if (current.Filter != null)
{
_diagnosticSource.BeforeOnAuthorization(
_authorizationContext,
current.Filter);

current.Filter.OnAuthorization(_authorizationContext);

_diagnosticSource.AfterOnAuthorization(
_authorizationContext,
current.Filter);

if (_authorizationContext.Result == null)
{
// Only keep going if we don't have a result
Expand Down Expand Up @@ -358,10 +375,19 @@ private async Task<ResourceExecutedContext> InvokeResourceFilterAsync()
{
if (item.FilterAsync != null)
{
_diagnosticSource.BeforeOnResourceExecution(
_resourceExecutingContext,
item.FilterAsync);

await item.FilterAsync.OnResourceExecutionAsync(
_resourceExecutingContext,
InvokeResourceFilterAsync);

_diagnosticSource.AfterOnResourceExecution(
_resourceExecutingContext.ActionDescriptor,
_resourceExecutedContext,
item.FilterAsync);

if (_resourceExecutedContext == null)
{
// If we get here then the filter didn't call 'next' indicating a short circuit
Expand All @@ -383,8 +409,16 @@ await item.FilterAsync.OnResourceExecutionAsync(
}
else if (item.Filter != null)
{
_diagnosticSource.BeforeOnResourceExecuting(
_resourceExecutingContext,
item.Filter);

item.Filter.OnResourceExecuting(_resourceExecutingContext);

_diagnosticSource.AfterOnResourceExecuting(
_resourceExecutingContext,
item.Filter);

if (_resourceExecutingContext.Result != null)
{
// Short-circuited by setting a result.
Expand All @@ -400,7 +434,17 @@ await item.FilterAsync.OnResourceExecutionAsync(
}
else
{
_diagnosticSource.BeforeOnResourceExecuted(
_resourceExecutingContext.ActionDescriptor,
_resourceExecutedContext,
item.Filter);

item.Filter.OnResourceExecuted(await InvokeResourceFilterAsync());

_diagnosticSource.AfterOnResourceExecuted(
_resourceExecutingContext.ActionDescriptor,
_resourceExecutedContext,
item.Filter);
}
}
else
Expand Down Expand Up @@ -500,10 +544,18 @@ private async Task InvokeExceptionFilterAsync()
Debug.Assert(_exceptionContext != null);
if (_exceptionContext.Exception != null)
{
_diagnosticSource.BeforeOnExceptionAsync(
_exceptionContext,
current.FilterAsync);

// Exception filters only run when there's an exception - unsetting it will short-circuit
// other exception filters.
await current.FilterAsync.OnExceptionAsync(_exceptionContext);

_diagnosticSource.AfterOnExceptionAsync(
_exceptionContext,
current.FilterAsync);

if (_exceptionContext.Exception == null)
{
Logger.LogVerbose(
Expand All @@ -521,10 +573,18 @@ private async Task InvokeExceptionFilterAsync()
Debug.Assert(_exceptionContext != null);
if (_exceptionContext.Exception != null)
{
_diagnosticSource.BeforeOnException(
_exceptionContext,
current.Filter);

// Exception filters only run when there's an exception - unsetting it will short-circuit
// other exception filters.
current.Filter.OnException(_exceptionContext);

_diagnosticSource.AfterOnException(
_exceptionContext,
current.Filter);

if (_exceptionContext.Exception == null)
{
Logger.LogVerbose(
Expand Down Expand Up @@ -602,8 +662,17 @@ private async Task<ActionExecutedContext> InvokeActionFilterAsync()
{
if (item.FilterAsync != null)
{
_diagnosticSource.BeforeOnActionExecution(
_actionExecutingContext,
item.FilterAsync);

await item.FilterAsync.OnActionExecutionAsync(_actionExecutingContext, InvokeActionFilterAsync);

_diagnosticSource.AfterOnActionExecution(
_actionExecutingContext.ActionDescriptor,
_actionExecutedContext,
item.FilterAsync);

if (_actionExecutedContext == null)
{
// If we get here then the filter didn't call 'next' indicating a short circuit
Expand All @@ -622,8 +691,16 @@ private async Task<ActionExecutedContext> InvokeActionFilterAsync()
}
else if (item.Filter != null)
{
_diagnosticSource.BeforeOnActionExecuting(
_actionExecutingContext,
item.Filter);

item.Filter.OnActionExecuting(_actionExecutingContext);

_diagnosticSource.AfterOnActionExecuting(
_actionExecutingContext,
item.Filter);

if (_actionExecutingContext.Result != null)
{
// Short-circuited by setting a result.
Expand All @@ -641,7 +718,17 @@ private async Task<ActionExecutedContext> InvokeActionFilterAsync()
}
else
{
_diagnosticSource.BeforeOnActionExecuted(
_actionExecutingContext.ActionDescriptor,
_actionExecutedContext,
item.Filter);

item.Filter.OnActionExecuted(await InvokeActionFilterAsync());

_diagnosticSource.BeforeOnActionExecuted(
_actionExecutingContext.ActionDescriptor,
_actionExecutedContext,
item.Filter);
}
}
else
Expand All @@ -651,34 +738,20 @@ private async Task<ActionExecutedContext> InvokeActionFilterAsync()

try
{
if (_diagnosticSource.IsEnabled("Microsoft.AspNet.Mvc.BeforeActionMethod"))
{
_diagnosticSource.Write(
"Microsoft.AspNet.Mvc.BeforeActionMethod",
new
{
actionContext = ActionContext,
arguments = _actionExecutingContext.ActionArguments,
controller = _actionExecutingContext.Controller
});
}
_diagnosticSource.BeforeActionMethod(
ActionContext,
_actionExecutingContext.ActionArguments,
_actionExecutingContext.Controller);

result = await InvokeActionAsync(_actionExecutingContext);
}
finally
{
if (_diagnosticSource.IsEnabled("Microsoft.AspNet.Mvc.AfterActionMethod"))
{
_diagnosticSource.Write(
"Microsoft.AspNet.Mvc.AfterActionMethod",
new
{
actionContext = ActionContext,
arguments = _actionExecutingContext.ActionArguments,
controller = _actionExecutingContext.Controller,
result = result
});
}
_diagnosticSource.AfterActionMethod(
ActionContext,
_actionExecutingContext.ActionArguments,
_actionExecutingContext.Controller,
result);
}

_actionExecutedContext = new ActionExecutedContext(
Expand Down Expand Up @@ -747,8 +820,17 @@ private async Task<ResultExecutedContext> InvokeResultFilterAsync()
var item = _cursor.GetNextFilter<IResultFilter, IAsyncResultFilter>();
if (item.FilterAsync != null)
{
_diagnosticSource.BeforeOnResultExecution(
_resultExecutingContext,
item.FilterAsync);

await item.FilterAsync.OnResultExecutionAsync(_resultExecutingContext, InvokeResultFilterAsync);

_diagnosticSource.AfterOnResultExecution(
_resultExecutingContext.ActionDescriptor,
_resultExecutedContext,
item.FilterAsync);

if (_resultExecutedContext == null || _resultExecutingContext.Cancel == true)
{
// Short-circuited by not calling next || Short-circuited by setting Cancel == true
Expand All @@ -766,8 +848,16 @@ private async Task<ResultExecutedContext> InvokeResultFilterAsync()
}
else if (item.Filter != null)
{
_diagnosticSource.BeforeOnResultExecuting(
_resultExecutingContext,
item.Filter);

item.Filter.OnResultExecuting(_resultExecutingContext);

_diagnosticSource.AfterOnResultExecuting(
_resultExecutingContext,
item.Filter);

if (_resultExecutingContext.Cancel == true)
{
// Short-circuited by setting Cancel == true
Expand All @@ -784,7 +874,17 @@ private async Task<ResultExecutedContext> InvokeResultFilterAsync()
}
else
{
_diagnosticSource.BeforeOnResultExecuted(
_resultExecutingContext.ActionDescriptor,
_resultExecutedContext,
item.Filter);

item.Filter.OnResultExecuted(await InvokeResultFilterAsync());

_diagnosticSource.AfterOnResultExecuted(
_resultExecutingContext.ActionDescriptor,
_resultExecutedContext,
item.Filter);
}
}
else
Expand Down Expand Up @@ -824,25 +924,15 @@ private async Task<ResultExecutedContext> InvokeResultFilterAsync()

private async Task InvokeResultAsync(IActionResult result)
{
if (_diagnosticSource.IsEnabled("Microsoft.AspNet.Mvc.BeforeActionResult"))
{
_diagnosticSource.Write(
"Microsoft.AspNet.Mvc.BeforeActionResult",
new { actionContext = ActionContext, result = result });
}
_diagnosticSource.BeforeActionResult(ActionContext, result);

try
{
await result.ExecuteResultAsync(ActionContext);
}
finally
{
if (_diagnosticSource.IsEnabled("Microsoft.AspNet.Mvc.AfterActionResult"))
{
_diagnosticSource.Write(
"Microsoft.AspNet.Mvc.AfterActionResult",
new { actionContext = ActionContext, result = result });
}
_diagnosticSource.AfterActionResult(ActionContext, result);
}
}

Expand Down
Loading

0 comments on commit f2bc1c0

Please sign in to comment.