2012-04-19 34 views
1

我需要訪問OpenRasta中的編碼流,然後將其發送到客戶端。我嘗試過使用PipelineContributor並在KnownStages.IEnd之前註冊它,在KnownStages.IOperationExecution之後和KnownStages.AfterResponseConding之後嘗試,但在所有情況下context.Response.Entity流爲null或爲空。訪問OpenRasta中的編碼流

任何人都知道我該怎麼做?

另外,我想在相當早的時候找出所需的編解碼器,但是當我在KnowStages.ICodecRequestSelection之後註冊時,它返回null。我只是覺得我錯過了這些管道貢獻者的一些想法。

回答

1

沒有寫你自己的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序列化和反序列化,但無論應用程序使用何種格式,都應遵循相同的原則。

+0

是否有可能鏈接編解碼器?我需要在內容被任何編解碼器合適編碼之後獲取內容。 rss或atom – PlanetWilson 2012-04-20 09:00:45

+0

不幸的是我的實體不是可序列化的,可能做太多的工作讓它們如此。思考我可能不得不使用一個單獨的HTTP模塊:(討厭,但會工作 – PlanetWilson 2012-04-20 09:06:38

+1

創建一個新的編解碼器,註冊它爲您的媒體類型,並從那裏調用現有的編解碼器,攔截http流很容易。 – SerialSeb 2012-05-31 21:36:51