Hier ist ein Beispiel zum Abfangen der Anfrage und der Antwort. Die überschriebene Methode SendAsync wird zum Erfassen der ursprünglichen Anforderung verwendet, während die Methode ResponseHandler zum Erfassen der Antwort verwendet wird.
Beispiel ursprünglichen Anfrage und Antwort
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;
}
}
}
diese Methode erfassen verwenden zu können, muss die Klasse identifiziert und als Message registriert sein. Ich fügte hinzu, die folgende Zeile in meiner Datei Global.asax ...
Beispiel, wie die neue MessageInterceptor Klasse
GlobalConfiguration.Configuration.MessageHandlers.Add(new MessageInterceptor());
Hier ist meine komplette Global.asax-Datei zu registrieren. Beachten Sie, wie die MessageInterceptor referenziert ...
Vollversion von Global.asax zeigt MessageInterceptor Integration
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());
}
}
}
Ah, jetzt verstehe ich die Beispiele mit ContinueWith. Das funktioniert großartig. Danke (und Entschuldigung für langsame Antwort) – Halvard
Wie würdest du den Antwortinhalt hier lesen? Ich versuche es zu lesen, aber es wirft eine Objekt-Ausnahme ab. –
@RossJones Das ist bizarr ... kannst du eine Repro schicken? – Aliostad