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作为查询字符串传递,则不需要将其包含在路由中!如果我在您的位置,我将重做路由…请考虑一下