【问题标题】:Mixing WebAPI and MVC AttributeRouting with Route Prefix?将 WebAPI 和 MVC AttributeRouting 与路由前缀混合?
【发布时间】:2017-03-12 22:38:16
【问题描述】:

我对在 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 的值。

这可能吗?

【问题讨论】:

  • 您所描述的是基于约定的路由,它与同一控制器上的属性路由不能很好地混合。控制器要么遵循基于约定的路由,要么遵循属性路由。不是都。您可以拥有不同的控制器,要么全部为属性,要么全部基于约定。属性路由允许通过 IMO 获得更大的灵活性。 docs.microsoft.com/en-us/aspnet/web-api/overview/…
  • 谢谢@Nkosi。所以你的意思是,如果我想更改基于属性的控制器以使用“api”作为前缀,我应该在每个控制器的 RoutePrefix 属性中执行此操作,而忽略约定/映射? (今晚我会阅读那篇 MSDN 文章,感谢您找到它!)
  • 没有。不是在每个控制器上。我找到了一篇更好的文章,应该正是您正在寻找的内容strathweb.com/2015/10/…

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


【解决方案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 将被添加到控制器操作路由之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2019-11-04
    • 2017-06-07
    • 1970-01-01
    • 2017-02-15
    • 2013-07-27
    • 1970-01-01
    相关资源
    最近更新 更多