我在用着System.Web.Http.RouteAttribute
and System.Web.Http.RoutePrefixAttribute
为我的 Web API 2 应用程序启用更清晰的 URL。对于我的大多数请求,我可以使用路由(例如Controller/param1/param2
)或者我可以使用查询字符串(例如Controller?param1=bob¶m2=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
class' Register(HttpConfiguration config)
函数(在默认路由之前和之后),但它什么也没做:
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
and,
localhost:12345/1/Names?name=Ted&sport=rugby&drink=coke
localhost:12345/1/Names?name=Ted&drink=coke
但遗憾的是查询字符串版本不起作用! :(
Updated
我已经完全删除了第二个操作,现在尝试仅使用带有可选参数的单个操作。我已将路线属性更改为[Route("{name}/{drink}/{sport?}")]
正如托尼建议的那样让 sport 可以为空,但这现在阻止了localhost:12345/1/Names/Ted/coke
由于某种原因不再是一条有效的路线。查询字符串的行为方式与以前相同。
Update 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...
}
}
但是,使用查询字符串仍然找不到合适的路径,而使用路由方法却可以。