如何使用带有点/句点的基于MVC5属性的路由?

时间:2015-01-10 04:21:46

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

我基本上有一个开箱即用的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(证明基于属性的路由正常工作):

accessing /hellotxt-testing

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

accessing /hello.txt

与我去/hello404时相比,我得到了另一个404页面:

accessing /hello404

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

我该怎么做才能确保我能确保ASP.NET获取这些包含句点的网址?还有其他“特殊”字符也会导致问题吗?

2 个答案:

答案 0 :(得分:9)

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

为了确保我是正确的尝试在最后添加斜杠并访问/hello.txt/,您现在应该得到404错误。

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

首先您可以尝试

<modules runAllManagedModulesForAllRequests="true">

但是这个选项名为RAMMFAR hurts the performance of web application.并且还有其他后果。

第二次您可以为IIS网址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?


如果你需要在应用程序的很多地方使用它,我会选择第二个选项。

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

答案 1 :(得分:0)

我们遇到了同样的问题(尽管没有使用属性路由),它开始出现在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年前发现的,到目前为止,我们还没有遇到由此变化引起的任何负面影响。

BTW - 如果有人解释为什么会这样,请分享。