Маршрутизация статических файлов в 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");