URL 以正斜杠结尾时出现意外的 Web API 路由
本文关键字:意外 Web 路由 API 结尾 URL | 更新日期: 2023-09-27 18:32:48
我正在使用 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;
}
如果我发出 GET 请求http://host:port/configuration/
它会按预期调用GetResourceList()
。
如果我向http://host:port/configuration
发出GET请求(末尾没有正斜杠),它会调用GetResource()
并返回"资源配置"。我希望它能GetResourceList()
电话.
为什么它会在第二个示例中调用GetResource()
?为什么当 WebApp.Start 应该侦听 http://host:port/configuration
而不是http://host:port
时,它会将配置作为资源名称传递?
我还分别针对GetResourceList()
和GetResource()
尝试了[Route("")]
和[Route("{resourceName}")]
,并看到了相同的行为。
感谢您的帮助。
编辑
我也只是尝试收听http://host:port/configuration/
(末尾有一个斜杠)。行为没有差异。
我没有
弄乱 OWIN 自托管的东西,但我的猜测是它正在侦听您提供的 URI,但仍传入整个 URL,即路由拾取的路径不相对于您提供的 URI。
我会将您的属性路由从
[Route("~/")]
和
[Route("~/{resourceName}")]
自
[Route("configuration")]
和
[Route("configuration/{resourceName}")]
或使用路由前缀
[RoutePrefix("configuration")]