web-dev-qa-db-fra.com

ASP.NET MVC - Routage - une action avec extension de fichier

existe-t-il un moyen d'obtenir l'URL d'appel http://mywebsite/myarea/mycontroller/myaction.xml Ce serait fondamentalement "faux" de demander un fichier mais le résultat serait une opération d'action qui servirait un fichier créé dynamiquement?

J'ai essayé ceci:

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

mais chaque fois qu'il y a une extension de fichier dans l'URL, le routage échoue et se comporte comme je demandais un fichier directement.

Je soupçonne que cela pourrait être dû à l'utilisation du gestionnaire d'url sans extension.

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

Merci pour toutes suggestions.

Jakub

30
Jakub Holovsky

Vous devez mapper les demandes de vos fichiers XML vers TransferRequestHandler dans web.config. Sinon IIS gérera la demande.

Jon Galloway explique comment procéder ici .

En résumé, vous ajoutez cet élément à location/system.webServer/handlers dans votre web.config:

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

Le problème est que IIS gérera le fichier .xml comme un fichier statique et ne routera pas par défaut le fichier XML via votre application MVC. IIS gère le demande et votre code MVC n'obtient jamais de modification pour acheminer vers ce fichier. Il existe plusieurs façons de contourner ce problème.

J'ai trouvé le moyen le plus simple de gérer cela en utilisant le module IIS Rewrite pour réécrire l'URL des URL de fichiers statiques vers une route MVC:

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

Assurez-vous que le module de réécriture IIS est installé (installation distincte du programme d'installation de la plate-forme). Si vous utilisez déjà le gestionnaire de réécriture, c'est la solution la plus efficace.

Comme indiqué ci-dessus par la publication de Ben Foster et Jon Galloway, vous pouvez également mapper le TransferRequestHandler à votre chemin spécifique que vous souhaitez router. Pour plus de compacité, voici ce que vous devez ajouter à votre 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>

Vous pouvez ensuite utiliser une route d'attributs pour gérer les URL des fichiers .xml. Par exemple:

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

Plus d'informations dans cet article de blog: http://weblog.west-wind.com/posts/2015/Nov/13/Serving-URLs-with-File-Extensions-in-an-ASPNET-MVC-Application

9
Rick Strahl