1

カスタム HTTP ハンドラーに関して、私には明確でないことがあります。

このブログ投稿ScriptTranslatorに従って HTTP ハンドラーを作成 し、次の方法で web.config ファイルにハンドラーを登録しました。

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true" />
    <handlers>
        <add name="ScriptTranslatorHandler" path="*.js.axd" verb="*" type="CamelotShiftManagement.HttpHandlers.ScriptTranslator" />
    </handlers>
</system.webServer>

IgnoreRouteまた、web アプリが we.config ファイルに従ってハンドラーを起動できるように、global.asax にコマンドを追加しました。

routes.IgnoreRoute("{resource}.js.axd/{*pathInfo}");

ハンドラーは html ファイルから JS ファイル参照を変換すると想定されているため、スクリプト参照を変更axdし、最後に拡張子を追加します。

ハンドラーはリクエストを受け取り、axd 拡張子のないファイルを検索して、翻訳が必要なスクリプト コンテンツを取得します。基本的なProccessRequestアクションは次のとおりです。

public void ProcessRequest(HttpContext context)
{
    string relativePath = context.Request.AppRelativeCurrentExecutionFilePath.Replace(".axd", string.Empty);
    string absolutePath = context.Server.MapPath(relativePath);
    string script = ReadFile(absolutePath);

    string translated = TranslateScript(script,CultureInfo.CurrentCulture);
    context.Response.Write(translated);
    Compress(context);
    SetHeadersAndCache(absolutePath, context);
}

したがって、私のhtmlファイルでは、スクリプトタグの参照のみを変更します。実際のファイルはありませmyscript.js.axdmyscript.js.

404 エラーが発生します。

私はカスタム HTTP ハンドラーの作成と使用に非常に慣れていないため、その使用法から何が期待できるかわかりません。

参照されているブログ投稿は、コードに実際の .js.axd ファイルが存在してはならず、スクリプト参照の要求がハンドラーに再ルーティングされ、前に提供したコードの最初の 2 行を使用して実際の .js ファイルを処理することを意味します。それ。

カスタム HTTP ハンドラーを設定しないと、最初にハンドラー コードを実行してから 404 エラーをスローする必要がありますか、それともハンドラー アクションをサポートするダミーの myScript.js.axd ファイルを作成する必要がありますか?

4

1 に答える 1

3

無視するURLは次のようになります。

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("Scripts/{resource}.js.axd/{*pathInfo}");

それから加えて:

  <system.web>
    <httpHandlers>
      <add path="*.js.axd" verb="*" type="..." />
    </httpHandlers>
    ...
  </system.web>

と:

  <system.webServer>
    ...
    <handlers>
        <add name="ScriptTranslatorHandler" path="*.js.axd" verb="*" type="..." />
    </handlers>
  </system.webServer>

名前空間も確認してください。ファイルに名前空間ScriptTranslator.csが含まれていません

追加した:

デフォルトではroutes.IgnoreRoute("{resource}.axd/{*pathInfo}");無視するだけlocalhost/test.axdで、'localhost / Home / test.axd`は無視します。その後、アプリケーションは一致するルートを見つけようとしますが、それを見つけることができません。その後、404を受け取ります。

于 2012-10-06T10:48:20.643 に答える