Azure Functions 中的 HttpClient 最佳实践

RPM*_*984 8 .net c# httpclient azure azure-functions

我需要构建一个 Azure 函数:

  • 响应HTTP POST请求
  • HTTP HEAD根据数据执行7 次请求。

我在这里这里找到了一些指导

但是,并不完全清楚要做什么,以及它是如何工作的?

在第二个链接中,我目前刚刚声明了一个private static HttpClient httpClient = new HttpClient();实例,并在我的 7x HTTP HEAD 调用中重新使用了它。

我的问题:

  1. 这是HttpClient在无状态 Azure 函数中最有效的用法吗?
  2. 我目前只是List<Task>()为 http 调用构建一个,然后Task.WhenAll(tasks)对它们进行并行运行。这是进行这些调用的最快方法吗?还有其他建议吗?

此 Function 端点将被多次调用(每秒多次),因此需要尽可能高效以降低成本。

谢谢!

Jul*_*iën 12

从 2019 年和运行时的 v2/v3+ 开始,您还可以选择在 .NET Azure Functions 中使用依赖项注入。请注意,这仅适用于 .NET 函数 (C#),AFAIK 不适用于其他风格,如 Python、JavaScript/TypeScript 等。

简单的答案是,您可以将Startup.cs类添加到您注册依赖项的 Azure 函数:

[assembly: FunctionsStartup(typeof(MyInjectedFunction.Startup))]

public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        // Note: Only register dependencies, do not depend or request those in Configure().
        // Dependencies are only usable during function execution, not before (like here).

        builder.Services.AddHttpClient();
        // builder.Services.AddSingleton<ILoggerProvider, MyLoggerProvider>();
    }
}
Run Code Online (Sandbox Code Playgroud)

与任何其他具有 dotnet 核心的 web/api 项目几乎相同。接下来,在您的函数本身中,添加一个构造函数并将依赖项注册为参数。您还想static从您的函数中更改远程修饰符。一个例子:

public class MyInjectedFunction
{
    private readonly HttpClient _http;

    public MyInjectedFunction(HttpClient httpClient)
    {
        _http = httpClient;
    }

    [FunctionName("my-injected-function")]
    public async Task RunAsync([EventGridTrigger] EventGridEvent eventGridEvent, ILogger log)
    {
        var response = await _http.GetAsync("https://stackoverflow.com");

        if (response.IsSuccessStatusCode)
            log.LogInformation("Okidoki");
        else
            log.LogError($"{response.StatusCode} {response.ReasonPhrase}: ");
    }
}
Run Code Online (Sandbox Code Playgroud)

通过使用 DI,您也可以将其显式注册为单例。或者创建类型化的 HttpClients。就个人而言,我认为这非常优雅。


小智 7

是的 - 这仍然是 Azure Functions 1.x(也适用于 2.x)的当前指南,以最好地避免套接字耗尽。静态变量将确保它将被类的所有实例共享。另一篇涵盖此主题的好文章是https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong

  • 一般来说,这个解决方案确实不是 HttpClient 的正确用法。保留一个实例也是错误的,因为 DNS 更改无法通过。您最终将失去所有连接。这就是为什么有 HttpClientFactory - 但仅在 ASP .Net Core 2.1 中。我现在的问题是:我们现在应该做什么? (2认同)