【问题标题】:How can I use MVC5 attribute-based routes with a dot/period in them?如何使用带有点/句点的基于 MVC5 属性的路由?
【发布时间】:2015-01-10 04:21:45
【问题描述】:

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

HomeController 中有以下内容:

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

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

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

与我转到 /hello404 时相比,我得到了不同的 404 页面:

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

如何确保我可以确保 ASP.NET 获取这些带有句点的 URL?是否还有其他“特殊”字符也会导致问题?

【问题讨论】:

  • 该修复实际上需要对每个可能包含句点的路径进行 web.config 修改。这对我来说似乎很疯狂,必须有更好的方法。 ASP.NET 已经有一个所有可能的 URL 模式的列表(路由表)。我原以为 ASP.NET 应该负责确保 IIS 通过这些(也许 ASP.NET 6 添加了这个?).. 但除此之外,是否有可能动态地做到这一点(例如,编写一个注册所有已知路由的处理程序IIS),或者是否存在阻止其工作的限制?
  • 你试过<httpRuntime relaxedUrlToFileSystemMapping="true"/>吗?
  • 我想我会很好奇为什么你会想要这个?除此之外,正如某人已经指定的那样,路由忽略静态路径(因此 IIS 可以执行诸如将图像和静态文件传递到浏览器之类的事情)。这几乎是一个特殊的情况,“忽略看起来像静态文件的东西”“路由”出现在 hello.txt 路由之前并首先解析。 @rexilion 的答案有很多选择。

标签: asp.net-mvc iis iis-8 attributerouting asp.net-mvc-5.2


【解决方案1】:

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

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

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

首先你可以试试

<modules runAllManagedModulesForAllRequests="true">

但此选项称为 RAMMFAR hurts the performance of web application. 并有其他后果。

第二你可以为 IIS URL REWRITE 创建规则到always add trailing slash to each incoming URL's

第三Dots in URL causes 404 with ASP.NET mvc and 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 处理程序以向所有请求添加斜杠,如本主题 Add a trailing slash at the end of each url?


如果您需要在应用程序的许多地方使用它,我会选择 second 选项。

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

【讨论】:

    【解决方案2】:

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

    我们项目的一位贡献者发现了解决方案。恐怕我无法解释原因,但是在使用带有. 的路由时,删除然后替换UrlRoutingModule 可以解决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 年前发现的,到目前为止,我们还没有遇到任何由此变化造成的负面影响。

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

    【讨论】:

    • 从外观上看,您的“add”指令忽略了模块仅在“managedHandler”上下文中应用的前提条件。我相信您要删除的模块的默认引用具有这样的规范: 所以你'基本上已经将 UrlRouting 应用于每个请求,无论是否通过 managedHandler。第 2 部分的更多信息位于此 URL:svenaelterman.wordpress.com/2011/01/31/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 2016-05-23
    • 2014-04-15
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多