2009-01-27 37 views
3

我有一個Web服務,只有當我登錄到該Web服務所在的網站時才能打。我需要遠程測試服務。所以我寫了一些代碼來創建一個虛假的會話,在另一個瀏覽器中登錄到該網站。然後我創建了HTTP Web Request,並試圖設置一個包含該登錄用戶的ASP.NET會話ID的cookie。但是,該Web服務未檢測到該Web請求是已登錄的用戶或會話。我需要什麼給Web服務說服它這是一個有效的會議?如何向ASP.NET Web服務創建HTTPWebRequest並顯示我已登錄到該域?

// used on each read operation 

byte[] buf = new byte[8192]; 

CookieContainer myContainer = new CookieContainer(); 

string sessionID = SessionID; 

myContainer.Add(new Cookie("ASP.NET_SessionId", sessionID, "/", WebsiteUrl)); 

// prepare the web page we will be asking for 
HttpWebRequest request = (HttpWebRequest) 
    WebRequest.Create(CreateWebserviceUrl("doneScreenScore")); 
request.ContentType = "text/xml; charset=utf-8";    
request.Method = "POST"; 
request.Accept = "text/xml"; 
request.Headers.Add("SOAPAction", "http://detectent.net/doneScreenScore"); 

request.CookieContainer = myContainer; 

Stream s = request.GetRequestStream(); 

string soaprequest = ""; 
soaprequest += "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; 
soaprequest += "<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">"; 
soaprequest += " <soap12:Body>"; 
soaprequest += " <doneScreenScore xmlns=\"http://detectent.net/\">"; 
soaprequest += "  <input1>string</input1>"; 
soaprequest += "<input2>string</input2>"; 
soaprequest += "<input3>string</input3>"; 
soaprequest += "<input4>string</input4>"; 
soaprequest += "</doneScreenScore>"; 
soaprequest += "</soap12:Body>"; 
soaprequest += "</soap12:Envelope>"; 

s.Write(System.Text.Encoding.ASCII.GetBytes(soaprequest), 0, soaprequest.Length); 

s.Close(); 

// execute the request 
HttpWebResponse response = (HttpWebResponse) 
    request.GetResponse(); 

// we will read data via the response stream 
Stream resStream = response.GetResponseStream(); 
string responseFromWebServiceCall = ReadResponseStream(resStream); 

回答

1

我認爲你可以做的憑據...我這樣做了Web服務的東西...

rpt.Credentials = new System.Net.NetworkCredential(UserName, Password, Domain);

1

沒有真正搞砸這個東西我自己我不能告訴你爲什麼它不工作。不過,我已經做了一些工作來編寫僞裝成典型用戶用於測試目的的應用程序,而我建議您熟悉的工具稱爲WireShark。 (以前稱爲Ethereal)

WireShark是一個數據包嗅探器。如果您在瀏覽網站時通常運行它,您將能夠看到瀏覽器和Web服務器之間來回傳送的所有數據。一旦找到需要向這個Web服務發出請求的信息,您就應該可以毫無困難地構建一個以相同方式運行的正確的WebRequest。

您可以從official site下載WireShark。

0

的NetworkCredentials如果網站使用Windows身份驗證工作。

我在做這類事情時模仿瀏覽器的成功程度各不相同。通常我必須首先向他們的登錄頁面發出有效的請求。該響應將包含一個帶有SessionID的cookie。只要我在之後的所有請求中重複使用相同的CookieCollection(即每個請求重複使用一個全局CookieCollection),它就可以正常工作。

奇怪的是,我仍然發現一個網站不會識別我新登錄的會話。在這種情況下,我手動使用FireFox登錄並使用WebDeveloper工具欄查看cookie。我獲取cookie名稱/值並將它們放入應用程序設置中,程序使用它來填充cookie集合。

確保你欺騙了一個有效的useragent。我曾因爲這個原因而拒絕了我。