【问题标题】:Wildcard parameter in WebAPI routing matching where it shouldn'tWebAPI 路由匹配中不应该匹配的通配符参数
【发布时间】:2016-07-03 19:12:52
【问题描述】:

我有一个小型 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,因为请求的 URL 不包含末尾的斜杠,它将分隔 {controller}{*furtherpath},并且 furtherpath 未标记为可选范围。为什么这个请求对 WebAPI 有歧义,我如何告诉 WebAPI folders 后面没有斜线意味着这个请求应该匹配 GetThis

【问题讨论】:

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


【解决方案1】:

我认为问题在于这两种方法都匹配路由。 furtherpath 被视为 GetThis 方法根本不使用的参数。

您将真正受益于在此处使用属性路由。使用它来注册您的路线:

config.MapAttributeRoutes();

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

public class FoldersController : ApiController 
{
    [HttpGet]
    [Route("api/folders/")]
    public string GetThis(DateTime queryStringDate) 
    {
        return "abc";
    }

    [HttpGet]
    [Route("api/folders/{furtherpath}")]
    public bool GetThat(string furtherpath) 
    {
        return "xyz";
    }
}

这将使您对路线进行更精细的控制。

@luca-ghersi 提供的link 也很有帮助。

【讨论】:

  • 但是furtherpath 没有被标记为可选参数,所以如果它是 not 我不明白为什么 GetThat 匹配(如果我注释掉 @ 987654329@方法,GetThat匹配furtherpath被设置为null
  • 是的,如果不写出代码和查看路由,我无法完全解释它,但请记住,Web Api 不会像查看路由那样查看方法的签名并将方法与路线相匹配。因为您的两种方法实际上仅在参数(和名称)上有所不同,所以会引起一些混乱。属性路由将为您解决这个问题。调试路由是 Web Api 中比较困难的部分之一。
  • 啊,我以为它考虑了方法参数。它可能应该。
  • 如果有就好了。属性路由是一种解决方法。
  • @Jez - / 中的 url 不是文字。它是一个段分隔符。由于最后一段是可选的,因此分隔符也是可选的。见URL Patterns on MSDN。请注意,使用 URL api/{controller}{*furtherpath} 是无效的(因为无法确定将 URL 的哪个部分放入每个段中),因此这种行为是有意义的。
【解决方案2】:

如果您从路由配置中取出“进一步路径”,则路由将由您的变量名称引导。

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

【讨论】:

  • 这不好,因为进一步路径必须是查询字符串。我希望它能够成为主要路径的一部分。
猜你喜欢
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 2020-04-19
  • 2012-12-31
  • 1970-01-01
相关资源
最近更新 更多