c# Httpclient 请求在 Windows 10 上工作正常返回 403 在 Windows 7 上被禁止(相同的代码)

Posted

技术标签:

【中文标题】c# Httpclient 请求在 Windows 10 上工作正常返回 403 在 Windows 7 上被禁止(相同的代码)【英文标题】:c# Httpclient request working fine on windows 10 returns 403 forbidden on windows 7 (same code) 【发布时间】:2021-12-14 01:33:55 【问题描述】:
var handler = new HttpClientHandler

    AllowAutoRedirect = false,
    AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
    UseCookies = true,
    CookieContainer = new CookieContainer(),
    UseProxy = false,
    SslProtocols = SslProtocols.Tls12
;

using var client = new HttpClient(handler, true)

    Timeout = TimeSpan.FromSeconds(15)
;

client.DefaultRequestHeaders.Add("Accept", "*/*");
client.DefaultRequestHeaders.Add("User-Agent", "API");

using var response = await client.PostAsync(websiteUrl, content, cancellationToken);

if (!response.IsSuccessStatusCode)
    return string.empty

return await response.Content.ReadAsStringAsync();

上面的代码在我测试过的任何 Windows 10 机器上都可以正常工作,但在 Windows 7 上返回禁止的 403。

有人有什么想法吗?我已经在处理程序的初始化程序上尝试了 UseDefaultCredentials = true 但行为仍然相同。

content是一个简单的字符串json内容

【问题讨论】:

什么版本的 .NET?你打的是同一个服务器吗?客户端和服务器上启用了哪些 TLS 协议(并且您在请求中使用 https)?提供此请求时服务器的日志是否可用,它们有帮助吗?我建议在工作和非工作机器上使用 Fiddler 和跟踪(尽管 UseProxy=false 可能会导致问题)。 【参考方案1】:

403 可能是由于 Windows 7 默认不支持 TLS: How to enable TLS 1.2 on clients

早期版本的 Windows,例如 Windows 7 或 Windows Server 2012, 默认情况下不启用 TLS 1.1 或 TLS 1.2 以实现安全通信 使用 WinHTTP。

检查您是否可以在 Win 7 机器上启用 TLS 1.2。或者尝试一起删除 SSL 传输:

SslProtocols = SslProtocols.None

【讨论】:

我启用了 TLS 1.2,因为它在 Windows 7 中根本不起作用,因为服务器也使用它。如果没有启用它,我只会遗憾地收到通信错误 Http 异常。同样在我的理解中,如果你像我在上面的代码中那样启用它,.net 会自动支持它,因为所有其他需要 TLS 1.2 的 API 只需在代码中启用它就可以正常工作。我也会检查注册表值并通知您。 @GregoryGR 我很好奇你是否知道为什么 Win 7 机器的请求因 403 而失败。 还没有,因为遗憾的是,您的建议也没有奏效。我还在看,等我知道了会告诉你的。 期待听到您的想法。

以上是关于c# Httpclient 请求在 Windows 10 上工作正常返回 403 在 Windows 7 上被禁止(相同的代码)的主要内容,如果未能解决你的问题,请参考以下文章

带有自定义标头的 C# HttpClient POST 请求发送不正确的 Content-Type 标头字段

使用 HttpClient 和 C# 在 post 请求中发送 json

使用承载令牌在 C# 中构建 post HttpClient 请求

C# HttpClient:如何在 POST 请求中发送查询字符串

第二次调用 C# HttpClient 错误请求

在 C# 中使用 Post 方法 HttpClient 时请求超时