2017-06-23 6 views
1

Ich habe dieses Modul:Wenn die HTTP-Header bereits gesendet werden?

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

    public void Init(HttpApplication context) 
    { 
     context.EndRequest += OnEndRequestHandlerExecute; 
    } 

    private void OnEndRequestHandlerExecute(object sender, EventArgs e) 
    { 
     if (!AppConfig.MachineAppSettingsBool("setSecureCookiesForSecureConnections")) 
     { 
      return; 
     } 

     try 
     { 
      HttpApplication app = sender as HttpApplication; 

      if (app.Request.IsReallySecureConnection()) 
      { 
       foreach (string s in app.Response.Cookies.AllKeys) 
       { 
        var cookie = app.Response.Cookies[s]; 

        if (cookie.Secure == false) 
        { 
         cookie.Secure = true; 
         app.Response.Cookies.Add(cookie); 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      LogManager.GetLogger("SecureCookieModule").Error("Exception while processing http module. Ex: {0}", ex); 
     } 
    } 
} 

Daraus, was ich in einigen Fällen werden die Response-Header geschrieben bereits gesendet, damit sie nicht geändert werden und Ausnahme, weil dieser ausgelöst wird. Was ich vermisse ist, in welchen Fällen das passiert und warum? Warum werden sie in einigen Fällen vor dem Ausführen des Ereignisses "OnEndRequestHandlerExecute" gesendet und in anderen Fällen nicht? Was ist die Regel hinter diesen Fällen, die zu diesem Verhalten führen?

Vielen Dank im Voraus!

+2

Wenn der Request-Handler in den Ausgabestream schreibt, können Sie keine Cookies sein einstellen, da diese in den Kopf *** *** ers gehen, die am *** Kopf gehen ** * des Stroms. Dies zu tun ** nachdem der Request-Handler ausgelöst wurde, ist zum Scheitern verurteilt. Ich bin überrascht, dass das überhaupt funktioniert. – spender

+0

Wenn also der Handler direkt in die Antwort schreibt, werden alle Header gesendet. Ich habe es überprüft und so funktioniert es. Vielen Dank. –

Antwort

1

Wenn die Antwort nicht gepuffert ist und die Header bereits gesendet wurden, können Sie sie während des Endanforderungsereignisses nicht ändern, da sie bereits in den Datenstrom zum Browser zurückgeschrieben wurden.

damit umgehen, haben Sie die Wahl:

  1. Schalten response buffering auf. Auf diese Weise wird Ihr aktueller Code in der Lage sein, die Header im Puffer zu ändern (Dies ist möglicherweise keine gute Idee, wenn Sie große Dokumente bereitstellen).

    Response.BufferOutput = true; 
    
  2. Statt EndRequest der Handhabung, Griff PreSendRequestHeaders statt. Dieses Ereignis wird garantiert ausgelöst, bevor die Header in die Antwort geschrieben werden.

    public void Init(HttpApplication context) 
    { 
        context.PreSendRequestHeaders += OnEndRequestHandlerExecute; 
    } 
    
+0

context.PreSendRequestHeaders funktioniert perfekt von mir. Vielen Dank. –

Verwandte Themen