沒有寫你自己的Codec
(順便說一句,這很容易),我不知道如何獲得實際的字節流發送到瀏覽器。我這樣做的方式是在IResponseCoding
已知階段之前序列化ICommunicationContext.Response.Entity
。僞代碼:
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);
}
}
如果你的,而不是直接寫入到IHttpEntity.Stream
寫入StringWriter
,並在其上做ToString()
,你就會有系列化的實體,您可以登錄並在寫入輸出流之前做任何你想做的事情。
雖然上述所有示例代碼均基於XML序列化和反序列化,但無論應用程序使用何種格式,都應遵循相同的原則。
是否有可能鏈接編解碼器?我需要在內容被任何編解碼器合適編碼之後獲取內容。 rss或atom – PlanetWilson 2012-04-20 09:00:45
不幸的是我的實體不是可序列化的,可能做太多的工作讓它們如此。思考我可能不得不使用一個單獨的HTTP模塊:(討厭,但會工作 – PlanetWilson 2012-04-20 09:06:38
創建一個新的編解碼器,註冊它爲您的媒體類型,並從那裏調用現有的編解碼器,攔截http流很容易。 – SerialSeb 2012-05-31 21:36:51