Подтвердить что ты не робот

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.

Любые мысли? И спасибо.

4b9b3361

Ответ 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

Проксирование запроса вместо выполнения переадресации клиента также позволяет работать с вложенными относительными путями (и скрывает секретный соус от конечного пользователя.)