Val*_*roM 9 c# asp.net asp.net-mvc asp.net-web-api
我已经设置了一个路由模板:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}/{*wildcard}",
defaults: new { id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
控制器的动作签名:
public IEnumerable<object> Get(Int64 id,string abc)
Run Code Online (Sandbox Code Playgroud)
我尝试将其与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/{控制器}/{ID}/{*}通配符"将起作用.
为什么?
goo*_*oid 12
通配符将告诉路由引擎到URI的其他部分相匹配的路由参数(例如,请参阅"获取书籍出版日期"一节本文中).
它并不意味着将任何任意命名变量与任何参数匹配 - 这是WebApi默认使用查询字符串上的项目而不管您的路由配置(因此您为什么第二个URI工作 - 它与任何路由不匹配).
它{id}在您的路线中不匹配,因为它期望一个被称为{wildcard}未被标记为可选的参数.
为了说明,如果您只是将"通配符"更改为"abc":
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}/{*abc}",
defaults: new {id = RouteParameter.Optional});
Run Code Online (Sandbox Code Playgroud)
然后它将成功匹配以下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});
Run Code Online (Sandbox Code Playgroud)
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
| 归档时间: |
|
| 查看次数: |
19181 次 |
| 最近记录: |