ASP.NET MVC Route: обход статического обработчика файлов для пути
Я занимался поиском и поиском в течение нескольких часов и не добился значительного прогресса, поэтому, надеюсь, кто-то здесь может помочь.
Я пытаюсь получить все запросы к определенному пути, который будет обрабатываться сторонним компонентом.
EDIT И мне нужно, чтобы все запросы ко всем другим путям велись нормально.
Я использую обработчик маршрута с подстановочным отображением следующим образом:
routes.Add(new Route("pathiwant/{*EverythingElse}", new MyRouteHandler()));
Все традиционные маршруты направляются правильно обработчику, который отлично перемещается к стороннему компоненту. Когда я попадаю в статические файлы (.html,.txt и т.д.), Они обрабатываются обработчиком StaticFile вместо моего обработчика, поэтому я пытаюсь отключить обработчик StaticFile так (упрощенно):
<system.webServer>
<handlers>
<remove name="StaticFile"/>
</handlers>
</system.webServer>
Это отключает обработчик StaticFile, но MVC по-прежнему не выбирает маршрут.
Я бы предпочел не возвращаться к созданию собственного обработчика и впрыскивать в стек запросов ASP, так как кажется, что для этого должен быть счастливый способ MVC.
Любые мысли? И спасибо.
Ответы
Ответ 1
Здесь есть пара вариантов.
http://www.hanselman.com/blog/BackToBasicsDynamicImageGenerationASPNETControllersRoutingIHttpHandlersAndRunAllManagedModulesForAllRequests.aspx
Если вы действительно хотите, чтобы все запросы выполнялись через трубу asp.net, вам нужно.
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
Обновление
Другой вариант, особенно если ваша необходимость обхода статического обработчика ограничена подмножеством вашего сайта, заключается в использовании следующих
<add name="ApiURIs-ISAPI-Integrated-4.0"
path="/subdirectory/*"
verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0" />
Учитывая, что на сайтах mvc большинство статических файлов обрабатываются из нескольких известных каталогов, это лучший вариант.
Ответ 2
Лучшим решением для этого, вероятно, является URL Rewriter, чтобы проксировать запросы с исходного URL на альтернативу MVC.
Например, скажите, что вам нужно иметь возможность автоматически загружать относительные URL-адреса в контент, поданный из базы данных.
RewriteRule ^/load/(\d+)/rel(\?.*)? - [L]
RewriteRule ^/load/(\d+)/(.*)$ /load/$1/rel?path=$2 [P,QSA,L,NC]
Эти правила позволят вам настроить два маршрута MVC:
routes.MapRoute(
"Load Item",
"load/{itemId}",
new { controller = "Load", action = "Index" }
);
routes.MapRoute(
"Load Relative Item",
"load/{itemId}/rel", //?path=
new { controller = "Load", action = "Relative" }
);
И тогда ваши методы действий просты:
public ActionResult Index(int itemId) { ... }
public FileStreamResult Relative(int itemId, string path) { ... }
Первое правило перезаписи заключается в предотвращении перезаписи путей, содержащих /rel; они уже в их последней форме. Второе правило переписывает прокси (вместо перенаправления) запроса.
например.
/load/1234/file.xml
становится
/load/1234/rel?path=file.xml
Проксирование запроса вместо выполнения переадресации клиента также позволяет работать с вложенными относительными путями (и скрывает секретный соус от конечного пользователя.)