2009-01-27 4 views
7

Ich habe einen ISAPI-Filter für IIS 6, der einige benutzerdefinierte Verarbeitungen unter Verwendung des Bytes-sended-Feldes der Antwort durchführt. Ich möchte das für IIS 7 aktualisieren, aber ich habe ein Problem. Keines der IIS 7-Ereignisse scheint Zugriff auf die Inhaltslänge, gesendete Bytes oder irgendwelche Daten zu haben, die es mir erlauben würden, die Inhaltslänge oder die gesendeten Bytes zu berechnen. (Ich weiß, dass der Header der Inhaltslänge und die gesendeten Bytes nicht identisch sind, aber beide funktionieren für diesen Zweck.)IIS 7-verwaltetes Modul kann keine Inhaltslänge oder gesendete Bytes empfangen

Von dem, was ich sagen kann, die Inhaltslänge Header wird von HTTP.SYS nach den verwalteten Modulen hinzugefügt habe die Ausführung beendet. Im Moment habe ich einen Event-Handler, der auf EndRequest läuft. Wenn ich den Ausgabestream erreichen könnte, könnte ich berechnen, was ich selbst brauche, aber die verwaltete Pipeline scheint auch keinen Zugriff darauf zu haben.

Gibt es eine Möglichkeit, die Inhaltslänge oder Bytes in der verwalteten Pipeline zu erhalten? Kann ich auf diese Weise die Länge oder Bytes von Inhalten berechnen, die von Objekten in der verwalteten Pipeline gesendet werden?

+0

Gibt es etwas, das ich hinzufügen könnte, das bei der Beantwortung dieser Frage helfen würde? –

Antwort

7

Um an die gesendeten Bytes zu gelangen, können Sie die HttpResponse.Filter Eigenschaft verwenden. Wie die MSDN-Dokumente sagen, ruft diese Eigenschaft ein Wrapping-Filterobjekt ab, das zum Ändern des HTTP-Entitätsrumpfs vor der Übertragung verwendet wird, oder legt dieses fest.

Sie können eine neue System.IO.Stream erstellen, die den vorhandenen Stream HttpResponse.Filter umschließt und die an die Methode Write übergebenen Bytes zählt, bevor sie übergeben werden. Zum Beispiel:

public class ContentLengthModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += OnBeginRequest; 
     context.EndRequest += OnEndRequest; 
    } 

    void OnBeginRequest(object sender, EventArgs e) 
    { 
     var application = (HttpApplication) sender; 
     application.Response.Filter = new ContentLengthFilter(application.Response.Filter); 
    } 

    void OnEndRequest(object sender, EventArgs e) 
    { 
     var application = (HttpApplication) sender; 
     var contentLengthFilter = (ContentLengthFilter) application.Response.Filter; 
     var contentLength = contentLengthFilter.BytesWritten; 
    } 

    public void Dispose() 
    { 
    } 
} 

public class ContentLengthFilter : Stream 
{ 
    private readonly Stream _responseFilter; 

    public int BytesWritten { get; set; } 

    public ContentLengthFilter(Stream responseFilter) 
    { 
     _responseFilter = responseFilter; 
    } 

    public override void Flush() 
    { 
     _responseFilter.Flush(); 
    } 

    public override long Seek(long offset, SeekOrigin origin) 
    { 
     return _responseFilter.Seek(offset, origin); 
    } 

    public override void SetLength(long value) 
    { 
     _responseFilter.SetLength(value); 
    } 

    public override int Read(byte[] buffer, int offset, int count) 
    { 
     return _responseFilter.Read(buffer, offset, count); 
    } 

    public override void Write(byte[] buffer, int offset, int count) 
    { 
     BytesWritten += count; 
     _responseFilter.Write(buffer, offset, count); 
    } 

    public override bool CanRead 
    { 
     get { return _responseFilter.CanRead; } 
    } 

    public override bool CanSeek 
    { 
     get { return _responseFilter.CanSeek; } 
    } 

    public override bool CanWrite 
    { 
     get { return _responseFilter.CanWrite; } 
    } 

    public override long Length 
    { 
     get { return _responseFilter.Length; } 
    } 

    public override long Position 
    { 
     get { return _responseFilter.Position; } 
     set { _responseFilter.Position = value; } 
    } 
} 
+0

Danke für die sehr vollständige Antwort und Codebeispiel. Jetzt brauche ich nur eine Chance, es anzuschließen und es auszuprobieren. –

+0

Genau das habe ich gebraucht. Danke nochmal. –