C# WebAPI路由模板中的通配符
我已设置路线模板:C# WebAPI路由模板中的通配符,c#,asp.net,asp.net-mvc,asp.net-web-api,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 } ); 控制器的动作签名: public IEnumerable<object> Get(Int64
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}/{*wildcard}",
defaults: new { id = RouteParameter.Optional }
);
控制器的动作签名:
public IEnumerable<object> Get(Int64 id,string abc)
公共IEnumerable Get(Int64 id,字符串abc)
我试图将它与URL匹配,但它给了我一个例外
{“$id”:“1”,“消息”:“出现错误”
发生。“,“ExceptionMessage”:“对象引用未设置为实例
属于
对象“”,“ExceptionType”:“System.NullReferenceException”,“StackTrace”:
在
System.Web.Http.ValueProviders.Providers.RoutedDataValueProvider.d\uu 4.MoveNext()\r\n
奇怪的是,它与控制器、动作和参数匹配
我认为“api/{controller}/{id}/{*wildcard}”中的“{id}”会起作用
为什么?通配符将告诉路由引擎将URI的其余部分与路由参数匹配(例如,请参阅“按出版日期获取书籍”部分) 这并不意味着将任何任意命名变量与任何参数进行匹配-这是WebApi在默认情况下对querystring上的项所做的操作,而不管您的路由配置如何(因此,第二个URI工作的原因是-它与任何路由都不匹配) 它与路由中的
{id}
不匹配,因为它需要一个名为{wildcard}
的参数,该参数未标记为可选
举例来说,如果您只是将“通配符”更改为“abc”:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}/{*abc}",
defaults: new {id = RouteParameter.Optional});
然后它将成功匹配以下URI:
值为id=1,abc=a/b/c
要修复此问题,只需从路由中删除通配符,使其看起来如下所示:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new {id = RouteParameter.Optional});
gooid的回答是正确的。我只想回答问题的第二部分: 奇怪的是,它与控制器、动作和参数匹配 由于id=RouteParameter.Optional,如果路由不提供id,它仍然与路由模板匹配。 占位符{*通配符}查找路由的其余部分,并将其放入密钥“通配符”下的路由字典中。在这种情况下,它是空字符串(或null) 请记住,查询参数也会进入路由字典。因此,您的路由字典将是: {“id”:“1”、“abc”:“4”、“通配符”:“}
有关更多信息,您可以查看您不能有可选参数,而不能有非可选参数!此外,如果您将abc作为查询字符串传递,则不需要将其包含在路由中!如果我在您的位置,我将重做路由…请考虑一下