現在、いくつかの委任ハンドラー(DelegatingHandler
から派生したクラス)を使用して、署名の検証などのために、送信前にリクエストを処理しています。すべての呼び出しでの署名検証(例)。
同じWeb要求からの応答に同じ原則を使用したいと思います。応答用のDelegatingHandlerに似たものはありますか?ある方法でメソッドに戻る前に応答をキャッチする方法はありますか?
追加情報:HttpClient.PutAsync(...)
を使用してWeb APIを呼び出しています
はい。継続タスクでそれを行うことができます。
説明します こちら 。
たとえば、このコード(上記のブログから)は、リクエストURIをトレースし、応答にダミーヘッダーを追加します。
public class DummyHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// work on the request
Trace.WriteLine(request.RequestUri.ToString());
var response = await base.SendAsync(request, cancellationToken);
response.Headers.Add("X-Dummy-Header", Guid.NewGuid().ToString());
return response;
}
}
以下は、リクエストとレスポンスをインターセプトする例です。オーバーライドされたメソッドSendAsyncを使用して元の要求をキャプチャし、ResponseHandlerというメソッドを使用して応答をキャプチャします。
元の要求と応答をキャプチャする例
using System.Net.Http;
using System.Threading.Tasks;
namespace webAPI_Test
{
public class MessageInterceptor : DelegatingHandler
{
protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
// CATCH THE REQUEST BEFORE SENDING TO THE ROUTING HANDLER
var headers = request.ToString();
var body = request.Content.ReadAsStringAsync().Result;
var fullRequest = headers + "\n" + body;
// SETUP A CALLBACK FOR CATCHING THE RESPONSE - AFTER ROUTING HANDLER, AND AFTER CONTROLLER ACTIVITY
return base.SendAsync(request, cancellationToken).ContinueWith(
task =>
{
// GET THE COPY OF THE TASK, AND PASS TO A CUSTOM ROUTINE
ResponseHandler(task);
// RETURN THE ORIGINAL RESULT
var response = task.Result;
return response;
}
);
}
public void ResponseHandler(Task<HttpResponseMessage> task)
{
var headers = task.Result.ToString();
var body = task.Result.Content.ReadAsStringAsync().Result;
var fullResponse = headers + "\n" + body;
}
}
}
このメソッドを使用するには、クラスを特定し、MessageHandlerとして登録する必要があります。 Global.asaxファイルに次の行を追加しました...
新しいMessageInterceptorクラスを登録する方法の例
GlobalConfiguration.Configuration.MessageHandlers.Add(new MessageInterceptor());
これが私の完全なGlobal.asaxファイルです。 MessageInterceptorの参照方法に注意してください...
MessageInterceptor統合を示すGlobal.asaxのフルバージョン
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace webAPI_Test
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.Microsoft.com/?LinkId=9394801
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
GlobalConfiguration.Configuration.MessageHandlers.Add(new MessageInterceptor());
}
}
}