【问题标题】:Wildcard in WebAPI Route templateWebAPI 路由模板中的通配符
【发布时间】:2013-11-01 11:11:31
【问题描述】:

我已经设置了路线模板:

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}/{*wildcard}",
        defaults: new { id = RouteParameter.Optional }
        );

控制器的动作签名:

public IEnumerable<object> Get(Int64 id,string abc)

我尝试将它与 URL http://mymachine.com/api/Individuals/1?abc=4 匹配,但它给了我一个例外

{"$id":"1","Message":"有一个错误 发生。","ExceptionMessage":"对象引用未设置为实例 一个 对象。","ExceptionType":"System.NullReferenceException","StackTrace":" 在 System.Web.Http.ValueProviders.Providers.RouteDataValueProvider.d__4.MoveNext()\r\n

奇怪的是,http://mymachine.com/api/Individuals?id=1&abc=4 确实与控制器、动作和参数匹配。

我认为“api/{controller}/{id}/{*wildcard}”的“{id}”会起作用。

为什么?

【问题讨论】:

  • 你不能有可选参数然后是非可选参数!此外,如果您将 abc 作为查询字符串传递,那么您不需要在路由中包含它!如果我在你的位置,我会重做我的路线......考虑一下

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


【解决方案1】:

通配符将告诉路由引擎将 URI 的其余部分与路由参数匹配(例如,请参阅“按出版日期获取图书”部分 in this article)。

这并不意味着将任意命名变量与任何参数匹配 - 这是 WebApi 默认情况下对查询字符串上的项目所做的事情,而不管您的路由配置如何(因此您的第二个 URI 工作的原因 - 它不匹配任何路由)。

它与您的路由中的 {id} 不匹配,因为它需要一个名为 {wildcard} 的参数,该参数未标记为可选。

为了说明,如果您只是将 'wildcard' 更改为 'abc':

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}/{*abc}",
    defaults: new {id = RouteParameter.Optional});

那么它将成功匹配以下 URI:

http://mymachine.com/api/Individual/1/a/b/c

使用值id=1, abc=a/b/c

要修复,只需从您的路线中删除通配符,使其看起来像这样:

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

【讨论】:

    【解决方案2】:

    gooid 的回答是正确的。我只想回答问题的第二部分:

    奇怪的是,http://mymachine.com/api/Individuals?id=1&abc=4 确实与控制器、动作和参数匹配。

    由于你有 id = RouteParameter.Optional,如果路由不提供 id,它仍然匹配路由模板。 占位符 {*wildcard} 查找路由的其余部分,并将其放入“通配符”键下的路由字典中。在这种情况下,它是空字符串(或 null)。

    请记住,查询参数也会进入路由字典。因此,您的路线字典将是: {“id”:“1”,“abc”:“4”,“通配符”:“”}

    欲了解更多信息,您可以查看http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

    【讨论】:

      猜你喜欢
      • 2016-07-03
      • 2015-07-17
      • 2017-08-05
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 2017-07-17
      • 1970-01-01
      • 2014-12-01
      相关资源
      最近更新 更多