2011-09-25 42 views
11

這是我發起會話ASP.NET + C#HttpContext.Current.Session爲空(裏面的WebService)

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

在我的下一個類庫解決方案,我很triyng進行訪問和獲取零例外:

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

這是我在web.config中和的app.config配置(在我的庫)

<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

執行HTTP請求的哪個階段是你調用你的類庫中的方法試圖訪問會話? –

+0

很難說,但我認爲這不是你的會議是空的,但HttpContext.Current - 和順便說一句:你知道你試圖將一個Guid轉換爲一個字符串,即使這有效嗎? – Carsten

+0

其實它是在一個web服務,我沒有提到(虐待編輯我的帖子) – SexyMF

回答

28

根據你的意見,你似乎試圖訪問Web服務中的會話。 Web服務是無狀態的,他們應該是這樣。如果要違背這個規律,讓他們級狀態,你可以啓用這樣一個經典的ASMX Web服務會話:

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

這就是說,在類庫使用HttpContext.Current是應該回避的非常做法所有的價格。

+0

直到我可以打勾爲你的「V」,你能解釋爲什麼它不被推薦這麼做嗎?謝謝 – SexyMF

+1

@putin,原因很多。例如HttpContext.Current是一個靜態方法,它只能在Web上下文中使用。這意味着如果他們依賴它,你將永遠無法單獨測試你的類庫函數。另一個缺點是您正在將您的類庫耦合到ASP.NET環境中,並且類庫是可重用的組件。就Session部分而言,會話默認存儲在Web服務器的內存中。因此,例如,如果您在Web場中運行,則會話必須分發... –

+0

...跨該Web場的所有節點或在node1上創建其會話時創建的客戶端在節點2上找不到它。由於這個原因,會話使Web應用程序變爲有狀態並且更難以擴展。不惜一切代價避免它們。 HTTP世界中有很多其他技術可以讓你實現無狀態的應用程序,你應該從中受益。 –

相關問題