1

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

どうすればこれができるか知っている人はいますか?

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

4

1 に答える 1

1

独自に記述しない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書き込むとStringWriterToString()シリアル化されたエンティティが得られ、出力ストリームに書き込む前に、ログに記録して必要なことを実行できます。

上記のサンプル コードはすべて XML のシリアル化と逆シリアル化に基づいていますが、アプリケーションで使用する形式に関係なく、同じ原則が適用されます。

于 2012-04-19T15:24:38.193 に答える