HttpRequest 在某些计算机上失败,但在其他计算机上则不然,错误:响应提前结束

问题描述 投票:0回答:1

我们有一个 .NET 6 应用程序,它向第三方 API 发出请求。 大约一个月前,我们大多数计算机的请求开始失败。我们得到的错误是:

System.Net.Http.HttpRequestException:发送时发生错误 的请求。 ---> System.IO.IOException:响应结束 过早地。

就是这样,这就是整个错误。没有内部异常,除非我不知道如何正确记录它。

我们使用Wireshark检查数据包流,看起来请求没有离开计算机。

唯一发生变化的是第三方 API 开始使用 Cloudflare。

已经测试过但没有帮助的事情:

  • 更新Windows版本至22H2
  • 安装所有 Windows 更新
  • 检查防火墙
  • 将注册表与 IIS Crypto 进行比较
  • 重新安装我们的应用程序
  • 比较 .NET 运行时并使它们相等
  • 尝试将我们的应用程序作为独立的应用程序启动,看看是否会改变任何事情
  • 检查我们的外部IP是否被第三方屏蔽
  • 检查 TLS(1.1、1.2、1.3 请求失败)
  • 检查电脑防火墙
  • Windows 代理 - 已关闭
  • 网络适配器设置
  • ipconfig /flushdns
  • 重置 Windows 代理

我还尝试过是制作一个.NET控制台应用程序,然后直接向第三方发送请求。 代码:

try
{
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
    ServicePointManager.Expect100Continue = true;
    ServicePointManager.DefaultConnectionLimit = 9999;

    var apiUrl = "{apiUrl}";

    var httpClient = new ServiceCollection()
            .AddHttpClient()
            .BuildServiceProvider()
            .GetService<IHttpClientFactory>()
            .CreateClient();

    httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("text/xml"));
    httpClient.Timeout = new TimeSpan(0, 0, 30);

    var httpContent = new StringContent(body, Encoding.UTF8, "text/xml");

    var httpRequest = new HttpRequestMessage
    {
        //Version = HttpVersion.Version20,
        RequestUri = new Uri($"{apiUrl}PharmacyClaim/RegisterClaim"),
        Content = httpContent,
        Method = HttpMethod.Post
    };

    Log.Logger.Information("Making request to {0}, content:{1}{2}", httpClient.BaseAddress + "PharmacyClaim/RegisterClaim", Environment.NewLine, body);

    var response = await httpClient.SendAsync(httpRequest);
    var content = await response.Content.ReadAsStringAsync();

    Log.Logger.Information("Response content: {0}{1}", Environment.NewLine, content);
    Log.Logger.Information("Response info: {0} HTTP version: {1}", Environment.NewLine, response.Version);
}
catch (HttpRequestException e)
{
    Log.Logger.Error(e.InnerException, "Caught inner exception: {0}", e.InnerException?.Message);

    throw;
}
catch (Exception ex)
{
    Log.Logger.Error(ex, "Caught exception: {0}", ex.Message);

    throw;
}

Body 只是一个 XML 字符串。

我遇到了同样的错误,但我能弄清楚的是:

  • 将 HTTP 协议版本设置为 2.0 可以解决问题,但在某些计算机中,请求适用于 HTTP 1.1,因此这实际上只是修复原因,而不是原因

  • 在 PC 中启动 fiddler 可以使请求起作用 - 我读过一些相关内容,看起来 fiddler 为请求做了某种代理?不知道为什么使用它可以使请求正常工作,但 Fiddler 似乎缓解了很多 .NET HTTP 问题

  • 使用 Postman 发出请求是有效的

  • 使用 Curl 发出请求有效

最奇怪的事情是,在某些计算机中请求有效,但在大多数计算机中它们开始失败。

这是 Cloudflare 问题、.NET 问题还是网络问题?我可以获得更精确的例外情况吗?

任何和所有帮助将不胜感激。

c# .net http httpclient cloudflare
1个回答
0
投票

解决了问题,这是另一个问题:

以 PC 用户身份启动应用程序时,应用程序尝试访问与证书相关的注册表项并收到错误“访问被拒绝”。

来自流程浏览器的数据:

process_explorer_access_denied

© www.soinside.com 2019 - 2024. All rights reserved.