记一次HttpClient使用问题分析
  9txZwuyI7VfP 2天前 18 0

问题

问题是这样的:第三方的webapi,需要先调用登陆接口获取Cookie,访问其它接口时携带Cookie信息。

但使用HttpClient类调用登陆接口,返回的Headers中没有找到Cookie信息。

分析

首先,使用Postman测试该登陆接口,正常返回Cookie信息,说明是HttpClient访问接口出了问题。

通过调试发现,明明使用的Post请求,返回的HttpResponseMessage却显示为GET请求。

下载WireShark网络分析工具,抓包发现,Post请求返回了302,且返回中是携带了Cookie信息的,随即又进行了GET请求到重定向的地址,返回的信息中没有Cookie。302表示请求的资源已被临时移动到另一个位置,客户端应该重定向到的新位置。因此,可以知道是HttpClient自动进行了重定向。

解决

方法也很简单,对于登陆接口,直接禁用自动跟随重定向即可:

public async Task<HttpResponseMessage> PostAuthAsync(string url, CancellationToken cancellationToken = default(CancellationToken))
{
    using var httpClientHandler = new HttpClientHandler()
    {
        // 禁用自动跟随重定向
        AllowAutoRedirect = false
    };

    using HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
    using var client = new HttpClient(httpClientHandler);
    return await client.SendAsync(request, cancellationToken);
}

从返回中获取指定的Cookie信息:

string GetCookieFromResponseHeader(HttpResponseHeaders headers)
{
    if (headers.TryGetValues("Set-Cookie", out IEnumerable<string> setCookieHeaders))
    {
        foreach (var headerValue in setCookieHeaders)
        {
            foreach (var cookieHeader in headerValue.Split(';'))
            {
                var parts = cookieHeader.Split('=');
                if (parts.Length == 2 && parts[0] == cookieName)
                    return parts[1];
            }
        }
    }

    return string.Empty;
}

访问其它接口时,添加Cookie信息:

public async Task<HttpResponseMessage> PostAsync(string url, string cookie, string jsonData, CancellationToken cancellationToken = default(CancellationToken))
{
    var content = new StringContent(jsonData, Encoding.UTF8, "application/json");
    var httpClient = _httpClientFactory.CreateClient();
    string cookieHeader = $"{cookieName}={cookie}";
    httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Cookie", cookieHeader);
    return await httpClient.PostAsync(url, content, cancellationToken);
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2天前 0

暂无评论

推荐阅读
  K9tJ5pQmM1gT   3天前   19   0   0 .NET
9txZwuyI7VfP