我正在使用Web API 2,当URL以正斜杠结束时,我看到了意外的路由行为。我的Web API配置如下所示。
public void Configuration(IAppBuilder appBuilder)
{
HttpConfiguration webApiConfig = new HttpConfiguration();
webApiConfig.MapHttpAttributeRoutes();
webApiConfig.EnsureInitialized();
appBuilder.UseWebApi(webApiConfig);
}
在WebApp.Start()中,我传递了网址http://host:port/configuration
。
我有两条路线设置。
[Route("~/")]
public object GetResourcesList()
{
return new List<string>() { "Resource 1", "Resource 2", "Resource n" };
}
[Route("~/{resourceName}")]
public object GetResource(string resourceName)
{
return "Resource " + resourceName;
}
如果我向http://host:port/configuration/
发出GET请求,则会按预期调用GetResourceList()
。
如果我向http://host:port/configuration
发出GET请求(最后没有正斜杠),则调用GetResource()
并返回“资源配置”。我希望通过电话GetResourceList()
。
为什么在第二个例子中调用GetResource()
?当WebApp.Start应该在http://host:port/configuration
而不是http://host:port
上监听时,为什么它会将配置作为resourceName传递?
我还分别为[Route("")]
和[Route("{resourceName}")]
尝试了GetResourceList()
和GetResource()
,并看到了同样的行为。
感谢您的帮助。
修改
我也试着听http://host:port/configuration/
(最后用斜线)。行为没有区别。
答案 0 :(得分:1)
我还没有弄乱OWIN自托管的东西,但我的猜测是它正在监听你提供的URI,但仍然传递整个网址,即路径路线选择与您提供的URI无关。
我会从
更改您的属性路线[Route("~/")]
和
[Route("~/{resourceName}")]
到
[Route("configuration")]
和
[Route("configuration/{resourceName}")]
或使用
的路由前缀[RoutePrefix("configuration")]