Вопрос по c#, asp.net-mvc, .net, routes, httphandler – ASP.NET MVC Route: обходить обработчик статического файла для пути

17

Я пару часов гуглял и возился, и действительно не добился большого прогресса, так что, надеюсь, кто-то здесь может помочь.

Я пытаюсь обработать все запросы по определенному пути сторонним компонентом.

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-счастливый способ сделать это.

Какие-нибудь мысли? И спасибо.

Ваш Ответ

2   ответа
2

Перезаписывающий URL прокси-запросы от исходного 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

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

14

http://www.hanselman.com/blog/BackToBasicsDynamicImageGenerationASPNETControllersRoutingIHttpHandlersAndRunAllManagedModulesForAllRequests.aspx

Если вы действительно хотите, чтобы все запросы выполнялись через канал asp.net, тогда вам нужно.

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

Update

Другой вариант, особенно если вам необходимо обойти статический обработчик, ограниченный подмножеством вашего сайта, это использовать следующее

  <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 большинство статических файлов обрабатываются из пары хорошо известных каталогов, это лучший вариант.

ВАЖНАЯ ЗАМЕТКА:<system.webServer> применяется только к пулам приложений, в которых работает конвейер интегрированного режима. Это не сработает для пулов приложений, работающих в классическом режиме.
Благодарю. Это определенно то, что я пробовал, но я хочу, чтобы все другие пути обрабатывались нормально. Это действительно начинает казаться, что нет никакого способа MVC сделать это, и я должен просто сломать и добавить обработчик перед MVC. jmoss
Обратите внимание: НЕ РЕКОМЕНДУЕТСЯ использовать runAllManagedModulesForAllRequests = & quot; true & quot; - см. статью Hanselman для деталей. Это может оказать негативное влияние на производительность.
Не уверен насчет специфики того, что именно вы хотите и не хотите обрабатывать, но да, чтобы обрабатывать вещи в mvc, канал asp.net должен получать все соответствующие запросы.
Не только производительность. Поскольку модули запускаются для ВСЕХ запросов, передача URL-адресов для PDF, XML и других файлов через конвейер может дать интересные результаты. Пусть покупатель будет бдителен.

Похожие вопросы