gpt4 book ai didi

c# - 如何使用 HttpClient 返回 "refresh"cookie

转载 作者:太空宇宙 更新时间:2023-11-03 15:23:05 25 4
gpt4 key购买 nike

我在一个 Xamarin.Forms 项目上工作,我在其中调用一些使用 cookiesWebServices,因为它们最初是为网站制作的。有一些网络服务只返回 cookie,但其他网络服务需要接收 cookie 才能正常工作。

例如,Login 网络服务获取一个 JSON 并返回 2 个 cookie,而 Logout 网络服务获取一个“空”JSON,之前的 2 个 cookie,并且必须为其中一个 cookie 返回更新后的值。

我基于以下链接用HttpClient管理cookies: Struggling trying to get cookie out of response with HttpClient in .net 4.5

我的问题是我可以将 cookie 发送到网络服务,我可以接收网络服务返回的 cookie,但是如果我在调用之前发送了它,我将无法接收到任何“更新的”cookie...

调用Login 网络服务的代码如下所示:

public async Task Login()
{
Uri uri = new Uri("http://www.website.com/Login");

CookieContainer cookies = new CookieContainer();
HttpClientHandler handler = new HttpClientHandler();
handler.CookieContainer = cookies;

var httpClient = new HttpClient(handler);

var jsonParam = "{\"data\":{\"device\":\"xxx\",\"login\":\"my@email.com\",\"password\":\"password\"}}";

HttpContent httpContent = new StringContent(jsonParam);
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

httpClient.DefaultRequestHeaders.Add("X-HTTP-Method-Override", "PUT");
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

try
{
HttpResponseMessage httpResponse = httpClient.PostAsync(uri), httpContent).Result;
//Treatment of the recovered cookies
IEnumerable<Cookie> responseCookies = cookies.GetCookies(uri).Cast<Cookie>();
foreach (Cookie cookie in responseCookies)
{
Debug.WriteLine(cookie.Name + " : " + cookie.Value);
wsCookies.Add(new KeyValuePair<string, string>(cookie.Name, cookie.Value));
}

if (httpResponse.IsSuccessStatusCode)
{
var responseText = await httpResponse.Content.ReadAsStringAsync();
}
}
catch (Exception e)
{

}
}

=> 它运行良好:我得到了预期的 cookie:SESSIONID=xxxUSERID=xxx

我的Logout 方法的代码如下所示:

public async Task Logout(String test)
{
Uri uri = new Uri("http://www.website.com/Logout");

CookieContainer cookies = new CookieContainer();
HttpClientHandler handler = new HttpClientHandler();
handler.CookieContainer = cookies;

var httpClient = new HttpClient(handler);

var jsonParam = "{\"data\":{}}";

HttpContent httpContent = new StringContent(jsonParam);
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

httpClient.DefaultRequestHeaders.Add("X-HTTP-Method-Override", "GET");
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

//Retrieving cookies to send
foreach (KeyValuePair<string, string> kvpCookie in wsCookies)
{
cookies.Add(uri, new Cookie(kvpCookie.Key, kvpCookie.Value));
}

try
{
HttpResponseMessage httpResponse = httpClient.PostAsync(uri, httpContent).Result;
//Treatment of the recovered cookies
IEnumerable<Cookie> responseCookies = cookies.GetCookies(uri).Cast<Cookie>();
foreach (Cookie cookie in responseCookies)
{
Debug.WriteLine(cookie.Name + " : " + cookie.Value);
wsCookies.Add(new KeyValuePair<string, string>(cookie.Name, cookie.Value));
}

if (httpResponse.IsSuccessStatusCode)
{
var responseText = await httpResponse.Content.ReadAsStringAsync();
}
}
catch (Exception e)
{

}
}

=> 此方法有效,但我没有得到预期的 cookie。我发送了之前收到的 cookie(名称和值)(SESSIONID=xxxUSERID=xxx),但我没有得到新的值cookie,而我等待 USERID=deleted 正如我在 Fiddler 中嗅探它时所看到的:我只找到我在“responseCookies”中发送的 2 个 cookie...

=> 你有解释吗?我做错了什么吗?有没有其他方法来管理网络服务和 cookie?

最佳答案

不确定这是否是问题所在,但为什么每次都创建 cookie 容器?您每次都可以传递 cookie。

所以初始化一次,然后将已有的cookie容器赋值给LoginLogout中的请求。

关于c# - 如何使用 HttpClient 返回 "refresh"cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36495255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com