2009-08-25 65 views
1

我們正在使用網站的Web服務與外部服務器進行通信。 外部服務器請求會話ID。HttpWebRequest:如何獲取會話ID

我們下面的代碼向外部服務器:

HttpWebRequest webRequest = WebRequest.Create(ExtUrl) as HttpWebRequest; 
webRequest.Credentials = new NetworkCredential(ExtAccountToUse, ExtPassword); 
HttpWebResponse webResponse; 
webRequest.Method = "POST"; 
webRequest.ContentType = "application/x-www-form-urlencoded";     
StreamWriter writer = new StreamWriter(webRequest.GetRequestStream()); 
writer.Write(xmlOutput); 
writer.Close();    
webResponse = webRequest.GetResponse() as HttpWebResponse; 

是否有可能得到一個會話ID發送到外部服務器?

感謝您的時間

+0

您似乎在發送XML(xmlOutput),但您將內容類型設置爲標準HTML表單文章,這有點奇怪,爲什麼不使用「text/xml」作爲內容類型? – AnthonyWJones 2009-08-25 09:52:28

+0

外部服務器以什麼方式「請求會話ID」。 – AnthonyWJones 2009-08-25 09:53:21

+0

外部服務器在發送給服務器的第一個請求上是否要求會話ID?因爲應該由目標服務器負責生成一個有效的會話標識,然後可以在客戶端中重新使用它。 – 2009-08-25 09:56:12

回答

1

這取決於您要發送請求的服務器的類型。例如,如果您擁有IIS託管的站點,則需要名爲ASP.NET_SessionId(或請求字符串)的會話標識inside a cookie。如果您的Java servlet引擎位於另一端,則需要一個名爲JSESSIONID(或請求路徑參數jsessionid)的cookie。

所以這取決於。但是,在HttpWebRequest中設置Cookie並不困難。您可以使用屬性CookieContainer

CookieContainer cookies = new CookieContainer(); 
cookies.Add(new Cookie("ASP.NET_SessionId", sessionId)); 
request.CookieContainer = cookies; 

您存儲的cookie內的會話標識符應該有特定的格式,並再次,這取決於在另一端的服務器類型。在ASP.NET中,默認情況下SessionIDManager用於生成和驗證會話ID。這個類很難重用,因爲它需要一個HttpContext。但是,您可以使用Reflector檢查它是如何生成會話ID的。

+0

Cookie.domain錯誤。它不能爲空 – Emanuele 2017-04-03 16:06:25

0

儘可能獲取會話ID而言,你可以用得到它:

Session.SessionID 

,但我不認爲你的服務器上的會話ID的任何權益外部服務器。

+0

我懷疑使用當前服務器會話ID在與外部服務器交談時很有用。 – AnthonyWJones 2009-08-25 09:57:05

+0

我沒有使用這種方式,但感謝您的時間 – Xstahef 2009-08-25 12:37:17

1

如果您的意思是外部服務器需要一個現有的會話ID來標識發送給它的先前請求所創建的會話,那麼您需要爲涉及的所有請求維護一個CookieContainer的實例。

CookieContainer myExternalServerCookies = new CookieContainer(); 

隨着每次使用去跟外部服務器的HttpWebRequest包括此行: -

request.CookieContainer = myExternalServerCookies; 

現在,當外部服務器設置一個會話cookie,它會看到在後續請求該cookie。