C# 如何在没有HttpClientFactory的情况下向HttpClient添加多个HttpMessageHandler

C# 如何在没有HttpClientFactory的情况下向HttpClient添加多个HttpMessageHandler,c#,.net,dotnet-httpclient,C#,.net,Dotnet Httpclient,我有一个用于发出web请求的控制台应用程序 var client = new HttpClient(); 我试图向它添加多个(实际上是的自定义实现),但只需要一个 这没关系 var client = new HttpClient(new LoggingHandler()); // OK 但这并没有编译: var client = new HttpClient( new LoggingHandler(), new Respons

我有一个用于发出web请求的控制台应用程序

var client = new HttpClient();
我试图向它添加多个(实际上是的自定义实现),但只需要一个

这没关系

var client = new HttpClient(new LoggingHandler()); // OK
但这并没有编译:

var client = new HttpClient(
                new LoggingHandler(), 
                new ResponseContentProcessingHandler()); // Sadness
因为我的目标是.NET 4.0,所以我无法使用,这就是通常解释此问题的解决方案的方式:

HttpClient client = HttpClientFactory.Create(
                       new LoggingHandler(),
                       new ResponseContentProcessingHandler());
因为我只是在控制台应用程序中,而不是在ASP.NET应用程序中,所以我也不能这样做:

GlobalConfiguration.Configuration
                   .MessageHandlers
                   .Add(new LoggingHandler()
                   .Add(new ResponseContentProcessingHandler());

我已经看过了,其中似乎没有任何东西不能在.NET 4.0中编译,但除了滚动我自己的工厂(“受Microsoft源代码启发”)之外,是否有一种方法可以手动将许多HTTP消息处理程序添加到?

以在.NET 4.0平台上通过控制台应用程序实现,最好的解决方案是将httpConfiguration传递给您的webapi库,或者如果您没有webapi代码,只需在webhost asp.net应用程序的global.ascx文件中编写此代码

     protected void Application_Start(object sender, EventArgs e)
             {
        var config = GlobalConfiguration.Configuration;
        WebAPIConfig.Configure(config);


    }

   //Code that will configure all message handlers in webapi    
          public static void Configure(HttpConfiguration configure)
   {


        configure.MessageHandlers.Add(new xyzhandler());
       configure.MessageHandlers.Add(new ABCHandler());

   }
在控制台应用程序中,放置承载webapi的Web主机的uri

   private const string APiUri="http://localhost/api/get"
   using(HttpClient cleint=new HttpClient()){
     var response await cleint.GetAsync(ApiUri);
    ....
               }
DelegatingHandler对内部处理程序有一个。如果您可以控制所有自定义处理程序,我认为您可以添加一个调用受保护构造函数的公共构造函数,如:

public class CustomHandler : DelegatingHandler
{
    public CustomHandler(HttpMessageHandler innerHandler) : base(innerHandler)
    {
    }
}
并将它们链接起来:

var client = new HttpClient(
    new CustomHandler(
        new OtherCustomerHandler(
            new HttpClientHandler()
        )
    )
);

我想你可以这样做:

var loggingHandler = new LoggingHandler();
var responseContentProcessingHandler =  new ResponseContentProcessingHandler();
loggingHandler.InnerHandler = responseContentProcessingHandler;
var client = new HttpClient(loggingHandler);
因此,您不需要仅为链接目的创建CustomHandler。
这才是DelegatingHandler的真正目的。

无论您是使用console还是asp.net,Web API都应该使用http协议。@Zara\u me您是说您可以在console应用程序中访问
GlobalConfiguration.Configuration.MessageHandlers
?因为我说我不能。HTTP协议与此有什么关系?如果您不能在控制台中使用HttpClientFactory,那么最好使用最小的网页托管和发送Httpconfiguration对象,并使用Fiddler2进行测试。“调用/注册”的实现多个处理程序是我无法理解的-你能编辑这个答案,包括一个代码片段来解释你的意思吗?+1用于实际显示如何链接多个处理程序,尤其是当
HttpClientHandler
出现在最内层时,它可以保留使用其无参数构造函数时从
HttpClient
获得的行为。文档提到了链接,但我在任何地方都看不到一个例子!
var loggingHandler = new LoggingHandler();
var responseContentProcessingHandler =  new ResponseContentProcessingHandler();
loggingHandler.InnerHandler = responseContentProcessingHandler;
var client = new HttpClient(loggingHandler);