2013-07-04 64 views
1

我有以下方法的ASMX Web服務:爲什麼SessionID不同?

[WebMethod(Description = "Test", EnableSession = true)] 
public string DoWork(string param) 
{ 
    string user = Session["user"].ToString(); 
} 

當我打電話使用AJAX從客戶端這種方法後,SessionID保持不變(爲aspx頁面和Web服務),但是當我把這個方法從服務器端代碼(在按鈕單擊事件上)SessionId被更改:

ServiceReference1.MyServiceSoapClient obj = new ServiceReference1.MyServiceSoapClient(); 
string user=Session["user"]; 
obj.DoWork("Test string"); 

爲什麼SESSIONID被更改? 如何保持兩者相同?

回答

2

您是否想過在每種情況下從哪裏打電話?在服務器端調用中,您正在從服務器調用它自己,因此這會創建一個新會話,而在另一種情況下,您使用的是相同的客戶端,因此在這種情況下會話不會更改。

如果您需要更清晰一點的圖片,請從Web服務角度來看這一點。在一種情況下,客戶端是Web瀏覽器,而在另一種情況下,客戶端本身是不同的,因此SessionID應該被改變。


假設你有服務器查詢本身就是一個很好的理由,我可能會考慮增加一個參數,可以傳遞web服務,可以允許一些數據來否則你會被共享有能力劫持會議。


如果Web服務和aspx頁面在同一臺服務器,那麼無論功能的Web服務訪問,可以在代碼中直接訪問該網頁的背後。您可以將Web服務中的「DoWork」方法的邏輯放入網頁和Web服務都可以訪問的DLL中,並且這將允許不更改SessionID,因爲同一個客戶端正在請求。

+0

好吧,那我怎麼能保持它們一樣? – user1390378

+1

@ user1390378爲什麼要讓服務器通過設計爲外部API的SOAP調用來調用自己的代碼?爲什麼不直接調用預期的功能,如果代碼已經在運行服務器端? – MerickOWA

+0

@MerickowA:你怎麼樣,舉個例子? – user1390378