/// <summary> /// 创建请求委托 /// </summary> /// <param name="apiAction"></param> /// <returns></returns> private static InvokeDelegate <ApiRequestContext> BuildRequestHandler(ApiActionDescriptor apiAction) { var builder = new PipelineBuilder <ApiRequestContext>(); // 参数验证特性验证和参数模型属性特性验证 builder.Use(next => context => { var validateProperty = context.HttpContext.Options.UseParameterPropertyValidate; foreach (var parameter in context.ApiAction.Parameters) { var parameterValue = context.Arguments[parameter.Index]; ApiValidator.ValidateParameter(parameter, parameterValue, validateProperty); } return(next(context)); }); // action特性请求前执行 foreach (var attr in apiAction.Attributes) { builder.Use(attr.OnRequestAsync); } // 参数特性请求前执行 foreach (var parameter in apiAction.Parameters) { var index = parameter.Index; foreach (var attr in parameter.Attributes) { builder.Use(async(context, next) => { var ctx = new ApiParameterContext(context, index); await attr.OnRequestAsync(ctx, next).ConfigureAwait(false); }); } } // Return特性请求前执行 foreach (var @return in apiAction.Return.Attributes) { if (@return.Enable == true) { builder.Use(@return.OnRequestAsync); } } // Filter请求前执行 foreach (var filter in apiAction.FilterAttributes) { if (filter.Enable == true) { builder.Use(filter.OnRequestAsync); } } return(builder.Build()); }
/// <summary> /// 创建响应委托 /// </summary> /// <param name="apiAction"></param> /// <returns></returns> private static InvokeDelegate <ApiResponseContext> BuildResponseHandler(ApiActionDescriptor apiAction) { var builder = new PipelineBuilder <ApiResponseContext>(); // Return特性请求后执行 foreach (var @return in apiAction.Return.Attributes) { if (@return.Enable == false) { continue; } builder.Use(async(context, next) => { if (context.ResultStatus == ResultStatus.None) { await @return.OnResponseAsync(context, next).ConfigureAwait(false); } else { await next().ConfigureAwait(false); } }); } // 验证Result是否ok builder.Use(next => context => { try { ApiValidator.ValidateReturnValue(context.Result, context.HttpContext.Options.UseReturnValuePropertyValidate); } catch (Exception ex) { context.Exception = ex; } return(next(context)); }); // Filter请求后执行 foreach (var filter in apiAction.FilterAttributes) { if (filter.Enable == true) { builder.Use(filter.OnResponseAsync); } } return(builder.Build()); }