ASP.NET Core – 实现自定义WebApi模型验证
- 2019 年 10 月 3 日
- 筆記
??Framework????
???Framework???????????????????????????
[HttpPost] public async Task<JsonResult> SaveNewCustomerAsnyc(AddCustomerInput input) { if (!ModelState.IsValid) { return Json(Result.FromCode(ResultCode.InvalidParams)); } ..... }
???????????IActionFilter??????????
??public class ApiValidationFilter : IActionFilter { public bool AllowMultiple => false; public async Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation) { var method = actionContext.ActionDescriptor.GetMethodInfoOrNull(); if (method == null) { return await continuation(); } if (!actionContext.ModelState.IsValid) { var error = actionContext.ModelState.GetValidationSummary(); var result = Result.FromError($"????????{error}", ResultCode.InvalidParams); return actionContext.Request.CreateResponse(result); } return await continuation(); } }
?public static class ModelStateExtensions { /// <summary> /// ?????????????? /// </summary> public static string GetValidationSummary(this ModelStateDictionary modelState, string separator = "rn") { if (modelState.IsValid) return null; var error = new StringBuilder(); foreach (var item in modelState) { var state = item.Value; var message = state.Errors.FirstOrDefault(p => !string.IsNullOrWhiteSpace(p.ErrorMessage))?.ErrorMessage; if (string.IsNullOrWhiteSpace(message)) { message = state.Errors.FirstOrDefault(o => o.Exception != null)?.Exception.Message; } if (string.IsNullOrWhiteSpace(message)) continue; if (error.Length > 0) { error.Append(separator); } error.Append(message); } return error.ToString(); } }?
??????????????????????
??.Net Core????
??????????
???.Net Core??????????????model?state????ModelState??????????ModelStateInvalidFilter???????OnActionExecuting?????
???????????????????????????????????????????????ModelState???Valid????InValid?????400 BadRequest???????????????????????????????????????
if (!ModelState.IsValid) { return BadRequest(ModelState); }
????????
????????????????????????400????????????????????Json???????????????400???????????????BadRequest???????????????Json?????
????? BadRequest ??
???????? ASP.NET Core WEB API ????????????????????Startup?ConfigureServices????ApiBehaviorOptions??????????????
??public class ApiBehaviorOptions { public Func<ActionContext, IActionResult> InvalidModelStateResponseFactory { get; set; } public bool SuppressModelStateInvalidFilter { get; set; } public bool SuppressInferBindingSourcesForParameters { get; set; } public bool SuppressConsumesConstraintForFormFileParameters { get; set; } }
????bool?????????false?
?????
??? SuppressModelStateInvalidFilter ????? true ???????????
??public void ConfigureServices(IServiceCollection services) { services .AddMvc() .AddXmlSerializerFormatters() //????XML?????? .SetCompatibilityVersion(CompatibilityVersion.Version_2_1); //?????? services.Configure<ApiBehaviorOptions>(options => { options.SuppressModelStateInvalidFilter = true; }); }
???????????????????????????????????ApiValidationFilter???????????ConfigureServices??????????????
public void ConfigureServices(IServiceCollection services) { ..... services .AddMvc(options => { options.Filters.Add<ApiValidationFilter>(); }) .AddXmlSerializerFormatters() //????XML?????? .SetCompatibilityVersion(CompatibilityVersion.Version_2_1); }
???????
?????????????????????????????????InvalidModelStateResponseFactory???InvalidModelStateResponseFactory??????ActionContext?????IActionResult?????????????
public void ConfigureServices(IServiceCollection services) { services .AddMvc() .AddXmlSerializerFormatters() //????XML?????? .SetCompatibilityVersion(CompatibilityVersion.Version_2_1); //???? services.Configure<ApiBehaviorOptions>(options => { options.InvalidModelStateResponseFactory = (context) => { var error = context.ModelState.GetValidationSummary(); return new JsonResult(Result.FromError($"????????{error.ToString()}", ResultCode.InvalidParams)); }; }); }
??????????ModelState????????ApiBehaviorOptions?????????????????????????????ModelState?????????????????JsonResult???????
????
???????????????WebApi??????????????????????????????????????????????????????????
??????????Framework???????????????????????SuppressModelStateInvalidFilter = true?
?????????????????Core??????????InvalidModelStateResponseFactory????????????????
?????????????????????