【问题标题】:Attribute Routing for ApiControllers from external assembly来自外部程序集的 ApiController 的属性路由
【发布时间】:2014-02-27 15:11:58
【问题描述】:

我有一个大型 ASP.NET MVC 5 应用程序,现在我想为它实现 Web API。但我想将 ApiControllers 放在一个单独的项目中。

我在为 Web API 组织路由时遇到问题:

我想要我的主应用程序路由

host/*

API 映射在

host/api/* 

对于 API,我想使用属性路由,但无法正确设置 WebApiConfig。

如何组织这个,保留使用“属性路由”的能力?

【问题讨论】:

  • 在您的项目中实现 Web API 的原因是什么?是否服务于现有的和新的 UI 功能,在这种情况下我会问,是否真的有必要在已经很大的 MVC 应用程序中引入另一层?还是为您的域的外部/第三方集成提供一组服务?
  • 是的,我们计划在客户端重新实现 UI,并为第三方服务提供 API 访问权限。 BigApp 的旧部分将一点点消亡

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


【解决方案1】:

我找到了解决办法:

对于 ApiControllers,不需要重新实现工厂。

在项目Web(main)中,我们需要:

  1. 使用 ApiControllers 向项目添加依赖项

  2. 以这种方式编辑 Global.asax

    替换:

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    

    到

    GlobalConfiguration.Configure(WebApiConfig.Register);
    
  3. 在 WebApiConfig.Register 中

    config.MapHttpAttributeRoutes();
    

    启用属性路由。

现在 Web API 引擎可以找到 Scope 中的所有 ApiController。

【讨论】:

    【解决方案2】:

    在您的 WebApiConfig 类中:

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes();
        }
    }
    

    在您的控制器中:

    [RoutePrefix("api")]
    public class MyController : ApiController
    {
        [Route("myaction")]
        public IHttpActionResult MyAction()
        {
           //code
        }
    
        [Route("otheraction/{id}")]
        public IHttpActionResult OtherAction(int id)
        {
           //code
        }
    }
    

    现在,这个控制器的路由和这些动作将被映射如下:

    {主机}/api/myaction
    {host}/api/otheraction/{id}

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 2018-10-15
      • 2018-01-12
      • 2018-04-20
      • 2010-09-25
      • 1970-01-01
      • 2020-09-08
      相关资源
      最近更新 更多