WebAPI路由模板中的通配符/{*wildcard}",默认值:new{id=RouteParameter.Optional});控制器的动作签名:publicIEnumerableGet(Int64id,stringabc)我尝试将它与URLhttp://mymachine.com/api/Individuals/1?abc=4匹配使用,但它给了我一个例外{"$id":"1","Message":"发生错误。","ExceptionMessage":"对象引用未设置到对象实例。","ExceptionType":"System.NullReferenceException","StackTrace":"atSystem.Web.Http.ValueProviders.Providers.RouteDataValueProvider.d__4.MoveNext()rn奇怪的是,http://mymachine.com/api/Individuals?id=1&abc=4确实匹配控制器、操作和参数。我认为“{id}"的"api/{controller}/{id}/{*wildcard}"将起作用。为什么?通配符将告诉路由引擎将URI的其余部分与路由参数匹配(例如,参见“GetBooksby本文的“发布日期”部分)。这并不意味着将任意命名变量与任何参数匹配-它是WebApi默认情况下使用查询字符串上的项目,而不管你的路由配置如何(因此你的第二个URI起作用的原因-它不起作用t匹配任何路线)。它与您路由中的{id}不匹配,因为它期望名为{wildcard}的参数未标记为可选。为了说明,如果您只是将“通配符”更改为“abc”:id=RouteParameter.Optional});然后就会成功匹配到如下URI:http://mymachine.com/api/Individual/1/a/b/cvalueid=1,abc=a/b/ctofix,把路由中的通配符去掉即可所以它看起来像这样:config.Routes.MapHttpRoute(name:"DefaultApi",routeTemplate:"api/{controller}/{id}",defaults:new{id=RouteParameter.Optional});gooid的回答是正确的。我只想回答问题的第二部分:奇怪的是,http://mymachine.com/api/Individuals?id=1&abc=4确实匹配控制器、动作和参数。因为你有id=RouteParameter.Optional,如果路由没有提供id,它仍然匹配路由模板。占位符{*wildcard}查找路由的其余部分并将其放入“通配符”键下的路由字典中。在这种情况下,它是空字符串(或null)。请记住,查询参数也会进入路径字典。所以你的路由字典将是:{"id":"1","abc":"4","wildcard":""}有关更多信息,请访问http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api以上就是C#学习教程:WebAPI路由模板中通配符分享的全部内容,如果对大家有用需要的了解更多C#学习教程,希望大家多加关注-本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
