2017-06-23 2 views
1

J'ai ce module:Lorsque les en-têtes HTTP sont déjà envoyés?

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

De ce que j'ai écrit dans certains cas, les en-têtes de réponse sont déjà envoyés, de sorte qu'ils ne peuvent pas être modifiés et exception est levée à cause de cela. Ce qui me manque, c'est dans quels cas cela arrive et pourquoi? Pourquoi dans certains cas avant d'exécuter l'événement "OnEndRequestHandlerExecute" ils sont envoyés et dans d'autres cas ils ne le sont pas? Quelle est la règle derrière ces cas résultant de ce comportement?

Merci d'avance!

+2

Si le gestionnaire de requêtes écrit dans le flux de sortie, vous ne pouvez pas être la définition de cookies, car ceux-ci vont dans le *** tête *** ers qui vont à la tête *** ** * du flux Faire cela ** après que ** le gestionnaire de requêtes a été déclenché est voué à l'échec. Je suis surpris que cela fonctionne du tout. – spender

+0

Ainsi, lorsque le gestionnaire écrit directement dans la réponse, tous les en-têtes sont envoyés. Je l'ai vérifié et c'est ainsi que ça fonctionne. Merci. –

Répondre

1

Si la réponse n'est pas mise en mémoire tampon et que les en-têtes sont déjà envoyés, vous ne pouvez pas les modifier pendant l'événement de demande de fin, car ils ont déjà été réécrits dans le flux de données du navigateur.

Pour faire face à cela, vous avez le choix:

  1. tour response buffering sur. De cette façon, votre code actuel sera en mesure de modifier les en-têtes dans le tampon (cela peut ne pas être une bonne idée si vous servez des documents volumineux).

    Response.BufferOutput = true; 
    
  2. au lieu de traiter EndRequest, gérer PreSendRequestHeaders à la place. Cet événement est garanti avant que les en-têtes ne soient écrits dans la réponse.

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

context.PreSendRequestHeaders fonctionne parfaitement à ma place. Merci. –