.net core 如何在Azure函数中配置HttpClient
像许多人一样,我在我的一些Azure功能(v3.x)中使用了HttpClient。问题在于Azure函数主机将HttpClient用作单例。这意味着,如果我在一个函数中设置头,那么它们将为所有函数设置。我希望在不同的函数中有不同的头(例如授权头)。实现这一点的唯一方法是为我需要的每个不同的标题集创建不同的功能应用程序吗?您通常不使用“全局”HttpClient的.net core 如何在Azure函数中配置HttpClient,.net-core,azure-functions,.net Core,Azure Functions,像许多人一样,我在我的一些Azure功能(v3.x)中使用了HttpClient。问题在于Azure函数主机将HttpClient用作单例。这意味着,如果我在一个函数中设置头,那么它们将为所有函数设置。我希望在不同的函数中有不同的头(例如授权头)。实现这一点的唯一方法是为我需要的每个不同的标题集创建不同的功能应用程序吗?您通常不使用“全局”HttpClient的DefaultRequestHeaders。您需要创建一个HttpRequestMessage并使用SendAsync。这为该会话提供了
DefaultRequestHeaders
。您需要创建一个HttpRequestMessage
并使用SendAsync
。这为该会话提供了一个与所有其他请求分离的唯一头字典
HttpClient
的DefaultRequestHeaders
不是线程安全的。因此,如果在另一个请求的中间修改它们,则会崩溃。
您应该做的是注入,然后从中创建客户机。继续使用HttpRequestMessage
/SendAsync
模式(或直接使用GetAsync
、PostAsync
等),同时避免使用DefaultRequestHeader
(如果使用工厂的CreateClient()
方法)
如果使用工厂,如果从工厂创建或HttpClient
对象,则可以使用DefaultRequestHeaders
。您可能希望针对您在问题中提到的特定用例执行此操作
例子
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。。很抱歉。我已经更新了代码。