2012-04-19 3 views
1

OpenRastaでエンコードされたストリームにアクセスしてから、クライアントに送信する必要があります。私はPipelineContributorを使用して、KnownStages.IEndの前にKnownStages.IOperationExecutionの後でKnownStages.AfterResponseCondingの後に試してみましたが、すべてのインスタンスでcontext.Response.Entityストリームがnullまたは空です。OpenRastaでエンコードされたストリームにアクセスする

どうすればいいですか?

また、私はKnowStages.ICodecRequestSelectionの後に登録すると、かなり早い段階で要求されたコーデックを見つけ出したいと思います。私はちょうど私がこれらのパイプラインの貢献者について何かを見逃していると感じる。

答えて

1

実際には簡単に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()メソッドに入れることができます。これは、バイトがクラウドに転送される前の最後の防御ラインです。 StringWriterIHttpEntity.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のシリアル化とデシリアライゼーションに基づいていますが、アプリケーションがどの形式を使用していても同じ原則が適用されます。

+0

コーデックをチェーンすることはできますか?適切なコーデックでエンコードされたコンテンツを取得する必要があります。 rssまたはatom – PlanetWilson

+0

また、残念ながら私のエンティティはシリアライズ可能ではありません。あなたは別のHTTPモジュールを使用しなければならないかもしれないと思います。(厄介ですが、 – PlanetWilson

+1

は新しいコーデックを作成し、あなたのメディアタイプに登録し、そこから既存のコーデックを呼び出して、httpストリームを傍受するのは簡単です。 – SerialSeb

関連する問題