0

私は WCF を介して Proto-buf.net を実装しました。私の WCF サービスは現在、これをシリアライザーとして使用しています。

ただし、ネットワーク上でこれらのパケットを追跡できるように、メッセージの情報を HTTP ヘッダーに追加する必要があります。

ヘッダー情報を追加できる Message Inspector を実装しましたが、この時点で、メッセージはすでに proto-buf シリアライザーを通過しており、読み取ることができません。

シリアル化の前にメッセージを傍受し、HttpRequestMessage ヘッダーにアクセスすることは可能ですか? そうでない場合、リクエストに関する情報をメッセージインスペクタからアクセスできる場所に置くことはできますか?

どうもありがとう

4

1 に答える 1

1

ヤロンのコメントは私を正しい方向に動かしました

ParameterInspector は値を引き出し、それを独自の operationContext 拡張機能を使用して operationContext に配置します。

    public class TestParameterInspector : IParameterInspector
{
    public object BeforeCall(string operationName, object[] inputs)
    {
        return null;
    }

    public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
    {
        OperationContext.Current.Extensions.Add(new ContextSessionExtension() {SomeData = "testme"} );
    }
}

    public class ContextSessionExtension : IExtension<OperationContext>
{
    public void Attach(OperationContext owner)
    {

    }

    public void Detach(OperationContext owner)
    {

    }

    public string SomeData { get; set; }

}

次に値が引き出され、MessageInspector を使用して HTTP ヘッダーに配置されます。

    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {

        return null;
    }

    public void AfterReceiveReply(ref Message reply, object correlationState)
    {

    }

    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        return null;
    }

    public void BeforeSendReply(ref Message reply, object correlationState)
    {
        var test = OperationContext.Current.Extensions.Find<ContextSessionExtension>().SomeData;
        object httpRequestMessageObject;
        HttpRequestMessageProperty httpRequestMessage;
        if (reply.Properties.TryGetValue(HttpRequestMessageProperty.Name, out httpRequestMessageObject))
        {
            httpRequestMessage = httpRequestMessageObject as HttpRequestMessageProperty;

            if (string.IsNullOrEmpty(httpRequestMessage.Headers["MYTEST"]))
            {
                httpRequestMessage.Headers["MYTEST"] = test;
            }
        }
        else
        {
            httpRequestMessage = new HttpRequestMessageProperty();
            httpRequestMessage.Headers.Add("MYTEST", test);
            reply.Properties.Add(HttpRequestMessageProperty.Name, httpRequestMessage);
        }
    }
于 2013-06-27T09:55:08.053 に答える