【发布时间】:2015-08-09 09:28:25
【问题描述】:
问题
使用 WebAPI,其中请求中的最终参数包含 句号 / 句号 / '.'
- 对于像
/api/values/dog.cat这样的“简单”路由,可以路由。 - 对于像
/api/values/mammal/dog.cat这样更复杂的路由,返回 404
我的问题是如何获得更复杂的工作路线?
背景
以下所有测试均使用从 Visual Studio WebAPI 模板创建的新项目。
我知道我的请求看起来有一个文件扩展名,所以已经设置:
<modules runAllManagedModulesForAllRequests="true">
所以在 StaticFile 处理程序没有找到该项目后,它会将其传递给托管处理程序。
如果我请求 /api/values/mamal/dog.cat/(带有斜杠),这可以正常工作,但不幸的是,我们被 API 合同困住了,我不能这样做。
.NET 版本
当面向 .NET4.0 并使用 Visual Studio WebAPI 模板时,更复杂的路由可以正常工作。
当面向 .NET4.5 时,使用默认 WebAPI 模板,更复杂的路由返回 404。
我们的一些生产代码在 .csproj 文件中以 .NET4.5 为目标,但在 web.config 中有 <compilation targetFramework="4.0"in(并且没有 <httpRuntime> 元素),并且似乎确实可以处理更复杂的路由,在最终参数。
两种情况
使用默认路由:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
还有一个对ValuesController 的简单操作:
public string Get(string id)
{
return string.Format("Param id: '{0}'", id);
}
请求/api/values/dog.cat,然后路由将带您执行操作。
现在更改路由以添加额外的类别参数:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{category}/{id}",
defaults: new { id = RouteParameter.Optional }
);
并修改ValuesController中的端点:
public string Get(string category, string id)
{
return string.Format("category: {0}, id: {1}", category, id);
}
请求/api/values/mamal/dog.cat,你会得到404 not found。
请求/api/values/mamal/dog.cat/并调用该操作。
其他 stackoverflow 问题
stackoverflow 上有各种类似的问题,它们的答案看起来像是解决了这个问题,但实际上并不相关(如果您想将此问题标记为重复问题!)。
例如:
此处理程序仅处理以句点结尾的请求,例如/api/values/dog.cat.,而不处理参数中的句点:
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
此外,以下映射仅关于允许保留字,而不是 URL 中的句点:
<httpRuntime relaxedUrlToFileSystemMapping="true" />
可能的解决方法
可以降级到 .NET4.0,这似乎可行。但不想这样做,因为使用了 async/await 功能。
我大概可以使用 IIS URL Rewrite 模块之类的东西来为缺少它的请求添加一个尾部斜杠,但我宁愿在理解绑定为什么“失败”的基础上找到一个解决方案。
【问题讨论】:
标签: asp.net-web-api asp.net-web-api-routing