Windows.Web.HttpClient:不会发送Cookie

时间:2016-06-16 22:11:50

标签: cookies httpclient

我将带有基本身份验证的HTTP Get请求发送到主机的登录端点:

            request = new HttpRequestMessage();
            // Configuration Item: Login URL Suffix
            request.RequestUri = new Uri(string.Format("https://{0}/{1}", Host, loginSuffix));
            request.Method = Windows.Web.Http.HttpMethod.Get;

            var info = User + ":" + Password;
            var token = Convert.ToBase64String(Encoding.UTF8.GetBytes(info));
            request.Headers.Authorization = new HttpCredentialsHeaderValue("Basic", token);

            _httpClient = CreateHttpClient(ref cookieManager);
            response = await _httpClient.SendRequestAsync(request, HttpCompletionOption.ResponseContentRead);

            response.EnsureSuccessStatusCode();

            responseBodyAsText = await response.Content.ReadAsStringAsync();

使用过滤器创建HttpClient,以便稍后设置Cookie:

    private HttpClient CreateHttpClient(ref HttpCookieManager _cookieManager)
    {
        HttpBaseProtocolFilter _filter = new HttpBaseProtocolFilter();

        HttpClient _httpClient = new Windows.Web.Http.HttpClient(_filter);

        _cookieManager = _filter.CookieManager;

        return _httpClient;
    }

从响应可以读取SET-COOKIE标题。

        string[] Queries;
        response.Headers.TryGetValue("Set-Cookie", out tmpString);
        if (tmpString != null)
            Queries = tmpString.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries);

我正在寻找一个带有已定义名称的Cookie(CookieKeyName),该Cookie将在下一个请求中设置。

        foreach (var query in Queries)
        {
            if (query.Contains(CookieKeyName))
            {
                staticCookieKey = query.Substring(0, query.IndexOf("="));
                staticCookieValue = query.Substring(query.IndexOf("=") + 1);
            }
        }

我希望,HttpClient会自动在每个后续请求中将此URL的响应中使用收到的Set-Cookie作为Cookie。

我正在准备下一个请求并自己设置Cookie:

            request.RequestUri = new Uri(string.Format("https://{0}/qcbin", Host));
            request.Method = Windows.Web.Http.HttpMethod.Get;

            HttpCookie _cookie = new Windows.Web.Http.HttpCookie(staticCookieKey, Host, "/");
            _cookie.Value = staticCookieValue;
            bool replaced = cookieManager.SetCookie(_cookie);

以下发送请求提供给Web异常401,因为服务器期望此URL在响应中接收Cookie。

            response = await _httpClient.SendRequestAsync(request, HttpCompletionOption.ResponseContentRead);

            response.EnsureSuccessStatusCode();

            responseBodyAsText = await response.Content.ReadAsStringAsync();

在线上查看Fiddler,第二个请求不包含Cookie标头。甚至在CookieManager中设置Cookie也没有在HttpClient的第一个响应中设置-Cookie的进程。

提示:Cookie的值长度约为6000个字符(来自IBM Data Power)。

提前感谢您的帮助。

0 个答案:

没有答案