web-dev-qa-db-ja.com

ファイル名を含むASP.netMVC4 WebApiルート

ASP.net MVC4/WebApiプロジェクトで次の(および同様の)URLを機能させようとしています。

http://127.0.0.1:81/api/nav/SpotiFire/SpotiFire.dll

このURLを担当するルートは次のようになります。

        config.Routes.MapHttpRoute(
            name: "Nav",
            routeTemplate: "api/nav/{project}/{Assembly}/{namespace}/{type}/{member}",
            defaults: new { controller = "Nav", Assembly = RouteParameter.Optional, @namespace = RouteParameter.Optional, type = RouteParameter.Optional, member = RouteParameter.Optional }
        );

を削除すれば問題なく動作します。ファイル名に、またはURLの後ろにスラッシュを追加した場合、それはUrl.Route-メソッドなどを使用できないことも意味します。取得するエラーは一般的な404エラーです(下の画像)。

enter image description here

Web.configに<httpRuntime targetFramework="4.5" relaxedUrlToFileSystemMapping="true" />を追加しようとしましたが、追加も試みました

<compilation debug="true" targetFramework="4.5">
  <buildProviders>
    <remove extension=".dll"/>
    <remove extension=".exe"/>
  </buildProviders>
</compilation>

そして、それはどれもうまくいかないようです。だから私の質問は基本的に、どうすればこのURLを機能させ、正しくマップすることができますか?

36
Alxandr

<handlers><system.webServer>セクションに次のハンドラーを追加できます。

<add 
    name="ManagedDllExtension" 
    path="api/nav/*/*.dll" 
    verb="GET" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" 
/>

これにより、.dllを含むすべてのリクエストがマネージパイプラインを介して処理されます。また、パフォーマンスへの影響を制限するために、GET動詞のみに制限していることに注意してください。

52
Darin Dimitrov

それを見つけた。必要なのはこれです(そしておそらく私が元の投稿で上に追加したもののいくつか):

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
12
Alxandr

私のトレードオフは、ルートの最後に/endを追加することでした。 .は最後の/の前に無視されます。

同等のURLはhttp://127.0.0.1:81/api/nav/SpotiFire/SpotiFire.dll/endになります。

利点は、アセットのパフォーマンスに影響を与えないことです。

4
kim3er