我需要建立一个Azure功能,
HTTP POST
请求HTTP HEAD
请求。但是,目前尚不清楚该怎么做以及它如何工作?
与第二个链接一样,我目前刚刚声明了一个private static HttpClient httpClient = new HttpClient();
实例,并在我的7x HTTP HEAD调用中重复使用了该实例。
我的问题:
HttpClient
的使用效率最高吗?List<Task>()
,然后对它们执行Task.WhenAll(tasks)
以使其并行运行。那将是拨打这些电话的最快方法吗?还有其他建议吗?此函数端点将被调用很多次(每秒多次),因此需要尽可能高效以降低成本。
谢谢!
答案 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