c# – 使用属性路由时查询字符串不工作

我使用System.Web.Http.RouteAttribute和System.Web.Http.RoutePrefixAttribute为我的Web API 2应用程序启用更清晰的URL。对于我的大多数请求,我可以使用路由(例如Controller / param1 / param2)或者我可以使用查询字符串(例如Controller?param1 = bob& param2 = mary)。

不幸的是,使用我的一个控制器(而且只有一个),这失败。这里是我的控制器:

[RoutePrefix("1/Names")]
public class NamesController : ApiController
{

    [HttpGet]
    [Route("{name}/{sport}/{drink}")]
    public List<int> Get(string name, string sport, string drink)
    {
        // Code removed...
    }

    [HttpGet]
    [Route("{name}/{drink}")]
    public List<int> Get(string name, string drink)
    {
        // Code removed...
    }
}

当我请求使用路由,两个工作正常。但是,如果我使用查询字符串,它失败,告诉我该路径不存在。

我试过添加以下到我的WebApiConfig.cs类’注册(HttpConfiguration配置)功能(默认路由之前和之后),但它没有什么:

config.Routes.MapHttpRoute(
name: "NameRoute",
routeTemplate: "{verId}/Names/{name}/{sport}/{drink}",
defaults: new { name = RouteParameter.Optional, sport = RouteParameter.Optional, drink = RouteParameter.Optional },
constraints: new { verId = @"\d+" });

为了清楚起见,我希望能够这样做:

localhost:12345/1/Names/Ted/rugby/coke
localhost:12345/1/Names/Ted/coke

和,

localhost:12345/1/Names?name=Ted&sport=rugby&drink=coke
localhost:12345/1/Names?name=Ted&drink=coke

但可悲的是查询字符串版本不工作! 🙁

更新

我已经删除了第二个Action,现在试图使用可选参数的单个Action。我改变了我的route属性为[Route(“{name} / {drink} / {sport?}”)]作为托尼建议使体育nullable,但现在防止localhost:12345/1 / Names / Ted / coke从某种原因是一条有效的路线。查询字符串的行为方式与之前相同。

更新2
我现在在我的控制器有一个奇怪的动作:

[RoutePrefix("1/Names")]
public class NamesController : ApiController
{

    [HttpGet]
    [Route("{name}/{drink}/{sport?}")]
    public List<int> Get(string name, string drink, string sport = "")
    {
        // Code removed...
    }
}

但仍然,使用查询字符串没有找到合适的路径,而使用路由方法。

经过多次艰难的fiddling和谷歌,我想出了一个“修复”。我不知道这是否是理想/最佳实践/普通老错了,但它解决了我的问题。

我所做的是添加[Route(“”)]除了我已经使用的路由属性。这基本上允许Web API 2路由允许查询字符串,因为这是一个有效的路由。

现在的例子是:

[HttpGet]
[Route("")]
[Route("{name}/{drink}/{sport?}")]
public List<int> Get(string name, string drink, string sport = "")
{
    // Code removed...
}

这使得localhost:12345/1 / Names / Ted / coke和localhost:12345/1 / Names?name = Ted& drink = coke有效。

http://stackoverflow.com/questions/22642874/query-string-not-working-while-using-attribute-routing

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 使用属性路由时查询字符串不工作