【问题标题】:Webapi inherited controllers are ignoring Route attributesWebapi 继承的控制器正在忽略 Route 属性
【发布时间】:2019-08-30 03:36:24
【问题描述】:

我想在 webapi 2 网站上有一个 Controller Hierarchy 程序集来处理常见的 CRUD 服务操作。

我从一个像这样的抽象 webapi 类开始(为简单起见,我删除了不必要的代码和注入):

public abstract class EntityController<T> : ApiController {

[Route("GetAll")]
[HttpGet]
public IHttpActionResult GetAll()
{
//code
}

[Route("Add")]
[HttpPost]
public IHttpActionResult Add(T entity)
{
//code
}

[Route("Delete")]
[HttpDelete]
public IHttpActionResult Delete(T entity)
{
//code
}

[Route("Edit")]
[HttpPost]
public IHttpActionResult Edit(T entity)
{
//code
}
}

首先,我注意到如果我们在外部程序集中有控制器,则无法正确解析路由。我找到了这篇文章:

https://www.strathweb.com/2012/06/using-controllers-from-an-external-assembly-in-asp-net-web-api/

当我应用建议的更改时,路线不使用“路线”属性。 IE。如果我有以下派生类:

[RoutePrefix("api/thebooks")]
public class BookController : EntityController<Book>
{
public BookController() : base()
{
}
}

控制器前缀是 api/book 而不是 api/thebooks,如果我尝试调用“添加”,则会出现异常:

找到多个与请求匹配的操作:

添加类型 [...]

编辑类型 [...]

查找类型 [...]

如何表明我将在继承的控制器上使用 Route 和 RoutePrefix 属性?

提前致谢!!!

【问题讨论】:

  • 如果您向我们展示您的路线配置,将会很有帮助。还请告诉我们您用[...] 掩盖的类型。

标签: c# asp.net asp.net-web-api


【解决方案1】:

RouteRoutePrefix 都不会被继承,因为Inherited 设置为false,如下所示:

[Inherited=false)]
public class RoutePrefixAttribute : Attribute

你可以阅读更多关于Inheritedhere的信息。

不幸的是,您将需要再次装饰您的子类。

【讨论】:

    【解决方案2】:

    可以通过一些诡计来覆盖 Route 和 RoutePrefix 继承的 false。

    首先从DefaultDirectRouteProvider继承 - 注意GetCustomAttributes内部的继承true

    public class InheritanceDirectRouteProvider : DefaultDirectRouteProvider
    {
        protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
        {
            return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>(true);
        }
    }
    

    然后在您的应用程序启动类(WebApiConfigStartup)中将其注册为您的 HttpConfiguration 作为扩展名,然后将启动中的行从 config.MapHttpAttributeRoutes(); 更改为 config.MapInheritedAttributeRoutes();

    public static class HttpConfigurationExtensions
    {
        public static void MapInheritedAttributeRoutes(this HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes(new InheritanceDirectRouteProvider());
        }
    }
    
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            config.MapInheritedAttributeRoutes();
            app.UseWebApi(config);
        }
    }
    

    摘自本文https://www.strathweb.com/2016/06/inheriting-route-attributes-in-asp-net-web-api/

    【讨论】:

      猜你喜欢
      • 2014-06-14
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      • 2021-07-01
      • 2014-09-17
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      相关资源
      最近更新 更多