当 URL 中有尾随空格时,WebAPI 路由 404

Posted

技术标签:

【中文标题】当 URL 中有尾随空格时,WebAPI 路由 404【英文标题】:WebAPI route 404's when there is a trailing space in the URL 【发布时间】:2012-11-04 13:39:19 【问题描述】:

使用默认的 web api 路由

config.Routes.MapHttpRoute(
            name: "API Default",
            routeTemplate: "api/controller/id",
            defaults: new
                      
                          id = RouteParameter.Optional
                      
            );

还有一个控制器

public class TestController : ApiController

    [HttpGet]
    public HttpResponseMessage Get(string id)
    
        return Request.CreateResponse(HttpStatusCode.OK, id);
    

'api/test/1'的请求

返回1

如果由于某种原因您向'api/test/1%20' 发送请求

404 路线。

现在这个例子可能看起来很傻,因为浏览器会修剪尾随空格,但是

对于像'api/controller/id/extrastuff'这样的路由

'1 ' 中的空格将转换为'1%20',请求将在找不到路由上出现 404。

【问题讨论】:

【参考方案1】:

将此添加到处理程序

      <add name="ExtensionlessUrlHandler-Integrated-4.0-ForApi"
     path="api/*"
     verb="*"
     type="System.Web.Handlers.TransferRequestHandler"
     preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

【讨论】:

这就像一个魅力。我的问题是我需要下载一个将文件名作为 URL 最后一部分传递的文件。 https://mywebsite/api/download/getfile/filename【参考方案2】:

您的问题与 WebAPI 本身无关,而是 Asp.Net 如何处理某些特定的 url。 而 Asp.Net 以非常偏执的方式处理这些 url,所以你需要告诉它to relax。

将此行添加到 system.web 下的 web.config 中:

<httpRuntime relaxedUrlToFileSystemMapping="true" />

您可以阅读有关此主题的更多信息:

Putting the Con (COM1, LPT1, NUL, etc.) Back in your URLs

同样在 SO:

"The resource cannot be found." error when there is a "dot" at the end of the url Problem with a URL that ends with %20(它描述了不同的上下文,所以我认为这不是真正的重复)

【讨论】:

当 mvc 的一个巨大优势是不让 url 与文件系统相关时,路由 mvc 引擎默认将此设置为 false 似乎很愚蠢。 这不是路由引擎的决定,它的核心是 ASP.NET,它保护基于它构建的所有内容。因此请注意,如果您更改此设置,您将在此时放宽应用程序下所有内容的规则。 这只会在我添加应用程序后立即崩溃 此修复有所帮助,但我仍然遇到一些问题。对于采用字符串用户名的 webapi 端点,我们得到以下结果: 有效的案例:abcd-。 A B C D@。 A B C D。 abcd@ 不起作用的情况:abcd.- abcd.-@ abcd-。 abcd.@ abcd-@. 您的评论仍然可以帮助人们解决同样的问题

以上是关于当 URL 中有尾随空格时,WebAPI 路由 404的主要内容,如果未能解决你的问题,请参考以下文章

UIlabel尾随空格不起作用

让 Git 在提交前自动删除尾随空格

如何使用 SkiaSharp 测量尾随空格?

在 Xcode 中修剪尾随空格

在 SQL Server 的列中删除尾随空格和更新

WCF Rest 4.0 中没有斜杠的简单 URL 路由