12

プロジェクトの.DLLに埋め込まれたリソースであるJavaScriptファイルを提供するHttpHandlerを作成する必要があります。ビュー内の参照はそのようなリソースを直接見ることができないため、パス/ js / [file]でリクエストをインターセプトし、一致する埋め込みファイルを見つけてスクリプトを返すHttpHandlerモジュールを使用することを計画しました。

問題は、web.configのセクションでさまざまな設定を試しても、HttpHandlerコードが呼び出されないことです。私は明らかに何かが欠けていますが、エラーメッセージがないのでそれが何であるかわかりません。私が今までに得たのは、静的ファイルハンドラーからの404だけです。

Q1)明らかな何かが欠けていますか?

Q2)IISにハンドラーを呼び出さない理由を教えてもらう方法はありますか?

概要:ASP.NET MVC4アプリケーションのIISExpress(v8)でテストしています。

IHttpHandlerを実装する単純なライブラリを作成し、テストMVCアプリケーションでこれへの参照を追加し、web.configに次の行を追加しました。

  <system.webServer>
    <validation validateIntegratedModeConfiguration="true" />
    <handlers>
      <add name="ejs" path="js/*" verb="*" type="EmbeddedJsHandler.EmbeddedJsHandler, EmbeddedJsHandler" preCondition="integratedMode" />

ライブラリはそこにありますが、呼び出されることはありません。/js/test.jsなどを使用したリクエストは、404エラーになります。

これまで、ハンドラーコードでさまざまな構成と設定を試してきました。preCondition、resourceType = "Unspecified"、modules = "IsapiModule" scriptProcessor = "%windir%\ Microsoft.NET \ Framework \ v4.0.30319\aspnet_isapi.dll"を試しました

私はパスを試しました:

  js/*。js
  js / *
  js /*.*

(system.webServerの)統合モード設定セクションが使用されていることを確認し、使用されていることを確認しました。

私はスタックオーバーフローで同様のケースを検索し、考えられる解決策の多くを試しました。それでも喜びはありません。

ジョン・スキートでさえこの種の問題を抱えています! IHttpHandlerが呼び出されないのはなぜですか?

4

3 に答える 3

28

最後に偶然にそれを見つけました-RouteConfig.csファイルにroutes.IgnoreRoute()がありませんでした-MVCルーティングエンジンはこのパスを無視するように構成されていなかったため、静的ファイルハンドラーに渡していました。

どっ!

于 2012-12-20T15:02:45.300 に答える
5

これをチェックして:

方法: HTTP ハンドラーを登録する:

統合モードで実行されている IIS 7.0 の HTTP ハンドラーを登録するには:

  1. HTTP ハンドラー クラスをコンパイルし、結果のアセンブリをアプリケーションのルート フォルダーの下の Bin フォルダーにコピーします。

  2. アプリケーションの Web.config ファイルで、system.webServer セクションに handlers 要素を作成します。

次の例は、SampleHandler.new リソースの要求に応答する HTTP ハンドラーを登録する方法を示しています。ハンドラーは、アセンブリ SampleHandlerAssembly でクラス SampleHandler として定義されます。

<configuration>
  <system.webServer>
    <handlers>
      <add name="SampleHandler" verb="*" 
        path="SampleHandler.new" 
        type="SampleHandler, SampleHandlerAssembly" 
        resourceType="Unspecified" />
    </handlers>
  </system.webServer>
</configuration>

注: resourceType属性は、IIS 6.0 の IIS マネージャーの [ファイルが存在することを確認する] オプションと同じ機能を実行します。

統合モードで実行されている IIS 7.0 の場合、handlers 要素での登録のみが必要です。

于 2012-12-20T10:45:22.643 に答える
1

ハンドラーが機能しない理由を直接お伝えすることはできませんが、私たちが使用し、機能するハンドラーの例を示します。

<system.webServer>
    <handlers>
        <add name="JS handler" path="*.js" verb="*" type="Handlers.Minifiers.JSMinify" resourceType="Unspecified" preCondition="integratedMode" />
    </handlers>
</system.webServer>

Cassiniで実行するために少なくとも必要なこのセグメントもあります

<system.web>
    <httpHandlers>
        <add verb="*" path="*.js" type="Handlers.Minifiers.JSMinify" validate="false"/>
    </httpHandlers>
</system.web>

これで解決しない場合は、試してみましたpath="/js/*"か?

于 2012-12-20T10:30:10.377 に答える