Маршрутизация статических файлов в ASP.NET MVC 3, например, robots.txt

Я хотел бы иметь ссылку "http://mywebsite.com/robots.txt", связанную со статическим файлом ~/Content/robots.txt.

Как я могу это сделать?

Спасибо, Merijn

Ответы

Ответ 1

Вы можете установить модуль Url Rewrite: http://www.iis.net/downloads/microsoft/url-rewrite
Помните, что этот модуль работает на IIS, а не на Cassini/IIS Express.

И добавьте следующее правило в web.config в раздел <system.webServer>

<rewrite>
    <rules>
        <rule name="robots" stopProcessing="true">
            <match url="robots.txt" />
            <action type="Rewrite" url="/Content/robots.txt" />
        </rule>
    </rules>
</rewrite>

Я проверил его на новом проекте MVC 3.NET и оба url-ответа с тем же файлом: mywebsite.com/robots.txt
mywebsite.com/Content/robots.txt

Ответ 2

Добавление такого маршрута должно сделать трюк. Таким образом может быть предоставлен любой статический файл .txt, например, файл robots.txt.

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

Ответ 3

Вы можете настроить запрос маршрутизации для файлов на диске. По умолчанию система маршрутизации проверяет, соответствует ли url файлу диска перед оценкой маршрутов приложения. Если есть совпадение, файл диска обслуживается, и маршруты не используются. Однако это можно почитать, так что маршруты просматриваются до того, как будут проверены файлы на диске, установив свойство RouteExisitingFiles в RouteCollection на true. Поместите это утверждение близко к началу метода RegisterRoutes - это, по-видимому, соглашение для приложений mvc. Затем вы определяете маршрут, который для файлов диска. Помните, когда вы делаете это, что может быть непредвиденным эффектом, потому что riute может называть другие типы URL-адресов.

Ответ 4

Решение 1: Если вы укажете URL-адрес. Браузер запросит это для IIS или веб-сервера. MVC не участвует в файле чтения и т.д. Он предоставляет эти запросы IIS для обработки. Вам необходимо назначить разрешение для этой папки.

Решение 2: прочитайте файл в PresentationModel, если у вас есть. прочитайте этот файл в Chunks и верните его в качестве типа файла в браузер.

Надеюсь, это даст вам какое-то направление.

Ответ 5

Я смог сделать это, переписав пути в обработчике событий для BeginRequest в global.asax.

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

Ответ 6

 routes.MapRoute("Robots","robots.txt");