- 1 public class Class1
- 2 {
- 3
- 4 protected virtual ActionExecutedContext InvokeActionMethodWithFilters(ControllerContext controllerContext, IList<IActionFilter> filters, ActionDescriptor actionDescriptor, IDictionary<string, object> parameters)
- 5 {
- 6 ActionExecutingContext preContext = new ActionExecutingContext(controllerContext, actionDescriptor, parameters);
- 7
- 8 Func<ActionExecutedContext> seed = () => new ActionExecutedContext(controllerContext, actionDescriptor, false, null)
- 9 {
- 10 Result = this.InvokeActionMethod(controllerContext, actionDescriptor, parameters)
- 11 };
- 12
- 13 Func<Func<ActionExecutedContext>, IActionFilter, Func<ActionExecutedContext>> secondParam =
- 14 (Func<ActionExecutedContext> next, IActionFilter filter) =>
- 15 {
- 16 Func<ActionExecutedContext> returnFunc = () =>
- 17 {
- 18 return Class1.InvokeActionMethodFilter(filter, preContext, next);
- 19 };
- 20
- 21 return returnFunc;
- 22
- 23 //这个是简写
- 24 //return () => Class1.InvokeActionMethodFilter(filter, preContext, next);
- 25 };
- 26
- 27 return filters.Reverse<IActionFilter>().Aggregate(seed,
- 28 //(Func<ActionExecutedContext> next, IActionFilter filter) => () => Class1.InvokeActionMethodFilter(filter, preContext, next)
- 29 secondParam
- 30 )
- 31 .Invoke();
- 32 }
- 33
- 34 internal static ActionExecutedContext InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func<ActionExecutedContext> continuation)
- 35 {
- 36 filter.OnActionExecuting(preContext);
- 37 if (preContext.Result != null)
- 38 {
- 39 return new ActionExecutedContext(preContext, preContext.ActionDescriptor, true, null)
- 40 {
- 41 Result = preContext.Result
- 42 };
- 43 }
- 44 bool flag = false;
- 45 ActionExecutedContext actionExecutedContext = null;
- 46 try
- 47 {
- 48 actionExecutedContext = continuation();
- 49 }
- 50 catch (ThreadAbortException)
- 51 {
- 52 actionExecutedContext = new ActionExecutedContext(preContext, preContext.ActionDescriptor, false, null);
- 53 filter.OnActionExecuted(actionExecutedContext);
- 54 throw;
- 55 }
- 56 catch (Exception exception)
- 57 {
- 58 flag = true;
- 59 actionExecutedContext = new ActionExecutedContext(preContext, preContext.ActionDescriptor, false, exception);
- 60 filter.OnActionExecuted(actionExecutedContext);
- 61 if (!actionExecutedContext.ExceptionHandled)
- 62 {
- 63 throw;
- 64 }
- 65 }
- 66 if (!flag)
- 67 {
- 68 filter.OnActionExecuted(actionExecutedContext);
- 69 }
- 70 return actionExecutedContext;
- 71 }
- 72
- 73 protected virtual ActionResult InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary<string, object> parameters)
- 74 {
- 75 object actionReturnValue = actionDescriptor.Execute(controllerContext, parameters);
- 76 return this.CreateActionResult(controllerContext, actionDescriptor, actionReturnValue);
- 77 }
- 78
- 79 protected virtual ActionResult CreateActionResult(ControllerContext controllerContext, ActionDescriptor actionDescriptor, object actionReturnValue)
- 80 {
- 81 if (actionReturnValue == null)
- 82 {
- 83 return new EmptyResult();
- 84 }
- 85 ActionResult arg_29_0;
- 86 if ((arg_29_0 = (actionReturnValue as ActionResult)) == null)
- 87 {
- 88 arg_29_0 = new ContentResult();
- 89 //(arg_29_0 = new ContentResult()).Content = Convert.ToString(actionReturnValue, CultureInfo.InvariantCulture);
- 90 (arg_29_0 as ContentResult).Content = Convert.ToString(actionReturnValue, CultureInfo.InvariantCulture);
- 91 }
- 92 return arg_29_0;
- 93 }
- 94
- 95 }