【发布时间】:2012-11-10 00:48:17
【问题描述】:
我有以下代码可以成功运行。我不知道如何从响应中获取 cookie。我的目标是我希望能够在请求中设置 cookie 并从响应中获取 cookie。想法?
private async Task<string> Login(string username, string password)
{
try
{
string url = "http://app.agelessemail.com/account/login/";
Uri address = new Uri(url);
var postData = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("username", username),
new KeyValuePair<string, string>("password ", password)
};
HttpContent content = new FormUrlEncodedContent(postData);
var cookieJar = new CookieContainer();
var handler = new HttpClientHandler
{
CookieContainer = cookieJar,
UseCookies = true,
UseDefaultCredentials = false
};
var client = new HttpClient(handler)
{
BaseAddress = address
};
HttpResponseMessage response = await client.PostAsync(url,content);
response.EnsureSuccessStatusCode();
string body = await response.Content.ReadAsStringAsync();
return body;
}
catch (Exception e)
{
return e.ToString();
}
}
这是完整的答案:
HttpResponseMessage response = await client.PostAsync(url,content);
response.EnsureSuccessStatusCode();
Uri uri = new Uri(UrlBase);
var responseCookies = cookieJar.GetCookies(uri);
foreach (Cookie cookie in responseCookies)
{
string cookieName = cookie.Name;
string cookieValue = cookie.Value;
}
【问题讨论】:
-
出于好奇,请问您为什么要在客户端读取cookies?我的理解是cookies是用来向服务器发送信息的,不是用来返回信息的。
-
我在返回 JSON 的调用中使用返回的 cookie,这样我就不必为每个 JSON 调用进行单独的授权调用。也就是说,我有一个调用日志 /Home/GetData ,它返回 JSON 但只有在授权的情况下。在客户端请求中,我添加了 cookie,以便 /Home/GetData 响应。否则它会说“403”未授权。
-
将授权标头设置为默认标头几乎同样有效且更加标准。服务器无法代表客户端自动设置 auth 标头。
-
感谢达雷尔的提示。您是否有任何关于 asp.net 中的示例?我为我的 monotouch 和现在的 windows 商店应用程序而苦苦挣扎。如果有一个简单的方法,我会很高兴。这很痛苦,尤其是在 Windows 商店应用程序上使用 async 和 await now。
标签: c# async-await dotnet-httpclient