如何发送以句点字符结尾的查询字符串?

时间:2017-05-22 09:07:55

标签: c# asp.net-web-api asp.net-web-api-routing

我有一个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的副本关闭后,请允许我澄清为什么这个问题有所不同:

  1. 链接的问题是尝试在查询字符串中使用文字句点字符。我甚至不这样做;我将.编码为%2E,而无效。
  2. 查询使用中间的句点字符。只有当它在查询字符串的末尾才会失败。
  3. 我已经<modules runAllManagedModulesForAllRequests="true" />(根据web.config accepted answer的建议。
  4. 我尝试使用斜杠字符(即api\search\foo%2E\)对查询进行后缀,如highest-voted answer中所述;这没什么区别。
  5. 我尝试了那里建议的所有答案,但没有一个能有所作为。

1 个答案:

答案 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) {
        //...
    }
}