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????????????????

 

?????????????????????