【问题标题】:Attaching httpHandler to httpclientFactory webapi aspnetcore 2.1将 httpHandler 附加到 httpclientFactory webapi aspnetcore 2.1
【发布时间】:2018-06-26 13:45:11
【问题描述】:

我正在尝试使用“ConfigurePrimaryHttpMessageHandler”将处理程序附加到 httpclientfactory

但是当我查看 HttpClient 内部时 如果处理程序在那里,我找不到它

我是否正确附加了处理程序?

任何建议

     services.AddHttpClient<IGitHubClient,GitHubClient>(client =>
            {
                client.BaseAddress = new Uri(myUri);
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            })
            .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
            {
                AllowAutoRedirect = false,
                AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip
            });


    public interface IGitHubClient
    {
        Task<string> GetData();
    }

    public class GitHubClient : IGitHubClient
    {
        private readonly HttpClient _client;

        public GitHubClient(HttpClient httpClient)
        {
            _client = httpClient;
        }

        public async Task<string> GetData()
        {
            return await _client.GetStringAsync("/");
        }
    }

    public class ValuesController : Controller
    {
        private readonly IGitHubClient _gitHubClient;;

        public ValuesController(IGitHubClient gitHubClient)
        {
            _gitHubClient = gitHubClient;
        }

        [HttpGet]
        public async Task<ActionResult> Get()
        {
            //my _gitHubClient has no Handler attached!!!

            string result = await _gitHubClient.GetData();
            return Ok(result);
        }
    }

【问题讨论】:

  • 您显示的代码是推荐的方法。
  • 关于_gitHubClient 的评论似乎是个误会。 _gitHubClient 是包装 HttpClient 实例的抽象。拥有处理程序的正是该实例。
  • 是的,正确。是否可以有一个围绕 httpclient 的包装器并将处理程序附加到它。如果是这样,我应该如何更改“addHttpClient”位。我想要一个包装器,因为我在那里做的事情很少
  • 你目前拥有的是正确的

标签: c# asp.net-core asp.net-core-webapi dotnet-httpclient httpclientfactory


【解决方案1】:

您显示的代码是推荐的方法。

关于_gitHubClient的评论

//我的_gitHubClient没有附加Handler!!!

似乎是个误会。

_gitHubClient 是您的抽象,它将HttpClient 实例包装在其GitHubClient 实现中。

public class GitHubClient : IGitHubClient {
    private readonly HttpClient _client; //<< Handler will be attached to this instance

    public GitHubClient(HttpClient httpClient) {
        _client = httpClient;
    }

    public async Task<string> GetData() {
        return await _client.GetStringAsync("/");
    }
}

正是那个包装的实例将具有附加的处理程序。

基于当前配置,每当框架必须创建IGitHubClient 派生GitHubClient 的实例以进行注入时,工厂将使用启动时提供的设置创建HttpClient。其中还包括添加ConfigurePrimaryHttpMessageHandler提供的HttpClientHandler

【讨论】:

  • 感谢您的回复和时间。实际上你是对的,处理程序一直在那里,但在内部-内部-等等..
  • 但是在我的测试中,在查看 Request.Connection = {Microsoft.AspNetCore.Http.Internal.DefaultConnectionInfo} 时调用这个其他 api 我找不到处理程序。它在请求中位于哪里
猜你喜欢
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
相关资源
最近更新 更多