4

WebResource.axd ハンドラーの呼び出しをインターセプトするために使用している HttpModule を作成したので、javascript で後処理を実行できます。

モジュールは Response.Filter ストリームをラップしてその処理を実行し、その変更を基になるストリームに書き込みます。

私が抱えている問題は、スクリプトがブラウザに返されないことです。

したがって、パススルーとして機能する非常に単純な例として、モジュールは次のようになります。

 public class ResourceModule : IHttpModule
{
    public void Dispose()
    {
    }

    public void Init(HttpApplication context)
    {
        context.PostRequestHandlerExecute += new EventHandler(context_PostRequestHandlerExecute);
    }

    void context_PostRequestHandlerExecute(object sender, EventArgs e)
    {
        HttpApplication context = sender as HttpApplication;

        if (context.Request.Url.ToString().Contains("WebResource.axd"))
        {
            context.Response.Filter = new ResourceFilter(context.Response.Filter);
        }
    }
}

受け取ったものを出力するだけの ResourceFilter は次のようになります。

 public class ResourceFilter : MemoryStream
{
    private Stream inner;

    public ResourceFilter(Stream inner)
    {
        this.inner = inner;
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        inner.Write(buffer, offset, count);
    }
}

モジュールとフィルターが呼び出されていることをアタッチして確認できますが、WebResource.axd URL を参照しても何も返されません。

このパターンを使用して、aspx ページで処理を実行するモジュールを実装しましたが、問題なく動作します。この作業を妨げる WebResource.axd との相互作用について何かがあるようです。

4

2 に答える 2

5

私は小さなプロジェクトを作成し、問題を正確に再現しました。ヘッダーを含む応答をよく見るためにフィドラーを実行していましたが、これが発生したのは *.axd ファイルのフィルターのみであることがわかりました。

いくつか検索した後、同じ問題を抱えていた Daniel Richardson によるこの記事を見つけました。

System.Web.Handlers.AssemblyResourceLoader(axds が通過する) フラグを設定して、それ以上の書き込みを無視することが判明しました。

Daniel は、リフレクションを使用してこのフラグの設定を解除し、フィルターが axd の結果に対して機能するようにする例を示しています。私はそれを試してみましたが、うまくいきます。ただし、これによるパフォーマンスへの影響を念頭に置いておくことをお勧めします。Daniel が言うように、ASP.NET の実装は変更される可能性があります。

于 2009-09-11T08:59:35.040 に答える
2

私の経験に基づくと、フィルターをバージョン7より古いIISバージョンで機能させるには、遅くともPreRequestHandlerExecuteイベントでフィルターを「フック」する必要があります。

于 2011-02-08T12:37:13.563 に答える