ASP.NET MVC - Маршрутизация - действие с расширением файла
существует ли способ получить URL-адрес вызова http://mywebsite/myarea/mycontroller/myaction.xml
Это будет в основном "поддельным" запросом файла, но результатом будет операция действия, которая будет служить файлу, создаваемому динамически?
Я пробовал это:
context.MapRoute(
"Xml_filename",
"Xml/{controller}/{action}.xml"
);
но всякий раз, когда в URL-адресе есть filextension, маршрутизация выходит из строя и ведет себя, когда я запрашивал файл напрямую.
Я подозреваю, что это может быть из-за использования расширителя less url.
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
Спасибо за любые предложения.
Якуб
Ответы
Ответ 1
Вам нужно сопоставить запросы для ваших XML файлов с TransferRequestHandler
в web.config. В противном случае IIS обработает запрос.
Джон Галлоуэй объясняет, как это сделать здесь.
Таким образом, вы добавляете этот элемент в location/system.webServer/обработчики в свой web.config:
<add name="XmlFileHandler" path="*.xml" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
Ответ 2
Проблема в том, что IIS обрабатывает XML файл как статический файл и по умолчанию не будет перенаправлять XML файл через ваше приложение MVC. IIS обрабатывает запрос, и ваш код MVC никогда не получает изменений для маршрутизации к этому файлу.
Есть несколько способов обойти это.
Я нашел самый простой способ справиться с этим, используя модуль перезаписи IIS, чтобы переписать URL-адрес из статических URL-адресов (ов) в маршрут MVC:
<system.webServer>
<rewrite>
<rules>
<rule name="Live Writer Manifest">
<match url="*.xml"/>
<action type="Rewrite" url="route/xmlfilehandler"/>
</rule>
</rules>
</rewrite>
</system.webServer>
Убедитесь, что у вас установлен модуль перезаписи IIS (отдельная установка из установщика платформы). Если вы уже используете обработчик Rewrite, это наиболее эффективное решение.
Как было указано выше по почте Беном Фостером и Джоном Галлоуэем, вы также можете отобразить TransferRequestHandler
по своему конкретному пути, который вы хотите проложить. Для компактности здесь вам нужно добавить к вашему web.config:
<system.webServer>
<handlers>
<add name="Windows Live Writer Xml File Handler"
path="wlwmanfest.xml"
verb="GET" type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0"
/>
</handlers>
</system.webServer>
Затем вы можете использовать Маршрут атрибута для обработки URL-адресов XML файлов. Например:
[Route("blog/wlwmanifest.xml")]
public ActionResult LiveWriterManifest() {... }
Дополнительная информация в этом блоге:
http://weblog.west-wind.com/posts/2015/Nov/13/Serving-URLs-with-File-Extensions-in-an-ASPNET-MVC-Application
Ответ 3
Если вы выгрузите xml файл в одну из папок внутри вашего сайта.
Попробуйте что-то вроде этого:
С# - Как сделать HTTP-вызов