gpt4 book ai didi

c# - 使用网络凭据在运行时更新 HttpMessageHandler 或创建类型化 HttpClient

转载 作者:行者123 更新时间:2023-12-04 17:37:12 28 4
gpt4 key购买 nike

我需要根据使用应用程序的最终用户在应用程序运行时传递网络凭据以模拟域用户。我无法弄清楚如何通过与单个用户相关联的 Services.AddHttpClient 和 HttpClientFactory 生成 HttpClient。

        var httpClientBuilder = services
.AddHttpClient<SomeHttpClint>()
.ConfigurePrimaryHttpMessageHandler(sp => new HttpClientHandler
{
AllowAutoRedirect = false,
UseCookies = false,
Credentials = new NetworkCredential("user", "pass", "domain")
});

所以我的问题如下:
  • 是否可以使用命名或类型化的 HttpClientFactories 来生成代表单个用户的 HttpClients?或者是否有更好的解决方案来生成一堆绑定(bind)到单个用户的 HttpClient?
  • 是否可以在将 http 客户端工厂注入(inject) Controller 之外访问它,例如中间件类型?
  • 最佳答案

    您可以在运行时注册客户端。这是我的解决方法代码。
    定义2类:

    public class DynamicHttpClientFactoryOptions : IConfigureNamedOptions<HttpClientFactoryOptions>
    {
    private readonly DynamicHttpClientFactoryWrapper _options;

    public DynamicHttpClientFactoryOptions(DynamicHttpClientFactoryWrapper options)
    {
    _options = options;
    }

    public void Configure(HttpClientFactoryOptions options)
    {
    }

    public void Configure(string name, HttpClientFactoryOptions options)
    {
    if (!_options.TryGetValue(name, out var configure)) return;

    configure(options);
    }
    }
    public class DynamicHttpClientFactoryWrapper : ConcurrentDictionary<string, Action<HttpClientFactoryOptions>>
    {

    public HttpClient GetOrCreateClient(string name, Action<HttpClientFactoryOptions> optionsBuilder)
    {
    if (!ContainsKey(name) || !TryGetValue(name, out var action))
    {
    TryAdd(name, optionsBuilder);
    }


    //you can store serviceProvider in startup class
    var factory = _serviceProvider.GetRequiredService<IHttpClientFactory>();
    return factory.CreateClient(name);
    }
    }
    如何使用:
    登记:
    services.AddHttpClient(...);
    services.AddSingleton<DynamicHttpClientFactoryWrapper>();
    services.ConfigureOptions<DynamicHttpClientFactoryOptions>();
    通过 DI 毫秒获取:
    public class SomeClass
    {
    private readonly DynamicHttpClientFactoryWrapper _wrapper;

    public SomeClass(DynamicHttpClientFactoryWrapper wrapper)
    {
    _wrapper = wrapper;
    }

    public async Task Work()
    {
    var client = _wrapper.GetOrCreateClient(name/*userid or something else*/, options =>
    {
    options.HttpClientActions.Add(c =>
    {
    c.BaseAddress = new Uri("...");
    });
    options.HttpMessageHandlerBuilderActions.Add(handlerBuilder =>
    {
    var handler = new HttpClientHandler
    {
    Credentials = new NetworkCredential("user", "pass", "domain")
    }

    handlerBuilder.PrimaryHandler = handler;
    });
    });

    var response = await client.SendAsync(request);
    //do your work...
    }
    }

    关于c# - 使用网络凭据在运行时更新 HttpMessageHandler 或创建类型化 HttpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56185815/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com