使用Route Prefix混合WebAPI和MVC AttributeRouting?

时间:2017-03-12 22:38:17

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

我非常擅长在MVC中设置路由和路由。在我上一份工作中,我们使用属性路由来处理WebAPI,因此我非常熟悉(RoutePrefixRouteHttpGet / HttpPost属性,等等)。我可以让我当前的项目与属性一起工作。

所以现在我要做的是"前缀"使用" api"的所有webApi路由。所以我没有去mysite / test / hello,而是想去mysite / api / test / hello。

这就是我所拥有的,只使用属性路由,它可以正常工作:

[RoutePrefix("Test")]
public class TestController : ApiController
{ ....

  [HttpPost]
  [Route("{message}")]
  public HttpResponse EchoBack(string message)
  {
      // return message ... in this case, "hello"
  }
}

现在,我知道我可以将RoutePrefix更改为" api / Test" (100%工作),但我不想更改我的所有控制器,我宁愿能够通过更改传入WebApiConfig中config.Routes.MapHttpRoute的值来执行此操作。

这可能吗?

1 个答案:

答案 0 :(得分:1)

您所描述的内容可以通过使用所谓的全局路由前缀在属性路由中完成。

参考这篇文章Global route prefixes with attribute routing in ASP.NET Web API

创建DirectRouteProvider

public class CentralizedPrefixProvider : DefaultDirectRouteProvider {
    private readonly string _centralizedPrefix;

    public CentralizedPrefixProvider(string centralizedPrefix) {
        _centralizedPrefix = centralizedPrefix;
    }

    protected override string GetRoutePrefix(HttpControllerDescriptor controllerDescriptor) {
        var existingPrefix = base.GetRoutePrefix(controllerDescriptor);
        if (existingPrefix == null) return _centralizedPrefix;

        return string.Format("{0}/{1}", _centralizedPrefix, existingPrefix);
    }
}

引用文章。

  

上面显示的CentralizedPrefixProvider采用前缀   全球优先考虑每条路线。如果一个特定的控制器有它   自己的路由前缀(通过base.GetRoutePrefix方法获得   调用),然后集中前缀只是前缀   一个也是。

在WebAPiConfig中配置它,如下所示

config.MapHttpAttributeRoutes(new CentralizedPrefixProvider("api"));

所以现在例如,如果你有这样的控制器

[RoutePrefix("Test")]
public class TestController : ApiController {
    [HttpPost]
    [Route("{message}")]
    public IHttpActionResult EchoBack(string message) { ... }
}

以上操作将通过

访问
<<host>>/api/Test/{message}

其中api将被添加到控制器操作路由之前。