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&param2=val2
  • url 路段参数必须存在于路由模板中。否则,活页夹不可能对它们做任何事情。

看来您遗漏了很多信息,请阅读此文档:Parameter Binding in ASP.NET Web API

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