4

我基本上有一个开箱即用的 MVC 5.2 应用程序,启用了基于属性的路由(routes.MapMvcAttributeRoutes();从提供的RouteConfig.RegisterRoutes(RouteCollection routes)方法调用)。

以下是在 HomeController 中:

    [Route("hello.txt")]
    [Route("hellotxt-testing")]
    public ActionResult ShowFile()
    {
        return Content("Hello world");
    }

我可以成功访问/hellotxt-testing(证明基于属性的路由工作正常):

访问 /hellotxt-testing

但是如果我访问,我会得到一个 404 页面/hello.txt

访问 /hello.txt

与我去的时候相比/hello404,我得到一个不同的 404 页面:

访问 /hello404

我猜第二个 404 页面来自 ASP.NET,而第一个来自 IIS,它甚至没有将请求传递给 ASP.NET?

我该怎么做才能确保我可以确保 ASP.NET 获得这些带有句点的 URL?是否还有其他“特殊”字符也会导致问题?

4

2 回答 2

10

您看到的错误之间的区别是因为当您尝试访问/hello.txtIIS 时尝试访问位于服务器上的静态资源文件,另一方面/hello404只是未知路由,因此会抛出 404。

为确保我是正确的,请尝试在末尾添加斜杠并访问/hello.txt/,您现在应该会收到 404 错误。

有几种方法可以解决这个问题:

首先你可以试试

<modules runAllManagedModulesForAllRequests="true">

但是这个称为 RAMMFAR 的选项会损害 Web 应用程序的性能。并有其他后果。

其次,您可以为 IIS URL REWRITE 创建规则,以始终在每个传入 URL 中添加斜杠

第三次在 URL 中使用Dots 会导致 404 与 ASP.NET mvc 和 IIS

<add name="ApiURIs-ISAPI-Integrated-4.0"
     path="/people/*"
     verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
     type="System.Web.Handlers.TransferRequestHandler"
     preCondition="integratedMode,runtimeVersionv4.0" />

但你不喜欢这样。

第四次尝试创建自定义 http 处理程序以向本主题中的所有请求添加斜杠 在每个 url 的末尾添加斜杠?


如果您需要它在应用程序的许多地方工作,我会选择第二种选择。

但我认为最好的是第三个。这种带点的 url 对用户不友好,并且违反了 SEO 规则。您应该在公开的网站上避免使用它们。所以假设你只需要一个控制器和路由这个选项是最快和最干净的一个。

于 2015-02-24T10:28:53.063 回答
0

我们遇到了同样的问题(尽管不是属性路由),它开始出现在 MVC 4 中,并在此后的每个版本中继续存在。

我们项目的一位贡献者发现了解决方案。恐怕我无法解释原因,但是UrlRoutingModule在使用带有 a 的路由时,删除然后替换修复了 404 问题.

<configuration>
    <system.webServer>
        <modules>
            <remove name="UrlRoutingModule-4.0" />
            <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
        </modules>
    </system.webServer>
</configuration>

这是大约 2 年前发现的,到目前为止,我们还没有遇到这种变化造成的任何负面影响。

顺便说一句 - 如果有人解释为什么会这样,请分享。

于 2015-02-24T18:44:03.307 回答