我有一个Web API项目,其中包含以下端点:
GET api/search/{searchValue}
控制器代码:
[RoutePrefix("api/Search")]
public class SearchController : ApiController
{
[HttpGet]
[Route("{searchValue}", Name = "GenericSearch")]
[ResponseType(typeof(SearchResponse))]
public async Task<IHttpActionResult> Search(string searchValue) {
...
}
}
这适用于大多数搜索字符串。但是如果搜索字符串以句点(.
)字符结尾,则请求会以404结尾;它似乎将句点解释为路径的一部分而不是查询的一部分。即使请求字符串是Url编码的,例如
api/search/foo%2E
如果句点不是字符串的最后一个字符,则可以:
api/search/foo%2Ebar
将正确搜索“foo.bar”。
如何解决此问题,以便允许用户搜索以句点字符结尾的字符串?
更新:在将此问题作为this question的副本关闭后,请允许我澄清为什么这个问题有所不同:
.
编码为%2E
,而仍无效。<modules runAllManagedModulesForAllRequests="true" />
(根据web.config
accepted answer的建议。api\search\foo%2E\
)对查询进行后缀,如highest-voted answer中所述;这没什么区别。答案 0 :(得分:3)
更新:
我没有提到以下内容也被添加到我的网络配置文件中,以允许这段时间不会导致IIS中断。
<system.web>
<httpRuntime targetFramework="4.5" sendCacheControlHeader="true" relaxedUrlToFileSystemMapping="true" />
<!-- ...other code removed for brevity -->
</system.web>
主要relaxedUrlToFileSystemMapping="true"
,指示HTTP请求中的URL是否必须是有效的Windows文件路径。
HttpRuntimeSection.RelaxedUrlToFileSystemMapping Property
RelaxedUrlToFileSystemMapping属性确定URL的方式 传入的HTTP请求将被验证。如果此属性为false, 通过使用确定是否相同的规则来验证URL Windows文件系统路径有效。
ORIGINAL
使用路由模板{*searchValue}
中的catch all参数,我能够获得控制器操作以匹配具有路由前缀api/search
的请求,并按预期返回。即使是以句点(.
)结尾的值,也可以是URL编码。
[RoutePrefix("api/search")]
public class SearchController : ApiController {
[HttpGet]
[Route("{*searchValue}", Name = "GenericSearch")] // Matches GET api/Seach/{anything here}
[ResponseType(typeof(SearchResponse))]
public async Task<IHttpActionResult> Search(string searchValue) {
//...
}
}