具有属性路由和RoutePrefix的Url.HttpRouteUrl

时间:2015-04-15 18:47:39

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

我有两个Api控制器:

[RoutePrefix("api/Sql")]
public class SqlApiController : ApiController
{

    [Route("{serverName?}", Name = "OutageLastWeek")]
    public HttpResponseMessage GetOutageLastWeek(string serverName = "")
    {
        // Some code...
    }
}

[RoutePrefix("api/Oracle")]
public class OracleApiController : ApiController
{

    [Route("{serverName?}", Name = "OutageLastWeek")]
    public HttpResponseMessage GetOutageLastWeek(string serverName = "")
    {
        // Some code...
    }
}

如您所见,两个控制器中的操作具有相同的路径名称。如何使用Url.HttpRouteUrl调用这些操作?如何指定路由前缀?

以下内容并没有给我正确的网址:

@Url.HttpRouteUrl("OutageLastWeek", new { serverName = "" })

2 个答案:

答案 0 :(得分:3)

你不能。实际上,由于对两个不同的路由使用相同的名称,您应该会收到错误。每个路由名称必须是唯一的。没有办法解决这个问题。

答案 1 :(得分:1)

克里斯的回答有助于找到我做错的事。

路由名称不会是用于调用Web API操作的URL的一部分。它只是一个唯一的名称,您可以在使用Url.HttpRouteUrl()创建路径的URL时参考该名称。所以,我的控制器应该如下所示:

[RoutePrefix("api/Sql")]
public class SqlApiController : ApiController
{

    [Route("OutageLastWeek/{serverName?}", Name = "SqlOutageLastWeek")]
    public HttpResponseMessage GetOutageLastWeek(string serverName = "")
    {
        // Some code...
    }
}

[RoutePrefix("api/Oracle")]
public class OracleApiController : ApiController
{

    [Route("OutageLastWeek/{serverName?}", Name = "OracleOutageLastWeek")]
    public HttpResponseMessage GetOutageLastWeek(string serverName = "")
    {
        // Some code...
    }
}

然后,我将能够生成如下网址:

@Url.HttpRouteUrl("SqlOutageLastWeek", new { serverName = "" })
@Url.HttpRouteUrl("OracleOutageLastWeek", new { serverName = "" })