【问题标题】:How to send a query string that ends in a period character?如何发送以句点字符结尾的查询字符串?
【发布时间】:2017-05-22 09:07:54
【问题描述】:

我有一个 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. 我已经有&lt;modules runAllManagedModulesForAllRequests="true" /&gt;(正如我的web.config 中的accepted answer 所建议的那样。
  4. 我尝试按照highest-voted answer 中的建议为查询添加斜杠字符(即api\search\foo%2E\)后缀;这没什么区别。
  5. 我尝试了那里建议的所有答案,但都没有任何作用。

【问题讨论】:

  • 我总是想知道为什么我需要进行谷歌搜索... ;)
  • @PatrickHofman,触发太快了。这不是同一个问题。
  • 那么你应该编辑问题并解释它。你知道盒子会告诉你这样做。据我所知。这是一个经典问题。
  • 你能显示你的代码/路线吗?
  • @PatrickHofman 添加了控制器代码。

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


【解决方案1】:

更新:

我没有提到以下内容也添加到了我的 web 配置文件中,以允许该时间段不会导致 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 请求将被验证。如果此属性为假, URL 是通过使用相同的规则来验证的,这些规则确定一个 Windows 文件系统路径有效。


原创

使用路由模板{*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) {
        //...
    }
}

【讨论】:

  • 不错的尝试,但没有成功... :-( 在将 * 添加到 Route 之前,您能重现问题吗?
  • @ShaulBehr 检查更新的答案。忘记了网络配置中的设置。
  • @ShaulBehr,是的,我完全忘记了原始答案中的设置。再次测试它,它也可以在没有包罗万象的情况下工作 (*)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 2012-05-12
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多