我有一个服务REST API,我试图连接。 使用浏览器一切正常。
但是在c#中我总是有未经授权的回答。
我使用fiddler调查了这个问题,并发现在第一个不成功的reuest服务器返回一些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);
最后一行抛出异常。
当我在Fiddler调查此问题时,我发现在第一个状态为401的会话中,我们收到了cookie(如下图所示)。 fiddler's picture 浏览器在下一个请求中发送此cookie并成功进行身份验证。 但是在c#中我无法用状态401来表示这个响应。正如我在fiddler工作室看到的那样,尝试在每个下一个秒内打开新的会话10-20次,然后才会抛出超时异常。我的回答是null。
此外,我还有其他不需要cookie的环境,我的代码正在运行。
请给我一个建议锄头以获得状态401的响应并从中获取cookie以将其设置为另一个请求。
感谢 麦克
答案 0 :(得分:0)
我使用带有定义的空(非空)CookieContainer的HttpWebRequest解决了这个问题。
我的代码:
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的第一个会话之后的此实现中,请求将cookie从第一个会话提供给下一个会话,并返回状态代码200 OK。