2008-10-20 6 views
41

Ohne Routing, HttpContext.Current.Session ist da, so dass ich weiß, dass die StateServer funktioniert. Wenn ich meine Anfragen route, ist HttpContext.Current.Sessionnull in der gerouteten Seite. Ich verwende .NET 3.5 SP1 auf IIS 7.0, ohne die MVC-Vorschauen. Es scheint, dass AcquireRequestState nie ausgelöst wird, wenn die Routen verwendet werden, und daher wird die Sitzungsvariable nicht instanziiert/gefüllt.HttpContext.Current.Session ist null, wenn Anfragen weitergeleitet werden

Wenn ich versuche, die Session-Variablen zuzugreifen, bekomme ich diesen Fehler:

base {System.Runtime.InteropServices.ExternalException} = {"Session state can only be used when enableSessionState is set to true, either in a configuration file or in the Page directive. Please also make sure that System.Web.SessionStateModule or a custom session state module is included in the <configuration>.

Während des Debuggens, erhalte ich auch den Fehler, dass die HttpContext.Current.Session in diesem Zusammenhang nicht zugänglich ist.

-

Mein web.config sieht wie folgt aus:

<configuration> 
    ... 
    <system.web> 
    <pages enableSessionState="true"> 
     <controls> 
     ... 
     </controls> 
    </pages> 
    ... 
    </system.web> 
    <sessionState cookieless="AutoDetect" mode="StateServer" timeout="22" /> 
    ... 
</configuration> 

Hier ist die IRouteHandler Umsetzung:

public class WebPageRouteHandler : IRouteHandler, IRequiresSessionState 
{ 
    public string m_VirtualPath { get; private set; } 
    public bool m_CheckPhysicalUrlAccess { get; set; } 

    public WebPageRouteHandler(string virtualPath) : this(virtualPath, false) 
    { 
    } 
    public WebPageRouteHandler(string virtualPath, bool checkPhysicalUrlAccess) 
    { 
     m_VirtualPath = virtualPath; 
     m_CheckPhysicalUrlAccess = checkPhysicalUrlAccess; 
    } 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     if (m_CheckPhysicalUrlAccess 
      && !UrlAuthorizationModule.CheckUrlAccessForPrincipal(
        m_VirtualPath, 
        requestContext.HttpContext.User, 
        requestContext.HttpContext.Request.HttpMethod)) 
     { 
      throw new SecurityException(); 
     } 

     string var = String.Empty; 
     foreach (var value in requestContext.RouteData.Values) 
     { 
      requestContext.HttpContext.Items[value.Key] = value.Value; 
     } 

     Page page = BuildManager.CreateInstanceFromVirtualPath(
         m_VirtualPath, 
         typeof(Page)) as Page;// IHttpHandler; 

     if (page != null) 
     { 
      return page; 
     } 
     return page; 
    } 
} 

Ich habe auch an der Spitze der aspx Seiten zu setzen EnableSessionState="True" versucht aber immer noch nichts.

Irgendwelche Einsichten? Sollte ich einen anderen HttpRequestHandler schreiben, der IRequiresSessionState implementiert?

Danke.

Antwort

52

Verstanden. Ganz dumm, eigentlich. Es funktionierte, nachdem ich entfernt & die Session wie so hinzugefügt:

<configuration> 
    ... 
    <system.webServer> 
    ... 
    <modules> 
     <remove name="Session" /> 
     <add name="Session" type="System.Web.SessionState.SessionStateModule"/> 
     ... 
    </modules> 
    </system.webServer> 
</configuration> 

einfach hinzugefügt, es wird nicht funktionieren, da „Session“ bereits in den machine.config definiert worden sein soll.

Nun, ich frage mich, ob das das Übliche ist. Es scheint sicherlich nicht so, da es so roh scheint ...

+3

Danke dafür. Es löste mein Problem gut - wie es sich herausstellte, brauchte der Produktionsserver es, aber nicht die Dev-Maschine. – Raithlin

+2

Das ist ins @ ne! Vielen Dank. Dadurch wurden meine Werte für "TempData" (mvc razor) ebenfalls behoben (da TempData Session verwendet). Heiliger Moly. – granadaCoder

+0

Ich habe das Problem der TempData-Werte verschwinden, aber das hat es nicht gelöst. – Dinei

0

Es scheint, dass Sie vergessen haben, Ihre Statusserveradresse in der Datei config hinzuzufügen.

<sessionstate mode="StateServer" timeout="20" server="127.0.0.1" port="42424" /> 
+1

Versucht es aber immer noch das gleiche. Es sollte nicht wirklich wichtig sein mit seinem Standardwert: "tcpip = loopback: 42424" (http://msdn.microsoft.com/en-us/library/system.web.configuration.sessionstatesection.stateconnectionstring.aspx) Ich bezweifle, dass das Problem im Session-Provider ist, da es ohne das Routing funktioniert. – Loki

0

Der Config-Abschnitt scheint Sound, wie es funktioniert, wenn auf Seiten normal zugegriffen wird. Ich habe versucht, die anderen Konfigurationen vorgeschlagen, aber das Problem ist immer noch da.

Ich bezweifle, dass das Problem im Session-Provider ist, da es ohne das Routing funktioniert.

2

Was @Bogdan Maxim sagte. Oder ändern Sie die Verwendung von InProc, wenn Sie keinen externen Sitzungsstatusserver verwenden.

<sessionState mode="InProc" timeout="20" cookieless="AutoDetect" /> 

Blick here für weitere Informationen über die Session Richtlinie.

+0

SessionState funktioniert, wenn ich normal auf die Seite zugreife. Wenn ich Routing verwende, ist HttpContext.Current.Session null. Der Abschnitt scheint in der Konfiguration zu funktionieren. – Loki

0

Ich denke, dass dieser Teil des Codes Änderungen am Kontext vornehmen.

Page page = BuildManager.CreateInstanceFromVirtualPath(
         m_VirtualPath, 
         typeof(Page)) as Page;// IHttpHandler; 

Auch dieser Teil des Codes ist nutzlos:

if (page != null) 
{ 
    return page; 
} 
return page; 

Es wird immer die Seite welken zurückkehren, es ist null oder nicht.

+0

Danke für die Erinnerung an mich. Das war ein rudimentärer Code, nachdem ich so viele Dinge ausprobiert hatte. : D – Loki

3

Gute Arbeit! Ich habe genau das gleiche Problem. Das Hinzufügen und Entfernen des Session-Moduls funktionierte auch für mich perfekt. Es wurde jedoch nicht von HttpContext.Current.User zurückgegeben, also habe ich deinen kleinen Trick mit dem FormsAuth-Modul ausprobiert, und das ist es auch.

<remove name="FormsAuthentication" /> 
<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/> 
23

Fügen Sie einfach Attribut runAllManagedModulesForAllRequests="true"-system.webServer\modules in web.config.

Dieses Attribut ist standardmäßig in MVC- und Dynamic Data-Projekten aktiviert.

+1

Super! Dies ist die Antwort, die ich suchte ... viel besser als die akzeptierte. –

+6

Lesen Sie etwas Shanselman, um zu erfahren, warum rammfar für Ihre (Server-) Gesundheit schlecht sein kann: http://www.hanselman.com/blog/BackToBasicsDynamicImageGenerationASPNETControllersRoutingIHttpHandlersAndRunAllManagedModulesForAllRequests.aspx – Peter

+0

Arbeitete für mich, aber ja, lesen Sie den Link von @Peter geliefert. –

1

eine bessere Lösung ist

runAllManagedModulesForAllRequest eine clevere Sache ist Session-Modul zu tun, Respekt zu entfernen und resinserting.

alk.

14

runAllManagedModulesForAllRequests=true ist eigentlich eine wirklich schlechte Lösung. Dies hat die Ladezeit meiner Anwendung um 200% erhöht. Die bessere Lösung besteht darin, das Sitzungsobjekt manuell zu entfernen und hinzuzufügen und den Lauf zu vermeiden, in dem alle verwalteten Module alle Attribute zusammenführen.

0

ich einen Verweis auf System.Web.Mvc dll in der Sitzung Adapter fehlt, und das Hinzufügen der gleichen festen das Problem.

Hoffentlich hilft es jemand anderem durch dasselbe Szenario zu gehen.

+0

Was bedeutet das? Was sind die Schritte, um dies zu tun? – paulwhit

+0

Entschuldigung, ich konnte deine Frage nicht verstehen. Über welche Schritte sprichst du? Ich habe einen Verweis auf "System.web.mvc dll" hinzugefügt, indem ich mit der rechten Maustaste auf Referenzen auf dem mvc-Projekt im Visual Studio klicke –

1

Keine der oben genannten Lösungen funktionierte für mich. Ich fügte die folgende Methode in global.asax.cs dann Sitzung war nicht null:

+0

Vielen Dank. Dieser hat für mich gearbeitet! :) –

Verwandte Themen