首页 > 解决方案 > Azure Functions:现有连接被远程主机强行关闭。已经在使用静态 HttpClient

问题描述

我的函数调用不断失败并显示错误消息An existing connection was forcibly closed by the remote host。根据这个来缓解这个问题,我将使用我已经在做的静态 Http 客户端,但错误仍然不断发生。

但是,我确实有 4 个静态客户端,我猜这不仅仅是 1 个。但我仍然认为使用 4 个静态客户端比使用多个(非静态)实例更好。

我真的想只有 1 个客户,但我不知道如何使它工作。有一个功能应用程序,其中定义了以下帮助程序类。此外,还有 3 个服务已被提取到单独的类库中(因为它们也用于不同的项目)我包含在我的函数应用程序中并通过 DI 使用。函数应用程序和所有 3 个库都包括以下帮助程序类。

public static class Http 
{
    private static HttpClient _client = new HttpClient();

    public static async Task<HttpResponseMessage> GetAsync(string url, Dictionary<string, string>? headers = null)
    {
        var req = new HttpRequestMessage(HttpMethod.Get, url);
        if (headers != null) req._addRequestHeaders(headers);
        var response = await _client.SendAsync(req);
        response.EnsureSuccessStatusCode();
        return response;
    }
}

库中的服务使用 HTTP 来做自己的事情。我如何能够让应用程序及其引用的所有库使用相同的静态 http 客户端?

还是您认为多个静态 http 类不是问题的原因?在 vs code 中(即在 Azure 之外)本地运行函数应用时,没有这样的错误。

干杯

标签: .net-coreazure-functions

解决方案


还是您认为多个静态 http 类不是问题的原因?

这个。您看到的错误代码是WSAECONNRESET(10054)

对等方重置连接。现有连接被远程主机强行关闭。如果远程主机上的对等应用程序突然停止,主机重新启动,主机或远程网络接口被禁用,或者远程主机使用硬关闭,这通常会导致(有关远程主机上 SO_LINGER 选项的更多信息,请参阅 setsockopt插座)。如果在一个或多个操作正在进行时,由于保活活动检测到故障而导致连接中断,则也可能导致此错误。正在进行的操作因 WSAENETRESET 而失败。后续操作因 WSAECONNRESET 而失败。

您看到此异常的事实表明这是一个意外重置(还有其他时候WSAECONNRESET是正常的,并HttpClient为您处理这些)。

意外重置有很多可能的原因。如果它总是发生,则可能是安全 (TLS) 设置不匹配或格式错误的请求。如果有时会发生,则可能只是另一个服务在错误的时间重新启动/崩溃。这发生在云中,您的服务应该重试。

在 vs code 中(即在 Azure 之外)本地运行函数应用时,没有这样的错误。

我要尝试的下一件事是将日志记录提高到 11


推荐阅读