我已经从这里使用了所选答案: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文档,但我似乎在某处遗漏了某些东西。谁能看到我出错的地方?
答案 0 :(得分:2)
您有几个错误(并且您没有显示所有相关代码,或者您正在显示错误代码,如下所述,与路径模板中的id
相关。)
localhost:60819/api/products/id=33 //doesn't work
这永远不会奏效。如果要在URL中传递命名参数,则必须使用查询字符串,即代替/id=33
,而不是?id=33
localhost:60819/api/products/33 //does work
根据您显示的路线,这不起作用。只有在tyour route模板中定义这些参数时,才能将参数作为URL段传递。您的路由模板应如下所示:api/{controller}/{id}
以便可以从网址中恢复id
,并且第二个网址确实有效。
http://localhost:60819/api/products/isbn=9781408845240
与第二个相同。使用?isbn=9781408845240
http://localhost:60819/api/products/testString
这只会将testString
映射到路径模板中的参数。你需要这样的东西:isbn=textString
能够调用你感兴趣的动作。
所以,请记住:
?param1=val1¶m2=val2
因为看起来你错过了很多信息,请阅读此文档:Parameter Binding in ASP.NET Web API。
这对您来说也很有意思:Attribute Routing in ASP.NET Web API 2,它允许您使用路由属性,这比路由模板更灵活。