.net core 如何在Azure函数中配置HttpClient

.net core 如何在Azure函数中配置HttpClient,.net-core,azure-functions,.net Core,Azure Functions,像许多人一样,我在我的一些Azure功能(v3.x)中使用了HttpClient。问题在于Azure函数主机将HttpClient用作单例。这意味着,如果我在一个函数中设置头,那么它们将为所有函数设置。我希望在不同的函数中有不同的头(例如授权头)。实现这一点的唯一方法是为我需要的每个不同的标题集创建不同的功能应用程序吗?您通常不使用“全局”HttpClient的DefaultRequestHeaders。您需要创建一个HttpRequestMessage并使用SendAsync。这为该会话提供了

像许多人一样,我在我的一些Azure功能(v3.x)中使用了HttpClient。问题在于Azure函数主机将HttpClient用作单例。这意味着,如果我在一个函数中设置头,那么它们将为所有函数设置。我希望在不同的函数中有不同的头(例如授权头)。实现这一点的唯一方法是为我需要的每个不同的标题集创建不同的功能应用程序吗?

您通常不使用“全局”HttpClient的
DefaultRequestHeaders
。您需要创建一个
HttpRequestMessage
并使用
SendAsync
。这为该会话提供了一个与所有其他请求分离的唯一头字典

HttpClient
DefaultRequestHeaders
不是线程安全的。因此,如果在另一个请求的中间修改它们,则会崩溃。

您应该做的是注入,然后从中创建客户机。继续使用
HttpRequestMessage
/
SendAsync
模式(或直接使用
GetAsync
PostAsync
等),同时避免使用
DefaultRequestHeader
(如果使用工厂的
CreateClient()
方法)

如果使用工厂,如果从工厂创建或
HttpClient
对象,则可以使用
DefaultRequestHeaders
。您可能希望针对您在问题中提到的特定用例执行此操作

例子
  • 启动一个新的Azure功能项目
  • 通过NuGet添加
    Microsoft.Azure.Functions.Extensions
    Microsoft.Extensions.Http
  • 添加一个新类,将其命名为
    Startup.cs
    。让它看起来像这样:
  • 使用Microsoft.Azure.Functions.Extensions.DependencyInjection;
    使用Microsoft.Extensions.DependencyInjection;
    使用System.Net.Http.Header;
    [程序集:函数启动(typeof(MyAzureFunction.Startup))]
    名称空间MyAzureFunction
    {
    公共密封类启动:函数启动
    {
    公共覆盖无效配置(IFunctionsHostBuilder)
    {
    builder.Services.AddHttpClient(“MyAuthorizedClient”,客户端=>
    {
    client.DefaultRequestHeaders.Authorization=
    新的AuthenticationHeaderValue(“持票人”);
    });
    }
    }
    }
    
  • 默认情况下,函数的类和函数本身是静态的。确保删除
    static
    关键字。然后,添加一个构造函数。我们将通过建造商注入工厂:
  • 使用Microsoft.AspNetCore.Http;
    使用Microsoft.AspNetCore.Mvc;
    使用Microsoft.Azure.WebJobs;
    使用Microsoft.Azure.WebJobs.Extensions.Http;
    使用Microsoft.Extensions.Logging;
    使用制度;
    使用System.Net.Http;
    使用System.Net.Http.Header;
    使用System.Threading.Tasks;
    名称空间MyAzureFunction
    {
    公共密封类功能1
    {
    私有只读IHttpClientFactory\U httpClientFactory;
    公共功能1(IHttpClientFactory httpContextFactory)
    {
    _httpClientFactory=httpContextFactory;
    }
    [功能名称(“功能1”)]
    公共异步任务运行(
    [HttpTrigger(AuthorizationLevel.Function,“get”,“post”,Route=null)]HttpRequest请求,ILogger日志)
    {
    //
    //向授权客户提出请求
    var authorizedClient=_httpClientFactory.CreateClient(“MyAuthorizedClient”);
    使用(var响应=等待授权客户端
    .GetAsync(新Uri(“https://www.example.com")))
    {
    var objRecved=wait response.Content.ReadAsAsync();
    返回新的OkObjectResult(new{data=objRecved});
    }
    //
    //使用非授权客户端自己的头集合对其发出请求
    var nonAuthorizedClient=_httpClientFactory.CreateClient();
    使用(var request=newhttprequestmessage)(
    HttpMethod.Get,新Uri(“https://www.example.com")))
    {
    request.Headers.Authorization=
    新的AuthenticationHeaderValue(“持票人”);
    使用(var response=await nonAuthorizedClient.sendsync(请求))
    {
    response.EnsureSuccessStatusCode();
    var objRecved=wait response.Content.ReadAsAsync();
    返回新的OkObjectResult(new{data=objRecved});
    }
    }
    }
    }
    }
    
    您应该能够使用HttpClientFactory并配置命名或键入的客户端。当我尝试在本地运行我的函数应用程序时,出现以下情况
    Microsoft.Azure.WebJobs.Host:无法将参数“HttpClientFactory”绑定到类型IHttpClientFactory。确保绑定支持该参数类型
    @HisDivineShadow--whoops。。很抱歉。我已经更新了代码。