routeconfig route net mvc examples attribute asp c# asp.net-mvc-3 url asp.net-mvc-routing file-extension

c# - route - ASP.NET MVC-Enrutamiento-una acción con extensión de archivo



route controller c# (3)

Debe asignar las solicitudes de sus archivos XML a TransferRequestHandler en web.config. De lo contrario IIS se encargará de la solicitud.

Jon Galloway explica cómo hacer esto here .

En resumen, agrega este elemento a la ubicación / system.webServer / handlers en su web.config:

<add name="XmlFileHandler" path="*.xml" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

¿hay alguna forma de lograr una URL de llamada http://mywebsite/myarea/mycontroller/myaction.xml Esto básicamente "falsificar" solicitaría un archivo pero el resultado sería una operación de acción que serviría a un archivo creado dinámicamente?

Intenté esto:

context.MapRoute( "Xml_filename", "Xml/{controller}/{action}.xml" );

pero cada vez que hay una extensión de archivo en la URL, el enrutamiento falla y se comporta como si estuviera solicitando un archivo directamente.

Sospecho que esto podría deberse al uso de la extensión menos el controlador de 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" />

Gracias por cualquier sugerencia.

Jakub


El problema es que IIS manejará el archivo .xml como un archivo estático y, de manera predeterminada, no enrutará el archivo XML a través de su aplicación MVC. IIS maneja la solicitud y su código MVC nunca recibe un cambio para enrutar a este archivo. Hay algunas maneras de evitar esto.

He encontrado la forma más fácil de manejar esto utilizando el módulo IIS Rewrite para volver a escribir la URL desde las URL de archivos estáticos a una ruta MVC:

<system.webServer> <rewrite> <rules> <rule name="Live Writer Manifest"> <match url="*.xml"/> <action type="Rewrite" url="route/xmlfilehandler"/> </rule> </rules> </rewrite> </system.webServer>

Asegúrese de que tiene instalado el módulo IIS Rewrite (instalación por separado del instalador de plataforma). Si ya está utilizando el controlador de reescritura, esta es la solución más eficiente.

Como se señaló anteriormente en la publicación de Ben Foster y Jon Galloway, también puede asignar el TransferRequestHandler a la ruta específica que desea enrutar. Para la compacidad, esto es lo que necesita agregar a su 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>

Luego puede usar una Ruta de atributos para manejar las URL del archivo .xml. Por ejemplo:

[Route("blog/wlwmanifest.xml")] public ActionResult LiveWriterManifest() {... }

Más información en esta publicación del blog: http://weblog.west-wind.com/posts/2015/Nov/13/Serving-URLs-with-File-Extensions-in-an-ASPNET-MVC-Application