WebAPI路由中的通配符参数匹配不应该的位置

时间:2016-03-17 12:26:27

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

我有一个小的ASP.NET WebAPI应用程序,我设置的唯一路径如下:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{*furtherpath}"
);

我有以下控制器:

public class FoldersController : ApiController {
    public string GetThis(DateTime queryStringDate) {
        return "abc";
    }

    public bool GetThat(string furtherpath) {
        return "xyz";
    }
}

当我尝试发出此请求时,我收到500内部服务器错误,因为它匹配这两个方法操作:

GET http://[server]/api/folders?queryStringDate=2015-02-11%2000:00:00

现在我认为这会明确地与GetThis匹配,因为请求的网址末尾没有包含{controller}{*furtherpath}以及{{1}的斜杠未标记为可选参数。为什么此请求对WebAPI不明确?如何告诉WebAPI furtherpath之后缺少斜杠意味着此请求应与folders匹配?

2 个答案:

答案 0 :(得分:2)

我认为问题在于两种方法都匹配路线。 <form method='POST'> <input type="hidden" name="_method" value="PUT" /> <!-- Other Fields --> </form> 被视为furtherpath方法根本不使用的参数。

在这里使用属性路由真的会受益匪浅。用它来注册您的路线:

GetThis

然后用路线装饰你的方法:

config.MapAttributeRoutes();

这样可以更精细地控制您的路线。

@ luca-ghersi提供的link也非常有用。

答案 1 :(得分:0)

如果你拿出&#34; Furtherpath&#34;从路由配置,路由将由您的变量名称引导。

config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/");

GET http://[server]/api/folders?queryStringDate=2015-02-11%2000:00:00
GET http://[server]/api/folders?furtherpath=2015-02-11%2000:00:00