C# 如何";刷新“;随HttpClient返回的cookie

C# 如何";刷新“;随HttpClient返回的cookie,c#,web-services,cookies,xamarin.forms,dotnet-httpclient,C#,Web Services,Cookies,Xamarin.forms,Dotnet Httpclient,我在一个Xamarin.Forms项目中工作,在该项目中,我使用cookies调用一些Web服务,因为它们最初是为网站制作的。有些Web服务只返回cookies,但Oher需要接收cookies才能正常工作 例如,登录Web服务获取一个JSON并返回两个cookie,而注销Web服务获取一个“空”JSON,即之前的两个cookie,并且必须为其中一个cookie返回一个更新值 我基于以下链接使用HttpClient管理cookie: 我的问题是我可以向Web服务发送cookie,我可以通过We

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

例如,登录Web服务获取一个JSON并返回两个cookie,而注销Web服务获取一个“空”JSON,即之前的两个cookie,并且必须为其中一个cookie返回一个更新值

我基于以下链接使用HttpClient管理cookie:

我的问题是我可以向Web服务发送cookie,我可以通过Web服务接收返回的cookie,但是如果我在调用之前发送了cookie,我就无法接收任何“更新的”cookie

调用登录Web服务的代码如下所示:

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)
    {

    }
}
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)
    {

    }
}
公共异步任务登录()
{
Uri=新的Uri(“http://www.website.com/Login");
CookieContainer cookies=新CookieContainer();
HttpClientHandler handler=新的HttpClientHandler();
handler.CookieContainer=cookies;
var httpClient=新的httpClient(处理程序);
var jsonParam=“{\”数据\“:{\”设备\“:\”xxx\“,\”登录\“:\”my@email.com\“,\”密码\“:\”密码\“}}”;
HttpContent HttpContent=新的StringContent(jsonParam);
httpContent.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/json”);
httpClient.DefaultRequestHeaders.Add(“X-HTTP-Method-Override”、“PUT”);
httpClient.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
尝试
{
HttpResponseMessageHttpResponse=httpClient.PostAsync(uri),httpContent).Result;
//回收饼干的处理
IEnumerable responseCookies=cookies.GetCookies(uri.Cast();
foreach(响应Cookie Cookie)
{
Debug.WriteLine(cookie.Name+“:”+cookie.Value);
添加(新的KeyValuePair(cookie.Name,cookie.Value));
}
if(httpResponse.IsSuccessStatusCode)
{
var responseText=wait-httpResponse.Content.ReadAsStringAsync();
}
}
捕获(例外e)
{
}
}
=>效果很好:我得到了预期的cookies:SESSIONID=xxxUSERID=xxx

我的注销方法的代码如下所示:

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)
    {

    }
}
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)
    {

    }
}
公共异步任务注销(字符串测试)
{
Uri=新的Uri(“http://www.website.com/Logout");
CookieContainer cookies=新CookieContainer();
HttpClientHandler handler=新的HttpClientHandler();
handler.CookieContainer=cookies;
var httpClient=新的httpClient(处理程序);
var jsonParam=“{\”数据\“:{}”;
HttpContent HttpContent=新的StringContent(jsonParam);
httpContent.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/json”);
httpClient.DefaultRequestHeaders.Add(“X-HTTP-Method-Override”、“GET”);
httpClient.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
//正在检索要发送的cookies
foreach(WSCookie中的KeyValuePair kvpCookie)
{
添加(uri,新Cookie(kvpCookie.Key,kvpCookie.Value));
}
尝试
{
HttpResponseMessageHttpResponse=httpClient.PostAsync(uri,httpContent).Result;
//回收饼干的处理
IEnumerable responseCookies=cookies.GetCookies(uri.Cast();
foreach(响应Cookie Cookie)
{
Debug.WriteLine(cookie.Name+“:”+cookie.Value);
添加(新的KeyValuePair(cookie.Name,cookie.Value));
}
if(httpResponse.IsSuccessStatusCode)
{
var responseText=wait-httpResponse.Content.ReadAsStringAsync();
}
}
捕获(例外e)
{
}
}
=>此方法有效,但我没有获得预期的cookie。我发送我之前收到的cookies(名称和值)(SESSIONID=xxxUSERID=xxx),但我没有为cookies获取新的值,而我等待USERID=deleted,就像我在Fiddler中嗅探它时看到的那样:我只找到了我在“响应书”中发送的两个cookies


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

不确定这是否是问题所在,但为什么每次都要创建cookie容器?你每次都可以把饼干递给我


因此,初始化一次,然后将现有cookie容器分配给
Login
Logout

中的请求。您能提供有关建议的更多详细信息或链接吗?我对CookieContainer不是很熟悉,但在我找到的每个样本中,他们都使用了类似的东西。但这可能不是最好的方法。