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

时间:2013-03-30 22:46:39

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing

所以这就是我的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"
            });
    }
}

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:6)

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

您可以将以下处理程序添加到web.config文件的<system.webServer>部分,以便使对/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>

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

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    ...
</system.webServer>