记一次HttpClient使用问题分析
问题
问题是这样的:第三方的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);
}
转载请注明出处,欢迎交流。
分类:
.Net
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器