RPM*_*984 8 .net c# httpclient azure azure-functions
我需要构建一个 Azure 函数:
HTTP POST请求HTTP HEAD根据数据执行7 次请求。但是,并不完全清楚要做什么,以及它是如何工作的?
在第二个链接中,我目前刚刚声明了一个private static HttpClient httpClient = new HttpClient();实例,并在我的 7x HTTP HEAD 调用中重新使用了它。
我的问题:
HttpClient在无状态 Azure 函数中最有效的用法吗?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
| 归档时间: |
|
| 查看次数: |
12360 次 |
| 最近记录: |