21

我的 Web.API 路由有问题。我有以下两条路线:

config.Routes.MapHttpRoute(
    name: "MethodOne",
    routeTemplate: "api/{controller}/{action}/{id}/{type}",
    defaults: new { id = RouteParameter.Optional, type = RouteParameter.Optional }
);

config.Routes.MapHttpRoute(
    name: "MethodTwo",
    routeTemplate: "api/{controller}/{action}/{directory}/{report}",
    defaults: new { directory = RouteParameter.Optional, report = RouteParameter.Optional }
);

在我的控制器中,这两种方法:

[HttpGet]
[ActionName("methodone")]
public string MethodOne(string id, string type)
{
    return string.Empty;
}

[HttpGet]
[ActionName("methodtwo")]
public string MethodTwo(string directory, string report)
{
    return string.Empty;
}

这两个人似乎不能并存。如果我在 WebApiConfig 中注释掉 MethodOne 路由,则 MethodTwo 路由有效。评论 MethodTwo 路线允许 MethodOne 工作。不加注释,MethodOne 有效,但 MethodTwo 无效。

我希望对这两种方法都使用一条路线,然后似乎它们必须具有相同的参数名称。谁编写具有通用参数名称的方法?坏的。我真的不希望我的方法具有相同的参数名称(如 p1、p2、p3),所以我想我可以为新方法创建一个路由。但即使这样似乎也行不通。

我真的很想念WebGet(UriTemplate="")来自 WCF 的休息。

我有一个控制器,它有很多方法,有些有 1、2、3 甚至更多参数。我不敢相信我不能在 MapHttpRoute 方法中使用有意义的参数名称。

我可以完全注释掉这些东西并使用WebGet()……但在我到达那里之前,我想看看我是否遗漏了一些东西。

4

3 回答 3

17

您看到此问题的原因是您的第一个路由将匹配两个请求。URL 中的 id 和 type 标记将匹配两个请求,因为当路由运行时,它会尝试解析 URL 并将每个段与您的 URL 匹配。

因此,您的第一条路线将愉快地匹配两个请求,如下所示。

~/methodone/1/mytype => action = methodone, id = 1, and type = mytype
~/methodtwo/directory/report => action = methodtwo, id = directory, and type = report

要解决此问题,您应该使用类似的路线

config.Routes.MapHttpRoute(
    name: "MethodOne",
    routeTemplate: "api/{controller}/methodone/{id}/{type}",
    defaults: new { id = RouteParameter.Optional, type = RouteParameter.Optional }
);

config.Routes.MapHttpRoute(
    name: "MethodTwo",
    routeTemplate: "api/{controller}/methodtwo/{directory}/{report}",
    defaults: new { directory = RouteParameter.Optional, report = RouteParameter.Optional }
);

即使您使用 WebGet,您也可能需要做一些类似的事情来消除我认为的这两种方法的歧义。

于 2013-02-08T02:12:19.300 回答
4

您可以选择在查询字符串中传递参数,例如 /MethodTwo?directory=a&report=b,但如果您希望它们出现在路径中,这看起来是基于属性的路由的理想选择。Filip 在这里有一篇很棒的文章:

http://www.strathweb.com/2012/05/attribute-based-routing-in-asp-net-web-api/

于 2013-02-08T02:12:11.613 回答
4

来自http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection

您还可以提供约束,限制 URI 段如何匹配占位符:

constraints: new { id = @"\d+" } // 仅当 "id" 为一位或多位数字时才匹配。

将此约束添加到 "MethodOne" (api/{controller}/{action}/{id}/{type}) 意味着它仅在 {id} 是数字时才匹配数字,否则它将匹配 "MethodTwo" ("api /{controller}/{action}/{directory}/{report}”)。

于 2013-08-07T13:43:08.417 回答