web-dev-qa-db-ja.com

複数のHttpMessageHandlerをHttpClientFactoryなしでHttpClientに追加する方法

HttpClient を使用してWebリクエストを行うコンソールアプリケーションがあります。

var client = new HttpClient();

私は複数の HttpMessageHandler を追加しようとしています(実際には DelegatingHandler のカスタム実装) HttpClientのコンストラクタ は1つしか使用しません- HttpMessageHandler

class LoggingHandler : DelegatingHandler { //... }
class ResponseContentProcessingHandler : DelegatingHandler { //... }

これはOKです...

var client = new HttpClient(new LoggingHandler()); // OK

しかし、これはコンパイルされません:

var client = new HttpClient(
                new LoggingHandler(), 
                new ResponseContentProcessingHandler()); // Sadness

.NET 4.0を対象としているため、 HttpClientFactory を使用できません。これは、この問題の解決策が一般的に説明されている方法です。

HttpClient client = HttpClientFactory.Create(
                       new LoggingHandler(),
                       new ResponseContentProcessingHandler());

ASP.NETアプリケーションではなく、コンソールアプリケーションにいるだけなので、これも実行できません。

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

私は HttpClientFactoryのソース を見てきましたが、そこには.NET 4.0でコンパイルできないものは何もないようですが、自分のファクトリー(Microsoftの「影響を受けた」ソースコード)、手動で多くのHTTPメッセージハンドラーを HttpClient に追加する方法はありますか?

14
Jeff

私はあなたがこのようなことをすることができると思います:

var loggingHandler = new LoggingHandler();
var responseContentProcessingHandler =  new ResponseContentProcessingHandler();
loggingHandler.InnerHandler = responseContentProcessingHandler;
var client = new HttpClient(loggingHandler);

したがって、チェーンの目的のためだけにCustomHandlerを作成する必要はありません。それこそがDelegatingHandlerの目的です。

7
liuhongbo

DelegatingHandlerには、内部ハンドラー用の ハンドラーを受け取る保護コンストラクター があります。すべてのカスタムハンドラーを制御できる場合は、次のように、保護されたコンストラクターを呼び出すパブリックコンストラクターを追加できると思います。

public class CustomHandler : DelegatingHandler
{
    public CustomHandler(HttpMessageHandler innerHandler) : base(innerHandler)
    {
    }
}

したがって、それらをチェーンします。

var client = new HttpClient(
    new CustomHandler(
        new OtherCustomerHandler(
            new HttpClientHandler()
        )
    )
);
16
Jeff Shepler

.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ホスティングwebapiのuriを配置します。

   private const string APiUri="http://localhost/api/get"
   using(HttpClient cleint=new HttpClient()){
     var response await cleint.GetAsync(ApiUri);
    ....
               }
1
Zara_me