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 に追加する方法はありますか?
私はあなたがこのようなことをすることができると思います:
var loggingHandler = new LoggingHandler();
var responseContentProcessingHandler = new ResponseContentProcessingHandler();
loggingHandler.InnerHandler = responseContentProcessingHandler;
var client = new HttpClient(loggingHandler);
したがって、チェーンの目的のためだけにCustomHandlerを作成する必要はありません。それこそがDelegatingHandlerの目的です。
DelegatingHandlerには、内部ハンドラー用の ハンドラーを受け取る保護コンストラクター があります。すべてのカスタムハンドラーを制御できる場合は、次のように、保護されたコンストラクターを呼び出すパブリックコンストラクターを追加できると思います。
public class CustomHandler : DelegatingHandler
{
public CustomHandler(HttpMessageHandler innerHandler) : base(innerHandler)
{
}
}
したがって、それらをチェーンします。
var client = new HttpClient(
new CustomHandler(
new OtherCustomerHandler(
new HttpClientHandler()
)
)
);
.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);
....
}