2012-03-28 9 views
2

Ich habe ein HttpModule, das ich erstellt und auf IIS 6 mit Windows Server 2003 ausgeführt. Ich kann Cookies an den Browser senden, aber ich kann sie nicht bei der nächsten Anfrage lesen, Cookie ist immer Null.HttpModule empfängt keine Cookies auf IIS 6

Wenn ich dieses Modul auf IIS 7 ausführen, funktioniert es jedoch einwandfrei. IIS 7 ist im Moment keine Option, da wir nicht umgeschaltet haben und dies muss erledigt werden, bevor das passieren wird.

Außerdem habe ich bereits versucht, den PostAcquireRequestState-Hook zu verwenden.

public void Init(HttpApplication httpApp) 
    { 
     httpApp.BeginRequest += OnBeginRequest; 
    } 

    public void OnBeginRequest(Object sender, EventArgs e) 
    { 
     var httpApp = (HttpApplication)sender; 
     var context = httpApp.Context; 

     const string cookieName = "sId"; 

     if (!string.IsNullOrEmpty(context.Request.QueryString["cookie"])) 
     { 
      var ck = new HttpCookie(cookieName) 
          { 
           Value = httpApp.Context.Request.QueryString["cookie"], 
           Expires = DateTime.Now.AddDays(1) 
          }; 

      httpApp.Response.Cookies.Add(ck); 
     } 
     else 
     { 
      var cookie = httpApp.Request.Cookies[cookieName] 
     } 
    } 

Antwort

1

Ihr Code aussehen worked.the Problem in der Client-Seite auftreten können, wie die nächste page.you aufzufordern, die Firebug mit Firefox oder den Fidder Tools verwenden können, die Ihre clientseitige Anforderung anmelden und sehen die Anfrage, ob der Cook-Wert im Anfrage-Header an den Server gesendet wird.

zum Beispiel

der Request-Header:

get /1.aspx 
..... 
Cookie: sId=123 [if the client has a cookie then it will appear in here.] 

die Antwort-Header:

Set-Cookie: sId=123; expires=Fri, 30-Mar-2012 07:20:23 GMT; 
path=/ 

, wenn die Server-Cookie auf die Antwort hinzufügen, dann Antwort darauf, wie die oben schauen.

jetzt, ich denke, das Problem in Ihrem Koch-Domain oder Cookie-Pfad ist anders.

die beste Methode Cookie zu setzen ist wie die Folgecode:

var ck = new HttpCookie(cookieName) 
{ 
    Value = httpApp.Context.Request.QueryString["cookie"], 
    Expires = DateTime.Now.AddDays(1), 
    Path="/", 
    Domain="your domain" 
}; 

viel Glück.

+0

Vielen Dank für die Hilfe. Dies führte mich zur eigentlichen Ursache des Problems, nämlich dass ich keine Cookies über statische Dateianforderungen senden kann. Meine ursprüngliche Anfrage muss eine ASP- oder ASPX-Datei sein, um den Cookie zu setzen, dann kann mein HttpModule die Cookies nach Bedarf lesen. Sorry für das bisschen Miss Informationen am Anfang, ich hätte schwören können, dass der Server tatsächlich den Cookie gelesen hat, lol. – James

+0

Sie sind willkommen, ich weiß, warum Sie traurig, die Anwendung mit IIS7 ist in Ordnung, weil Sie integrierten Pool in IIS7 verwenden. – zhengchun

0

Dank Zhengchun konnte ich an die Wurzel des Problems gelangen. Es stellte sich heraus, dass ich den Cookie nicht über Anfragen an statische Dateien setzen konnte. Ich habe ASPX-Dateien für meine anfänglichen Anforderungen erstellt, die nach dem Setzen des Cookies in die statischen Dateien umgeleitet wurden. Mein HttpModule konnte dann den Cookie lesen, nachdem er in der ASPX-Datei festgelegt wurde. Nicht sicher, warum ich eine .aspx-Datei brauche, um den Cookie anstelle des HttpModules zu setzen, aber das hat es behoben.

3

Ich stieß auf ein ähnliches Problem, aber hatte eine andere Lösung, also dachte ich, ich würde teilen, falls es jemand hilft. Ich nahm auch den Vorschlag von Zengchun, einige Tools zu verwenden, um die Anfrage-Header & zu überprüfen. Da ich IE benutze, funktioniert das F12 Dev Tools großartig dafür. Sobald ich den Antwort-Header für den Cookie sah, bemerkte ich, dass die sichere Flagge gesetzt war. Sicher genug, ich hatte Code von einer SSL-gehosteten Produktions-Site auf eine Test-Site kopiert, die kein SSL verwendet, also verhinderte das sichere Flag auf dem Cookie, dass der Code es lesen konnte. Ich habe die web.config aktualisiert, um requireSSL vom httpcookies-Knoten zu entfernen, und meine Site hat angefangen zu arbeiten. :)