2013-02-02 12 views
27

私は、次の(と同様の)URLは私のASP.net MVC4/WEBAPIプロジェクトで動作するように取得しようとしている:責任ASP.net MVC4 WebAPIのルートでそれ

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をどのように動作させ、正しくマップするのですか?

+0

ルートの最後の部分だけをオプションにすることができます。この例では、プロジェクトオプション以外のすべてのルートパラメータを作成していることがわかりましたが、これは明らかに不可能です。また、urlでは 'urlの' namespace'と 'type'部分が欠けていることを示しています。 'member'部分のみがルートの終わりに定義されているのでオプションであることができます。 –

+0

これは真実ではなく、問題なく動作することが証明されています。あなたは、あなたが望むように多くの部品をオプションで持つことができます。例えば、私がちょうど私の答えで作った変更の前に、URL/api/nav/SpotiFireは魅力として働いた。 – Alxandr

答えて

42

あなた<system.webServer><handlers>セクションに次のハンドラを追加することができます。

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

これにより、.dllを含むすべての要求が管理パイプラインを通じて処理されます。また、パフォーマンスへの影響を制限するためにGET動詞に限定した方法にも注意してください。

+0

賢明な、これはしないでください 'はすでにそれをカバーしていますか? "*。"でカバーされているものがわからない – Alxandr

+2

いいえ、それをカバーしていません。拡張子を指定する必要があります。それは静的なファイルです –

+1

これを行うための正しい方法を示すために+1 –

10

見つけました。必要なのはこれです(そして多分私はオリジナルのポストでは、上記追加したものの一部):

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 
+2

悪い副作用があるため、これを追加することはお勧めしません。=>すべてのリクエストは管理されたパイプラインを経由し、アプリケーションのパフォーマンスに悪影響を及ぼします。 –

+0

実際、時間の中でより良い解決策が見つかるかもしれませんが、要求の90%以上が管理された要求なので、パフォーマンスヒットはあまりにも大きくないとは思いません...唯一のことは、管理されたパイプラインを通してロードされたイメージはイメージであり、私はページ全体に約2つのイメージを持っています... – Alxandr

+1

'runAllManagedModulesForAllRequests =" true "'を有効にせずにこれを行う正しい方法について私の答えをチェックアウトしてください。 –

0

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

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

あなたの資産でパフォーマンスが低下しないという利点があります。

+0

あなたが否定的な投票をしたときに、理由がなくなりゃ吸います – kim3er

+0

これは私のために働いた、私はちょうど最後に '/'を追加しましたが。 –

関連する問題