Web API路由和查询字符串

时间:2016-05-17 18:20:06

标签: asp.net-mvc asp.net-web-api

我正在玩Web API和MVC路由。我注意到一些我觉得很奇怪的东西。当您使用route属性时,框架不太宽容。您会注意到,当id是路径时,第一部分中的Get方法失败,并且它必须是查询字符串的一部分。但是在第二部分中,它将id作为任一个。我原以为第一部分中的代码表现得像第二部分中的代码。据我所知,MVC框架将尝试路由流量,如果必须,则从查询字符串中获取值,这是代码的第二部分正在进行的操作。显然,当您使用route属性时,它不会这样做。有人可以解释一下吗?

---------------------第一部分(具有Route属性的代码)

WebApiConfig.cs

    config.Routes.MapHttpRoute("DefualtRouting", 
                               "api/{controller}/{id}", 
                               new { id = RouteParameter.Optional });

TestController.cs

[Route("api/test/")] //(notice routing attribute)
public IHttpActionResult Get(string id)
{
    return Ok();
}

以下是我定位这些网址时所获得的内容

  • localhost:43321 / api / Test / 1 - 这会返回404
  • localhost:43321 / api / Test?id = 1 - 此作品

---------------------第二部分(没有Route属性的代码) WebApiConfig.cs

    config.Routes.MapHttpRoute("DefualtRouting", 
                               "api/{controller}/{id}", 
                               new { id = RouteParameter.Optional });

TestController.cs

public IHttpActionResult Get(string id)
{
    return Ok();
}

以下是我定位这些网址时所获得的内容

  • localhost:43321 / api / Test / 1 - 此作品
  • localhost:43321 / api / Test?id = 1 - 此作品

1 个答案:

答案 0 :(得分:0)

也许我很困惑。但您的属性应如下所示:

[Route("api/test/{id}")] //(notice routing attribute)
public IHttpActionResult Get(string id)
{
    return Ok();
}

您还可以在WebApiConfig.cs中使用属性路由和配置路由。或者这只是你的后备?

我只使用其中一种。

如果您尝试将ID设为可选,我认为您可以这样做:

[Route("api/test/{id:string?}")] //(notice routing attribute)
public IHttpActionResult Get(string id)
{
    return Ok();
}

供参考,请参阅: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#optional