独自に記述しないCodec
と (ちなみに、これは非常に簡単です)、ブラウザーに送信される実際のバイト ストリームを取得する方法を知りません。私がこれを行っている方法は、既知の段階のICommunicationContext.Response.Entity
前にシリアル化することです。IResponseCoding
擬似コード:
class ResponseLogger : IPipelineContributor
{
public void Initialize(IPipeline pipelineRunner)
{
pipelineRunner
.Notify(LogResponse)
.Before<KnownStages.IResponseCoding>();
}
PipelineContinuation LogResponse(ICommunicationContext context)
{
string content = Serialize(context.Response.Entity);
}
string Serialize(IHttpEntity entity)
{
if ((entity == null) || (entity.Instance == null))
return String.Empty;
try
{
using (var writer = new StringWriter())
{
using (var xmlWriter = XmlWriter.Create(writer))
{
Type entityType = entity.Instance.GetType();
XmlSerializer serializer = new XmlSerializer(entityType);
serializer.Serialize(xmlWriter, entity.Instance);
}
return writer.ToString();
}
}
catch (Exception exception)
{
return exception.ToString();
}
}
}
これResponseLogger
は通常の方法で登録されます。
ResourceSpace.Uses.PipelineContributor<ResponseLogger>();
前述のように、これは必ずしもブラウザーに送信されるバイトの正確なストリームを提供するとは限りませんが、ブラウザーに送信されるバイトのストリームは基本的に同じシリアル化されたエンティティであるため、私のニーズには十分に近いものです。
独自のコーデックを作成することで、100 行以下のコードでIMediaTypeWriter.WriteTo()
メソッドを利用できます。これは、バイトがクラウドに転送される前の最後の防衛線だと思います。その中で、基本的に次のような単純なことを行うだけです。
public void WriteTo(object entity, IHttpEntity response, string[] parameters)
{
using (var writer = XmlWriter.Create(response.Stream))
{
XmlSerializer serializer = new XmlSerializer(entity.GetType());
serializer.Serialize(writer, entity);
}
}
に直接書き込むのではなく、 a に直接IHttpEntity.Stream
書き込むとStringWriter
、ToString()
シリアル化されたエンティティが得られ、出力ストリームに書き込む前に、ログに記録して必要なことを実行できます。
上記のサンプル コードはすべて XML のシリアル化と逆シリアル化に基づいていますが、アプリケーションで使用する形式に関係なく、同じ原則が適用されます。