受賞した回答は ReadAsStringAsync を参照していましたが、回答には例がありませんでした。私はgdpからのアドバイスに従い、やや実用的な例を導き出しました...
MessageInterceptor という単一のクラスを作成しました。私は ActionFilterAttribute から派生するだけで、コントローラーがそれを取得する前、およびコントローラーが終了した後、すぐに webAPI メソッド呼び出しをインターセプトし始めました。これが私の最終クラスです。この例では、XML シリアライザーを使用して、要求と応答の両方を XML 文字列に取得します。この例では、リクエストとレスポンスが移入されたオブジェクトとして検出されます。これは、デシリアライズがすでに行われていることを意味します。データが入力されたモデルからデータを収集し、XML 文字列にシリアル化することは、IIS によって返された実際の投稿要求と応答ではなく、要求と応答の表現です。
コード例 - MessageInterceptor
using System.IO;
using System.Linq;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
using System.Xml.Serialization;
namespace webapi_test
{
public class MessageInterceptor : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
base.OnActionExecuting(actionContext);
var headers = actionContext.Request.Content.Headers.ToString();
var request = actionContext.ActionArguments.FirstOrDefault().Value;
var xml = SerializeXMLSerializer(request, "");
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
base.OnActionExecuted(actionExecutedContext);
var headers = actionExecutedContext.Response.Content.Headers.ToString();
var response = actionExecutedContext.Response.Content.ReadAsStringAsync().Result;
var xml = SerializeXMLSerializer(response, "");
}
public static string SerializeXMLSerializer(object o, string nameSpace)
{
string serializedValue;
var writer = new StringWriter();
XmlSerializer serializer = new XmlSerializer(o.GetType(), nameSpace);
serializer.Serialize(writer, o);
serializedValue = writer.ToString();
return serializedValue;
}
}
}