我目前正在使用幾個代理處理程序(來自DelegatingHandler
的類)在發送請求之前處理請求,例如驗證簽名等。這一切都非常好,因爲我沒有必須在所有呼叫上重複簽名驗證(例如)。DelegatingHandler在WebApi中的響應
我想對來自同一網頁請求的響應使用相同的原則。是否有類似於DelegatingHandler的響應?以某種方式在返回方法之前捕獲響應的方法?
其他信息: 我打電話使用HttpClient.PutAsync(...)
我目前正在使用幾個代理處理程序(來自DelegatingHandler
的類)在發送請求之前處理請求,例如驗證簽名等。這一切都非常好,因爲我沒有必須在所有呼叫上重複簽名驗證(例如)。DelegatingHandler在WebApi中的響應
我想對來自同一網頁請求的響應使用相同的原則。是否有類似於DelegatingHandler的響應?以某種方式在返回方法之前捕獲響應的方法?
其他信息: 我打電話使用HttpClient.PutAsync(...)
一個Web API是。你可以在延續任務中做到這一點。
我解釋一下here。
例如,此代碼(來自上面的博客)跟蹤請求URI並向響應添加虛擬標頭。
public class DummyHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// work on the request
Trace.WriteLine(request.RequestUri.ToString());
return base.SendAsync(request, cancellationToken)
.ContinueWith(task =>
{
// work on the response
var response = task.Result;
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());
}
}
}
啊,現在我明白了使用ContinueWith的例子。這很好。謝謝(並且對於慢速回答感到抱歉) – Halvard 2012-08-21 11:20:06
您會如何閱讀此處的回覆內容?我嘗試閱讀它,但它拋出一個對象處置異常。 – 2013-09-19 14:32:56
@RossJones這是奇怪的...你可以發送repro? – Aliostad 2013-09-20 08:25:01