Azure Functions中的HttpClient最佳实践

时间:2018-07-11 02:59:22

标签: c# .net azure httpclient azure-functions

我需要建立一个Azure功能,

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

我找到了一些指南herehere

但是,目前尚不清楚该怎么做以及它如何工作?

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

我的问题:

  1. 在无状态Azure函数中,HttpClient的使用效率最高吗?
  2. 我目前正在为http调用建立一个List<Task>(),然后对它们执行Task.WhenAll(tasks)以使其并行运行。那将是拨打这些电话的最快方法吗?还有其他建议吗?

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

谢谢!

2 个答案:

答案 0 :(得分:10)

从2019年开始,以及运行时的v2 / v3 +版本,您还可以选择use dependency injection in .NET Azure Functions。请注意,这仅适用于.NET函数(C#),而AFAIK不适用于其他功能,例如Python,JavaScript / TypeScript等。

一个简单的答案是,您可以向您的Azure函数添加 Startup.cs 类,在其中注册依赖项:

[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>();
    }
}

与任何其他具有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}: ");
    }
}

通过使用DI,您也可以将其显式注册为单例。或创建键入的HttpClients。而且我个人认为这很优雅。

答案 1 :(得分:2)

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