我正在尝试使用HttpClient将一些数据从我的应用程序传输到特定的Web服务。为此,我首先必须登录到Web服务并接收cookie(这是Web服务使用的身份验证方法(。我是这样做的:
Uri uri = "login_uri";
CookieContainer CookieContainer_login = new CookieContainer();
HttpClientHandler ch = new HttpClientHandler
{
AllowAutoRedirect = true,
CookieContainer = CookieContainer_login,
UseCookies = true
};
HttpClient client = new HttpClient(ch);
List<KeyValuePair<string, string>> pairs = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("user", "test"),
new KeyValuePair<string, string>("password", "test"),
new KeyValuePair<string, string>("loginSource", "0")
};
FormUrlEncodedContent content = new FormUrlEncodedContent(pairs);
System.Threading.Tasks.Task<HttpResponseMessage> response = client.PostAsync(uri, content);
它有效,我收到有关通过提琴手成功登录的消息。现在,为了使用Web服务(另一个Uri(,例如发送POST请求,我必须将我的cookie(在登录过程中收到(传递给该请求。当我将 cookie 存储在名为 CookieContainer CookieContainer_login时,我想我可以简单地使用相同的客户端,并且只更改 PostAsync 方法中的 Uri,或者使用相同的 HttpClientHandler 和 CookieContainer 创建一个新客户端。不幸的是,它没有奏效。实际上,我发现,即使在登录过程之后,我的CookieContainer也是空的。
我试图用HttpWebRequest重新创建它,就像这样:
string url_login = "login_uri";
string logparam = "user=test&password=test&loginSource=0";
HttpWebRequest loginRequest = (HttpWebRequest)WebRequest.Create(url_login);
loginRequest.ContentType = "application/x-www-form-urlencoded";
loginRequest.Accept = "text/xml";
loginRequest.Method = "POST";
loginRequest.CookieContainer = CookieContainer_login;
byte[] byteArray = Encoding.UTF8.GetBytes(logparam);
loginRequest.ContentLength = byteArray.Length;
Stream dataStream_login = loginRequest.GetRequestStream();
dataStream_login.Write(byteArray, 0, byteArray.Length);
它有效,我也会收到成功的登录消息,但是当我检查 CookieContainer 计数时,它会显示登录后存储的 3 个 cookie。现在我的问题是,为什么HttpClient在CookieContainer中没有cookie,而HttpWebRequest却有?如何使用HttpClient获取cookie?
好的,我设法解决了我的问题,希望我的答案对有类似问题的人有用。就我而言,错误在于方法后异步调用。这是一个异步方法,因此它需要一个我缺少的await
运算符。正确的方法调用应如下所示:
HttpResponseMessage response = new HttpResponseMessage();
response = await client.PostAsync(uri, content);
现在所有的饼干都存储在我的饼干容器中。