2009-08-18 15 views
4

Ich habe ein HttpModule geschrieben, das ich zum Abfangen von Aufrufen der WebResource.axd-Handler verwendet, so dass ich einige Nachbearbeitung auf dem Javascript ausführen kann.HttpResponse-Filter gibt nichts zurück

Das Modul umschließt den Response.Filter-Stream, um seine Verarbeitung auszuführen, und schreibt seine Änderungen in den zugrunde liegenden Stream.

Das Problem, das ich habe, ist, dass das Skript nicht an den Browser zurückgegeben wird.

So wie ein wirklich einfaches Beispiel, das nur als Durchgang durch wirkt, sieht das Modul wie folgt aus:

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); 
     } 
    } 
} 

und die ResourceFilter, die nur ausgibt, was es sieht wie folgt erhält:

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); 
    } 
} 

Ich kann anfügen und sehen, das Modul und Filter aufgerufen wird, aber wenn ich zu WebResource.axd URL blättern, bekomme ich nichts zurück.

Ich habe dieses Muster verwendet, um Module zu implementieren, die Verarbeitung auf Aspx-Seiten ausführen, und sie funktionieren gut. Es scheint, dass etwas an der Interaktion mit der WebResource.axd ist, die das verhindert.

Antwort

5

Ich habe ein kleines Projekt erstellt und Ihr Problem genau nachgebildet. Ich habe Fiddler laufen lassen, um mir die Antwort genau anzusehen, einschließlich Header und fand heraus, dass es nur auf Filtern in * .axd-Dateien war, wo das passierte.

Nach einigem Suchen fand ich this Artikel von Daniel Richardson, der das gleiche Problem hatte.

Stellt sich heraus, dass die System.Web.Handlers.AssemblyResourceLoader (die axds durchlaufen) setzt ein Flag, um weitere Schreibvorgänge zu ignorieren.

Daniel gibt ein Beispiel für die Verwendung von reflection, um dieses Flag zu deaktivieren und dem Filter zu erlauben, am Ergebnis der axd zu arbeiten. Ich habe es ausprobiert und es funktioniert gut. Bedenken Sie jedoch, dass sich die Auswirkungen auf die Leistung nicht ändern, und wie Daniel sagt, könnten sich die ASP.NET-Implementierungen ändern.

+0

älter funktioniert Wenn jemand in Code interessiert das Flag auf false gesetzt : 'Fieldinfo field = _webStream.GetType() BaseType.GetField ("_ writer", BindingFlags.NonPublic | BindingFlags.Instance);' 'var writer = field.GetValue (_webStream);' ' Fieldinfo ignoringWrites. = writer.GetType(). GetField ("_ ignoringFurtherWrites", BindingFlags.NonPublic | BindingFlags.Instance); ' ' ignoringWrites.SetValue (writer, false); ' – avidenic

1

Aufgrund meiner Erfahrung muss der Filter auf dem neuesten ‚süchtig‘ im PreRequestHandlerExecute Ereignis werden, um es in IIS-Version als Version 7.