2011-09-25 14 views
11

ten sposób zainicjować sesjęASP.NET + C# HttpContext.Current.Session jest null (Wewnątrz WebService)

protected void Session_Start(object sender, EventArgs e) 
    { 
     HttpContext.Current.Session["CustomSessionId"] = Guid.NewGuid(); 
    } 

w moim roztworu w bibliotece klasy jestem triyng do niego dostęp i uzyskiwanie wyjątku null :

string sess = HttpContext.Current.Session["CustomSessionId"] ; 

to jest mój config w app.config i web.config (w mojej bibliotece)

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
    </system.serviceModel> 
    <system.web> 
     <pages enableSessionState = "true" /> 
     <httpModules> 
     <add type="System.Web.SessionState.SessionStateModule" name="Session"/> 
     </httpModules> 
     <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 

(app.config)

+0

Na jakim etapie wykonywania żądania HTTP wywołujesz metodę w bibliotece klas, która próbuje uzyskać dostęp do sesji? –

+0

trudno powiedzieć, ale myślę, że to nie twoja sesja jest null, ale HttpContext.Current - i BTW: czy wiesz, że próbujesz przekonwertować Guid na ciąg, nawet jeśli to działa? – Carsten

+0

W rzeczywistości jest to wewnątrz usługi sieciowej, o której nie wspomniałem (źle edytuj mój wpis). – SexyMF

Odpowiedz

28

Według twoich komentarzy wygląda na to, że próbujesz uzyskać dostęp do sesji w usłudze internetowej. Serwisy internetowe są bezpaństwowcami i tak powinny być. Jeśli chcesz narusza tę zasadę i uczynić je Stateful można włączyć sesje w klasycznym usługa WWW ASMX jak ten:

[WebMethod(EnableSession = true)] 
public void SomeMethod() 
{ 
    ... invoke the method in your class library that uses Session 
} 

tym mówi się, używając HttpContext.Current w bibliotece klasy jest bardzo praktyka, że ​​należy unikać cała cena.

+0

Dopóki nie mogę zaznaczyć "V" dla ciebie, czy możesz wyjaśnić, dlaczego nie jest to zalecane? dzięki – SexyMF

+1

@putin, jest wiele powodów. Na przykład HttpContext.Current jest metodą statyczną, która działa tylko w kontekście sieciowym. Oznacza to, że nigdy nie będziesz w stanie samodzielnie przetestować funkcji biblioteki klas, jeśli polegają na niej. Inną wadą jest to, że aktywnie łączysz bibliotekę klasy ze środowiskiem ASP.NET, a biblioteki klas są przeznaczone do wielokrotnego użytku. Jeśli chodzi o część sesji, sesje są domyślnie przechowywane w pamięci serwera WWW. Na przykład, jeśli uruchomisz farmę sieciową, sesja musi być rozpowszechniana ... –

+0

... we wszystkich węzłach tej farmy sieci Web lub klienta, którego sesja utworzona na węźle1 nie znajdzie go w węźle2. Sesje sprawiają, że aplikacje internetowe stają się stanowe i trudniejsze do skalowania z tego powodu. Unikaj ich za wszelką cenę. W świecie HTTP istnieje tak wiele innych technik, które pozwoliłyby uzyskać aplikacje bezpaństwowe, z których powinieneś skorzystać. –

Powiązane problemy