DelegatingHandler用于WebApi中的响应

我目前正在使用几个委托处理程序(派生自DelegatingHandler类)在发送之前处理请求,例如validation签名等。这一切都非常好,因为我不必在所有调用上复制签名validation(例如)。

我想对来自同一Web请求的响应使用相同的原则。 是否有类似于DelegatingHandler的响应? 在某种程度上,在返回到方法之前捕获响应的方法是什么?

附加信息:我使用HttpClient.PutAsync(...)调用web api

是。 您可以在延续任务中执行此操作。

我在这里解释一下 。

例如,此代码(来自上面的博客)跟踪请求URI并向响应添加虚拟标头。

 public class DummyHandler : DelegatingHandler { protected override async Task 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 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 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 ……

Global.asax的完整版本,显示MessageInterceptor集成

 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()); } } }