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

gre*_*mac 4 iis asp.net-mvc attributerouting iis-8 asp.net-mvc-5.2

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

以下是HomeController:

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

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

访问/ hellotxt测试

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

访问/hello.txt

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

访问/ hello404

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

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

Pio*_*tek 10

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

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

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

首先你可以试试

<modules runAllManagedModulesForAllRequests="true">
Run Code Online (Sandbox Code Playgroud)

但是这个名为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" />
Run Code Online (Sandbox Code Playgroud)

但你不喜欢这个.

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


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

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