【问题标题】:WebAPI route 404's when there is a trailing space in the URL当 URL 中有尾随空格时,WebAPI 路由 404
【发布时间】: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。

【问题讨论】:

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


    【解决方案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" />
    

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

    同样在 SO:

    【讨论】:

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