WebApi 路由问题 - 无法路由到所需的操作
WebApi Routing issue - unable to route to required action
我使用了此处选择的答案:Routing based on query string parameter name 来构建我的路线,但它们没有按预期工作:
我的路线:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}",
defaults: new { controller = "Products" }
);
我的操作:
public string GetProductById(int id) {}
public string GetProductByIsbn(string isbn) {}
我正在尝试通过以下方式调用它们:
localhost:60819/api/products/id=33 //doesn't work
localhost:60819/api/products/33 //does work
和
http://localhost:60819/api/products/isbn=9781408845240 //doesn't work
http://localhost:60819/api/products/testString //test with a definite string - doesn't work - still tries to use GetProductById(int id)
两个都不起作用的错误是相同的:
<Error><Message>The request is invalid.</Message>
<MessageDetail>
The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.String GetProductById(Int32)' in 'BB_WebApi.Controllers.ProductsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
</MessageDetail>
</Error>
似乎认为没有传入 id...?
我已经阅读了所有的 msdn 文档,但我似乎在某处遗漏了一些东西。谁能看出我哪里出错了?
你有几个错误(你没有显示所有相关代码,或者你显示了错误的代码,如下所述,与路由模板中的 id
相关)。
localhost:60819/api/products/id=33 //doesn't work
这永远行不通。如果你想在 URL 中传递命名参数,你必须使用查询字符串,即,而不是 /id=33
,你需要使用 ?id=33
localhost:60819/api/products/33 //does work
对于您显示的路线,这是行不通的。仅当您在路由模板中定义这些参数时,才可以将参数作为 URL 段传递。你的路线模板应该是这样的:api/{controller}/{id}
这样 id
就可以从 url 中恢复过来,而这第二个 URL 确实有效。
http://localhost:60819/api/products/isbn=9781408845240
同第二个。使用 ?isbn=9781408845240
http://localhost:60819/api/products/testString
这只会将 testString
映射到路由模板中的参数。您需要这样的东西:isbn=textString
才能调用您感兴趣的操作。
所以,记住这一点:
- 命名参数必须在 url 查询字符串中传递,使用正确的查询字符串语法,即:
?param1=val1¶m2=val2
- url 路段参数必须存在于路由模板中。否则,活页夹不可能对它们做任何事情。
看来您遗漏了很多信息,请阅读此文档:Parameter Binding in ASP.NET Web API。
这对您来说也很有趣:Attribute Routing in ASP.NET Web API 2,它允许您使用比路由模板灵活得多的路由属性。
我使用了此处选择的答案:Routing based on query string parameter name 来构建我的路线,但它们没有按预期工作:
我的路线:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}",
defaults: new { controller = "Products" }
);
我的操作:
public string GetProductById(int id) {}
public string GetProductByIsbn(string isbn) {}
我正在尝试通过以下方式调用它们:
localhost:60819/api/products/id=33 //doesn't work
localhost:60819/api/products/33 //does work
和
http://localhost:60819/api/products/isbn=9781408845240 //doesn't work
http://localhost:60819/api/products/testString //test with a definite string - doesn't work - still tries to use GetProductById(int id)
两个都不起作用的错误是相同的:
<Error><Message>The request is invalid.</Message>
<MessageDetail>
The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.String GetProductById(Int32)' in 'BB_WebApi.Controllers.ProductsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
</MessageDetail>
</Error>
似乎认为没有传入 id...?
我已经阅读了所有的 msdn 文档,但我似乎在某处遗漏了一些东西。谁能看出我哪里出错了?
你有几个错误(你没有显示所有相关代码,或者你显示了错误的代码,如下所述,与路由模板中的 id
相关)。
localhost:60819/api/products/id=33 //doesn't work
这永远行不通。如果你想在 URL 中传递命名参数,你必须使用查询字符串,即,而不是 /id=33
,你需要使用 ?id=33
localhost:60819/api/products/33 //does work
对于您显示的路线,这是行不通的。仅当您在路由模板中定义这些参数时,才可以将参数作为 URL 段传递。你的路线模板应该是这样的:api/{controller}/{id}
这样 id
就可以从 url 中恢复过来,而这第二个 URL 确实有效。
http://localhost:60819/api/products/isbn=9781408845240
同第二个。使用 ?isbn=9781408845240
http://localhost:60819/api/products/testString
这只会将 testString
映射到路由模板中的参数。您需要这样的东西:isbn=textString
才能调用您感兴趣的操作。
所以,记住这一点:
- 命名参数必须在 url 查询字符串中传递,使用正确的查询字符串语法,即:
?param1=val1¶m2=val2
- url 路段参数必须存在于路由模板中。否则,活页夹不可能对它们做任何事情。
看来您遗漏了很多信息,请阅读此文档:Parameter Binding in ASP.NET Web API。
这对您来说也很有趣:Attribute Routing in ASP.NET Web API 2,它允许您使用比路由模板灵活得多的路由属性。