我目前使用的几个代表团处理器(类衍生DelegatingHandler
)被发送之前,对于像验证签名等,这都是非常不错的要求工作,因为我没有复制的所有呼叫签名验证(例如)。
我想用来自同一个Web请求的响应同样的原则。 是否有类似DelegatingHandler为响应什么东西? 办法赶上响应之前它已经回到了方法,在某种程度上?
其他信息:我是使用Web API HttpClient.PutAsync(...)
我目前使用的几个代表团处理器(类衍生DelegatingHandler
)被发送之前,对于像验证签名等,这都是非常不错的要求工作,因为我没有复制的所有呼叫签名验证(例如)。
我想用来自同一个Web请求的响应同样的原则。 是否有类似DelegatingHandler为响应什么东西? 办法赶上响应之前它已经回到了方法,在某种程度上?
其他信息:我是使用Web API HttpClient.PutAsync(...)
是。 你可以做的是,在后续任务。
我解释一下这里 。
例如,该代码(从博客以上)迹线请求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是如何引用...
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());
}
}
}