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

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" />

Спасибо за любые предложения.

Якуб

4b9b3361

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