2009-08-18 23 views
4

WebResource.axdハンドラーを呼び出すために使用しているHttpModuleを記述しました。これにより、JavaScriptで後処理を実行できます。HttpResponseフィルターは何も返しません。

モジュールは、処理を実行するために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とのやり取りについては何かがあるようです。

答えて

5

小さなプロジェクトを作り、問題を正確に再現しました。私はヘッダーを含むレスポンスをよく見ているように、フィドラーを実行していましたが、これが起こった場所の* .axdファイルのフィルター上にしかないことがわかりました。

検索の結果、同じ問題があったDaniel Richardsonの記事thisが見つかりました。

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

Danielは、このフラグを設定解除し、フィルタがaxdの結果に作用するようにするためにreflectionを使用する例を示します。私はそれを試して、それはうまく動作します。ただし、Daniel氏によると、ASP.NETの実装は変更される可能性があります。

+0

より古いIISのバージョンで動作させるために、遅くともPreRequestHandlerExecuteイベントで「夢中」する必要があります: 'のFieldInfoフィールド= _webStream.GetType()BaseType.GetField( "_ライター"、BindingFlags.NonPublic | BindingFlags.Instance);' 'VARライター= field.GetValue(_webStream);' 'のFieldInfo ignoringWrites。 = writer.GetType()。GetField( "_ ignoringFurtherWrites"、BindingFlags.NonPublic | BindingFlags.Instance); ' 'ignoringWrites.SetValue(writer、false);' – avidenic

1

私の経験に基づいたフィルタは、誰もがフラグをfalseに設定するコードに興味がある場合は、バージョン7

関連する問題