首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Azure函数中配置HttpClient

如何在Azure函数中配置HttpClient
EN

Stack Overflow用户
提问于 2021-04-07 23:10:15
回答 1查看 3.6K关注 0票数 6

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-07 23:24:51

您通常不使用“全局”HttpClientDefaultRequestHeaders。您可能希望创建一个HttpRequestMessage并使用SendAsync。这将使该会话具有与所有其他请求隔离的唯一头字典。

HttpClientDefaultRequestHeaders并不是线程安全的,所以如果在另一个请求中修改它们,就会崩溃。

您应该做的是注入HttpClientFactory,然后根据它创建客户端。继续使用HttpRequestMessage/SendAsync模式(或使用直线式GetAsyncPostAsync等)同时避免使用DefaultRequestHeaders (如果使用工厂的CreateClient()方法)。

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

示例

  1. 启动一个新的Azure函数项目。
  2. 通过Microsoft.Azure.Functions.ExtensionsMicrosoft.Extensions.Http包添加NuGet。
  3. 添加一个新类,命名为Startup.cs。让它看起来像这样:
代码语言:javascript
复制
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>");
            });
        }
    }
}
  1. 默认情况下,函数的类和函数本身是static。确保删除static关键字。然后,添加一个构造函数。我们将通过构造函数注入工厂:
代码语言:javascript
复制
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 });
                }
            }
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66995285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档