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

est-il un moyen d'atteindre L'URL appelant http://mywebsite/myarea/mycontroller/myaction.xml Ce serait essentiellement "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 si je demandais un fichier directement.

je soupçonne que cela pourrait être en raison de l'utilisation de l'extension moins le gestionnaire d'url.

<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%Microsoft.NETFrameworkv4.0.30319aspnet_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.NETFramework64v4.0.30319aspnet_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 les suggestions.

Jakub

22
demandé sur Jakub Holovsky 2014-03-04 03:02:49

3 réponses

vous devez faire correspondre les demandes pour vos fichiers XML à TransferRequestHandler dans web.config. Sinon IIS va traiter la requête.

Jon Galloway explique comment faire ceci ici .

en résumé, vous ajoutez cet élément à Emplacement/système.webServer / handlers dans votre web.config:

<add name="XmlFileHandler" path="*.xml" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
25
répondu Ben Foster 2015-12-07 15:04:29

le problème est que IIS va gérer le .fichier xml comme un fichier statique et ne sera pas par défaut router le fichier XML à travers votre application MVC. L'IIS traite la demande et votre code MVC n'obtient jamais un changement d'itinéraire vers ce fichier. Il ya quelques façons de contourner cela.

j'ai trouvé le moyen le plus facile de gérer cela en utilisant le module de réécriture IIS pour réécrire L'URL à partir D'URL(s) de fichier statique à 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 vous avez la IIS Module de réécriture installé (installation séparée de L'installateur de plate-forme). Si vous utilisez déjà la Réécriture gestionnaire c'est la solution la plus efficace.

comme indiqué ci-dessus par Ben Foster et le post de Jon Galloway, vous pouvez également cartographier le TransferRequestHandler à votre chemin spécifique que vous voulez parcourir. Pour la 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 alors utiliser une route D'attribut à manipuler .Urls des fichiers xml. Pour exemple:

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

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

8
répondu Rick Strahl 2015-11-15 08:57:34

si vous déposez votre fichier xml dans l'un des dossiers de votre site web. Essayez quelque chose comme ceci: C# - Comment faire un appel HTTP

-4
répondu Ayo Adesina 2017-05-23 10:31:09