Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save tugberkugurlu/3047791 to your computer and use it in GitHub Desktop.
Save tugberkugurlu/3047791 to your computer and use it in GitHub Desktop.
// Func<Task<HttpResponseMessage>>
Task<HttpResponseMessage> result = InvokeActionWithAuthorizationFilters(actionContext, cancellationToken, authorizationFilters, () =>
{
HttpActionBinding actionBinding = actionDescriptor.ActionBinding;
Task bindTask = actionBinding.ExecuteBindingAsync(actionContext, cancellationToken);
return bindTask.Then<HttpResponseMessage>(() =>
{
_modelState = actionContext.ModelState;
Func<Task<HttpResponseMessage>> invokeFunc = InvokeActionWithActionFilters(actionContext, cancellationToken, actionFilters, () =>
{
return controllerServices.GetActionInvoker().InvokeActionAsync(actionContext, cancellationToken);
});
return invokeFunc();
});
})();
result = InvokeActionWithExceptionFilters(result, actionContext, cancellationToken, exceptionFilters);
return result;
internal static Func<Task<HttpResponseMessage>> InvokeActionWithAuthorizationFilters(HttpActionContext actionContext, CancellationToken cancellationToken, IEnumerable<IAuthorizationFilter> filters, Func<Task<HttpResponseMessage>> innerAction)
{
Contract.Assert(actionContext != null);
Contract.Assert(filters != null);
Contract.Assert(innerAction != null);
// Because the continuation gets built from the inside out we need to reverse the filter list
// so that least specific filters (Global) get run first and the most specific filters (Action) get run last.
filters = filters.Reverse();
Func<Task<HttpResponseMessage>> result = filters.Aggregate(innerAction, (continuation, filter) =>
{
return () => filter.ExecuteAuthorizationFilterAsync(actionContext, cancellationToken, continuation);
});
return result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment