Asp.net mvc 在ASP.NET MVC 3中路由静态文件,如robots.txt

Asp.net mvc 在ASP.NET MVC 3中路由静态文件,如robots.txt,asp.net-mvc,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc Routing,我想有以下链接“http://mywebsite.com/robots.txt“链接到一个静态文件~/Content/robots.txt 我该怎么做 谢谢, Merijn解决方案1:如果指定URL。浏览器将向IIS或Web服务器请求此操作。MVC不参与读取文件等。它将这些请求交给IIS处理。您需要为该文件夹分配权限 解决方案2:如果有,请读取PresentationModel中的文件。分块读取此文件,并将其作为文件类型返回到浏览器 我希望它能给您一些指导。您可以设置磁盘文件的路由请求。默认情况

我想有以下链接“http://mywebsite.com/robots.txt“链接到一个静态文件~/Content/robots.txt

我该怎么做

谢谢,
Merijn

解决方案1:如果指定URL。浏览器将向IIS或Web服务器请求此操作。MVC不参与读取文件等。它将这些请求交给IIS处理。您需要为该文件夹分配权限

解决方案2:如果有,请读取PresentationModel中的文件。分块读取此文件,并将其作为文件类型返回到浏览器


我希望它能给您一些指导。

您可以设置磁盘文件的路由请求。默认情况下,在评估应用程序的路由之前,路由系统会检查url是否与磁盘文件匹配。如果存在匹配项,则提供磁盘文件,并且不使用路由。但是,这可以重新设置,以便在检查磁盘文件之前通过将
RouteCollection
RouteExisitingFiles
属性设置为
true
查看路由。将此语句放在RegisterRoutes方法的顶部-这似乎是mvc应用程序的惯例。然后为磁盘文件定义一个路由。请注意,这样做可能会产生一些不可预见的效果,因为riute可能会natch其他类型的URL。

添加这样的路由应该可以做到这一点。这样就可以提供任何静态的.txt文件,比如robots.txt

routes.IgnoreRoute("{resource}.txt"); 

我可以通过在global.asax中为
BeginRequest
重写事件处理程序中的路径来实现这一点

BeginRequest += delegate
{
    switch (Request.RawUrl.ToLowerInvariant())
    {
        case "/favicon.ico":
            Context.RewritePath("~/Content/favicon.ico");
            return;
        case "/robots.txt":
            Context.RewritePath("~/Content/robots.txt");
            return;
    }
};

您可以安装Url重写模块
请记住,此模块适用于IIS,而不是Cassini/IIS Express

并将以下规则添加到web.config部分


我在新的MVC 3.NET项目上检查了它,并使用相同的文件检查了两个url响应: mywebsite.com/robots.txt

mywebsite.com/Content/robots.txt

看起来似乎没有人真正读过你的问题这在某种url重写模块中处理得更好。。。这将减少开销。这不起作用,我认为您需要使用下面列出的其他方法。我建议使用Url重写模块。这种技术对我来说非常有效。(我把它放在registerOutes()方法中RouteConfig.cs文件的顶部。)很好,但在重写1.0与Azure Web角色结合使用时要小心:)这仍然是URL重写2.0的问题吗?
BeginRequest += delegate
{
    switch (Request.RawUrl.ToLowerInvariant())
    {
        case "/favicon.ico":
            Context.RewritePath("~/Content/favicon.ico");
            return;
        case "/robots.txt":
            Context.RewritePath("~/Content/robots.txt");
            return;
    }
};
<rewrite>
    <rules>
        <rule name="robots" stopProcessing="true">
            <match url="robots.txt" />
            <action type="Rewrite" url="/Content/robots.txt" />
        </rule>
    </rules>
</rewrite>