WebApi路由问题 - 无法路由到所需的操作

时间:2015-06-01 10:33:24

标签: routes asp.net-web-api2

我已经从这里使用了所选答案: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文档,但我似乎在某处遗漏了某些东西。谁能看到我出错的地方?

1 个答案:

答案 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能够调用你感兴趣的动作。

所以,请记住:

  • 命名参数必须使用正确的查询字符串语法在url查询字符串中传递,即:?param1=val1&param2=val2
  • url段参数必须存在于路由模板中。如果没有,那么活页夹就不可能对它们做任何事情了。

因为看起来你错过了很多信息,请阅读此文档:Parameter Binding in ASP.NET Web API

这对您来说也很有意思:Attribute Routing in ASP.NET Web API 2,它允许您使用路由属性,这比路由模板更灵活。