我们有一个 .NET 6 应用程序,它向第三方 API 发出请求。 大约一个月前,我们大多数计算机的请求开始失败。我们得到的错误是:
System.Net.Http.HttpRequestException:发送时发生错误 的请求。 ---> System.IO.IOException:响应结束 过早地。
就是这样,这就是整个错误。没有内部异常,除非我不知道如何正确记录它。
我们使用Wireshark检查数据包流,看起来请求没有离开计算机。
唯一发生变化的是第三方 API 开始使用 Cloudflare。
已经测试过但没有帮助的事情:
我还尝试过是制作一个.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 问题还是网络问题?我可以获得更精确的例外情况吗?
任何和所有帮助将不胜感激。