序列化之前正在侦听WCF的出站消息
本文关键字:WCF 消息 序列化 | 更新日期: 2023-09-27 18:19:55
我已经在WCF上实现了Proto-buf.net,我的WCF服务现在正在使用它作为串行器,到目前为止一切都很好。
但是,我需要将消息中的一些信息添加到HTTP头中,以便可以在网络中跟踪这些数据包。
我已经实现了一个消息检查器,它允许我添加Header信息,但此时消息已经通过proto-buf-serialiser运行,不再可读。
是否可以在序列化之前拦截消息,并且仍然可以访问HttpRequestMessage标头?如果不能,我可以把一些关于请求的信息放在消息检查器可以访问的地方吗?
非常感谢
Yarons的评论让我朝着正确的方向前进
ParameterInspector提取值并使用cusom 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);
}
}