Web API 2如何为所有继承基控制器的控制器配置统一/Ping访问路由
Web API 2 多控制器统一Ping接口路由配置解决方案
配置不生效的核心原因:Web API 2 默认不会将父类Action定义的路由特性与子类的
RoutePrefix进行拼接,基类中Ping方法标注的[Route("Ping")]只会生成根路径/Ping,不会携带各业务控制器的前缀。
方案1:修改基类Ping路由模板(无需修改全局配置,推荐)
直接调整基控制器中Ping方法的路由特性,显式加入控制器占位符,即可自动匹配所有继承基控制器的业务控制器名称:
public class BaseController : ApiController { [HttpGet] // 用{controller}占位符自动适配子类控制器名 [Route("{controller}/Ping")] public IHttpActionResult Ping() { return this.Ok(HttpStatusCode.OK); } }
该方案无需修改其他业务控制器和全局配置,调整后即可直接访问/Employee/Ping、/Student/Ping,原有业务接口的路由完全不受影响。
方案2:开启路由特性继承(适配更多继承类路由场景)
如果需要更多父类路由被子类继承的场景,可以通过自定义路由提供者开启路由特性继承能力,无需修改基类的原有路由定义:
- 首先自定义路由提供者类:
public class InheritableDirectRouteProvider : DefaultDirectRouteProvider { protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(HttpActionDescriptor actionDescriptor) { // 配置为继承父类定义的路由特性 return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>(inherit: true); } }
- 修改
WebApiConfig.cs中的路由注册逻辑,使用自定义的路由提供者:
public static class WebApiConfig { public static void Register(HttpConfiguration config) { // 替换原有MapHttpAttributeRoutes调用 config.MapHttpAttributeRoutes(new InheritableDirectRouteProvider()); // 其他原有配置保持不变 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
配置完成后,基类原有的[Route("Ping")]会自动和子类的RoutePrefix拼接,生成预期的/Employee/Ping、/Student/Ping路径。
内容的提问来源于stack exchange,提问作者Arun Singh
相关产品推荐
相关产品推荐

