和许多人一样,我在一些Azure函数中使用HttpClient (v3.x)。问题是Azure函数主机使用HttpClient作为单例。这意味着,如果我在一个函数中设置了标头,就会为所有函数设置它们。我希望在不同的函数中有不同的头(例如授权头)。实现这一点的唯一方法是为我需要的每一组不同的头创建不同的函数应用程序吗?
发布于 2021-04-07 23:24:51
您通常不使用“全局”HttpClient的DefaultRequestHeaders。您可能希望创建一个HttpRequestMessage并使用SendAsync。这将使该会话具有与所有其他请求隔离的唯一头字典。
HttpClient的DefaultRequestHeaders并不是线程安全的,所以如果在另一个请求中修改它们,就会崩溃。
您应该做的是注入HttpClientFactory,然后根据它创建客户端。继续使用HttpRequestMessage/SendAsync模式(或使用直线式GetAsync、PostAsync等)同时避免使用DefaultRequestHeaders (如果使用工厂的CreateClient()方法)。
如果使用工厂,则如果从工厂创建命名或打字 HttpClient对象,则可以使用打字。您可能希望为您在问题中提到的特定用例执行此操作。
示例
Microsoft.Azure.Functions.Extensions和Microsoft.Extensions.Http包添加NuGet。Startup.cs。让它看起来像这样:using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using System.Net.Http.Headers;
[assembly: FunctionsStartup(typeof(MyAzureFunction.Startup))]
namespace MyAzureFunction
{
public sealed class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddHttpClient("MyAuthorizedClient", client =>
{
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "<token>");
});
}
}
}static。确保删除static关键字。然后,添加一个构造函数。我们将通过构造函数注入工厂:using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
namespace MyAzureFunction
{
public sealed class Function1
{
private readonly IHttpClientFactory _httpClientFactory;
public Function1(IHttpClientFactory httpContextFactory)
{
_httpClientFactory = httpContextFactory;
}
[FunctionName("Function1")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log)
{
//
// make a request on the authorized client
var authorizedClient = _httpClientFactory.CreateClient("MyAuthorizedClient");
using (var response = await authorizedClient
.GetAsync(new Uri("https://www.example.com")))
{
var objRecved = await response.Content.ReadAsAsync<object>();
return new OkObjectResult(new { data = objRecved });
}
//
// make a request on the non-authorized client using it's own header collection
var nonAuthorizedClient = _httpClientFactory.CreateClient();
using (var request = new HttpRequestMessage(
HttpMethod.Get, new Uri("https://www.example.com")))
{
request.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", "<token>");
using(var response = await nonAuthorizedClient.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var objRecved = await response.Content.ReadAsAsync<object>();
return new OkObjectResult(new { data = objRecved });
}
}
}
}
}https://stackoverflow.com/questions/66995285
复制相似问题