web-dev-qa-db-ja.com

ASP.NET MVC-ルーティング-ファイル拡張子付きのアクション

uRLを呼び出す方法はありますかhttp://mywebsite/myarea/mycontroller/myaction.xmlこれは基本的にファイルを要求する「偽の」ものですが、結果は動的に作成されたファイルを提供するアクション操作になりますか?

私はこれを試しました:

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

しかし、URLにfilextensionがある場合は常に、ルーティングが失敗し、ファイルを直接要求していたように動作します。

これは、urllessハンドラーを使用しないことが原因であると考えられます。

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

ご提案ありがとうございます。

ジャクブ

30
Jakub Holovsky

XMLファイルのリクエストをweb.configのTransferRequestHandlerにマッピングする必要があります。そうでない場合、IISは要求を処理します。

Jon Gallowayがこれを行う方法を説明します here

要約すると、この要素をweb.configのlocation/system.webServer/handlersに追加します。

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

問題は、IISは.xmlファイルを静的ファイルとして扱い、デフォルトではMVCアプリケーションを介してXMLファイルをルーティングしないことです。IISはリクエストとMVCコードがこのファイルにルーティングするように変更されることはありません。

IIS Rewriteモジュールを使用して静的ファイルURLからMVCルートにURLを書き換えることで、これを処理する最も簡単な方法を見つけました。

<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 Moduleがインストールされていることを確認してください(プラットフォームインストーラーからの個別インストール)。すでに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>

その後、属性ルートを使用して.xmlファイルのURLを処理できます。例えば:

[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

9
Rick Strahl