0

我已经通过 WCF 实现了 Proto-buf.net,我的 WCF 服务现在使用它作为他们的序列化程序,到目前为止一切都很好。

但是,我需要将消息中的一些信息添加到 HTTP 标头中,以便可以在网络中跟踪这些数据包。

我已经实现了一个消息检查器,它允许我添加标题信息,但是此时消息已经通过 proto-buf 序列化程序运行并且不再可读。

是否可以在序列化之前拦截消息并且仍然可以访问 HttpRequestMessage 标头?如果不能,我可以将有关请求的一些信息放在消息检查器可以访问的地方吗?

非常感谢

4

1 回答 1

1

Yarons 的评论让我朝着正确的方向前进

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 回答