実際には簡単にCodec
を書くことなく、ブラウザに送信される実際のバイトストリームを取得する方法はわかりません。私がこれをやっているのは、IResponseCoding
の既知のステージの前にICommunicationContext.Response.Entity
をシリアライズすることです。擬似コード:このResponseLogger
は、通常の方法登録されている
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();
}
}
}
:前述のように
ResourceSpace.Uses.PipelineContributor<ResponseLogger>();
を、これは必ずしもあなたのブラウザに送信されたバイト数の正確なストリームを与えるものではありませんが、それは十分に近いですブラウザに送信されるバイトのストリームは、基本的にちょうど同じシリアル化されたエンティティです。
独自のコーデックを書くことで、コードを100分以内でIMediaTypeWriter.WriteTo()
メソッドに入れることができます。これは、バイトがクラウドに転送される前の最後の防御ラインです。 StringWriter
にIHttpEntity.Stream
書き込みにに直接書き込むと、それにToString()
を行うのかわりに、あなたがログインすることができますシリアル化されたエンティティを持っています場合
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);
}
}
:それの中で、あなたは基本的には、このような単純な何かをそれを出力ストリームに書き込む前に、何でもしてください。
上記のコード例はすべてXMLのシリアル化とデシリアライゼーションに基づいていますが、アプリケーションがどの形式を使用していても同じ原則が適用されます。
コーデックをチェーンすることはできますか?適切なコーデックでエンコードされたコンテンツを取得する必要があります。 rssまたはatom – PlanetWilson
また、残念ながら私のエンティティはシリアライズ可能ではありません。あなたは別のHTTPモジュールを使用しなければならないかもしれないと思います。(厄介ですが、 – PlanetWilson
は新しいコーデックを作成し、あなたのメディアタイプに登録し、そこから既存のコーデックを呼び出して、httpストリームを傍受するのは簡単です。 – SerialSeb