Web API控制器多个HttpPost方法如何复用公共逻辑避免重复代码
解决方案
你可以通过以下3种常用方式实现公共校验逻辑,无需重复编写代码:
方法1:重写当前控制器的OnActionExecuting方法(仅适用于当前控制器)
直接在你的OnboardingController里重写父类的OnActionExecuting方法,过滤只对HttpPost请求执行校验即可:
public class OnboardingController : ApiController { // 所有动作执行前都会先进入这个方法 public override void OnActionExecuting(HttpActionContext actionContext) { // 只校验HttpPost请求 if (actionContext.Request.Method == HttpMethod.Post) { // 这里写你的公共校验逻辑 bool checkPassed = 你的自定义校验方法(); if (!checkPassed) { // 校验不通过直接返回错误,不会进入后续业务方法 actionContext.Response = actionContext.Request.CreateErrorResponse( HttpStatusCode.BadRequest, "校验失败的提示信息"); } } base.OnActionExecuting(actionContext); } [HttpPost] [Route("api/Onboarding/Method1", Name = "Onboarding/Method1")] public IHttpActionResult Method1() { // 业务代码,不需要再写校验逻辑 } [HttpPost] [Route("api/Onboarding/Method2", Name = "Onboarding/Method2")] public IHttpActionResult Method2() { // 业务代码,不需要再写校验逻辑 } }
方法2:自定义动作过滤器特性(可复用给多个控制器/方法)
如果你的校验逻辑需要在多个控制器里使用,可以封装成独立的过滤器特性:
// 自定义Post校验过滤器 public class ValidatePostAttribute : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionContext) { if (actionContext.Request.Method == HttpMethod.Post) { bool checkPassed = 你的自定义校验方法(); if (!checkPassed) { actionContext.Response = actionContext.Request.CreateErrorResponse( HttpStatusCode.BadRequest, "校验失败"); } } base.OnActionExecuting(actionContext); } }
使用时直接打在控制器类上,控制器内所有HttpPost方法都会自动触发校验:
[ValidatePost] // 打在控制器上,当前控制器所有动作生效 public class OnboardingController : ApiController { // 你的业务方法,无需改动 }
也可以单独打在指定的Action上,只对单个方法生效。
方法3:注册全局过滤器(适用于全站所有控制器的HttpPost请求)
如果所有控制器的HttpPost请求都需要执行这个校验,直接在全局配置里注册过滤器即可,不需要给每个控制器打特性:
在App_Start/WebApiConfig.cs的Register方法里添加:
public static void Register(HttpConfiguration config) { // 注册全局Post校验过滤器 config.Filters.Add(new ValidatePostAttribute()); // 其他原有配置 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); }
内容的提问来源于stack exchange,提问作者elad
相关产品推荐
相关产品推荐

