MVC4 RouteConfig.cs不返回静态文件robots.txt

Rya*_*yan 2 asp.net-mvc asp.net-mvc-routing asp.net-mvc-4

所以这就是我的RouteConfig的样子:

 public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapRoute("Robots.txt",
            "robots.txt",
            new { 
                controller = "Home", 
                action = "Robots", 
                id = "", 
                language = "en", 
                culture = "us" 
            });
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            "Default",
            "{language}/{culture}/{controller}/{action}/{id}",
            new
            {
                controller = "Home",
                action = "Index",
                id = "",
                language = "en",
                culture = "us"
            });
    }
}
Run Code Online (Sandbox Code Playgroud)

现在根据我的理解,当我访问www.mysite.com/robots.txt时,网站应该路由到robots.txt,但事实并非如此.我在服务另一个静态页面时也遇到了问题,但我发现了一种解决方法,并且不必为静态.html页面提供服务.

我在MVC3中构建了另一个站点,我复制了我在那里使用的路由配置模式,它们似乎工作正常.任何想法为什么这不起作用?

PS当我浏览到www.mysite.com/en/US/Home/Robots时,我看到robots.txt文件就好了,所以所有的控制器,操作和视图都匹配得很好.

谢谢!

Dar*_*rov 6

这可能是因为IIS认为它是一个静态文件,因为它的扩展并没有将它传递给托管管道进行处理.

您可以将以下处理程序添加到<system.webServer>web.config文件的部分,以便使所有请求/robots.txt都通过托管管道(从而通过您可能已设置的路径):

<system.webServer>
    <handlers>
        ...
        <add name="Robots" path="robots.txt" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

您也可以通过为所有请求启用托管模块来完成此工作,但我不建议您这样做,因为所有请求现在都将通过托管管道,这可能会产生额外的开销:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    ...
</system.webServer>
Run Code Online (Sandbox Code Playgroud)