2016-02-15 44 views
1

我有一個服務REST API,我嘗試連接。 使用瀏覽器一切正常。身份驗證到REST API:使用Cookie的摘要類型(c#)

但在c#中我總是有一個未經授權的答案。

我使用fiddler調查了這個問題,發現在第一次不成功時,request服務器返回一些cookie,並且瀏覽器在用戶名/密碼(摘要類型)的下一個會話中使用它。在這種情況下,第二個會話成功。我嘗試使用c#發送請求(我嘗試使用System.Net.WebClient和HttpWebRequest)我沒有得到響應(一段時間後我有超時異常)。

我的代碼:

WebClient webClient = new WebClient(); 
CredentialCache cache = new CredentialCache(); 
Uri prefix = new Uri(Url); 
cache.Add(prefix, "Digest", new NetworkCredential(login, password)); 
webClient.Credentials = cache; 
... 

string response = webClient.DownloadString(restRequest); 

最後一行拋出異常。

當我在小提琴手調查這個問題時,我發現在401狀態的第一次會話中,我們收到cookie(如下圖所示)。 fiddler's picture 瀏覽器在下一個請求中發送該cookie,並且認證成功發生。 但在c#中,我無法用狀態401來回應這個響應。正如我在fiddler studio中看到的,嘗試在超時異常將被拋出之前的每個下一秒期間打開新的會話10-20次。我的答覆在零。

另外我有其他環境沒有要求的cookie,那裏我的代碼工作。

請給我一個建議鋤頭以獲得對狀態401的響應,並從它獲取cookie以將其設置爲另一個請求。

感謝 麥克

回答

0

我決定使用的HttpWebRequest與定義空(NOT NULL)的CookieContainer這個問題。

我的代碼:

HttpWebRequest request1; 
HttpWebResponse response1 = null; 
String responseBody; 
request1 = (HttpWebRequest) WebRequest.Create(requestString); 
request1.Credentials = cache; 

request1.CookieContainer = new CookieContainer();    

response1 = (HttpWebResponse) request1.GetResponse(); 
using (StreamReader stream = new StreamReader(response1.GetResponseStream(), Encoding.UTF8)) 
    { 
     responseBody = stream.ReadToEnd(); 
    } 

在此實現與狀態401項請求第一次會議之後,從第一屆到下一個提供餅乾,並與狀態碼200 OK返回。