在IDispatchMessageInspector.AfterReceiveRequest和IClientMessageInspector.BeforeSendRequest之间传递WCF上下文中的自定义值
我有一个ASP应用程序,它是WCFService1的客户端,也是WCFService2的客户端 我已将IDispatchMessageInspector和IClientMessageInspector添加到WCF服务1 现在我需要将自定义值从ASP传递到WCF1,然后再传递到WCF2 从ASP到WCF1,通过消息头,它非常简单 问题是,如何将自定义值从IDispatchMessageInspector.AfterReceiveRequest(WCF1接收到来自ASP的请求)传递到IClientMessageInspector.BeforeSendRequest(准备将请求发送到WCF2)操作的WCF服务1在IDispatchMessageInspector.AfterReceiveRequest和IClientMessageInspector.BeforeSendRequest之间传递WCF上下文中的自定义值,wcf,Wcf,我有一个ASP应用程序,它是WCFService1的客户端,也是WCFService2的客户端 我已将IDispatchMessageInspector和IClientMessageInspector添加到WCF服务1 现在我需要将自定义值从ASP传递到WCF1,然后再传递到WCF2 从ASP到WCF1,通过消息头,它非常简单 问题是,如何将自定义值从IDispatchMessageInspector.AfterReceiveRequest(WCF1接收到来自ASP的请求)传递到IClientM
是否存在可以使用的上下文 您的代码是什么样子的?假设第一个分派消息检查器是向WCF2发出请求的检查器,那么只需使用消息属性就足够了 但是,如果您的分派消息检查器执行某些操作;然后请求继续处理,而实际上调用WCF2的是服务实现,然后您将需要跳过更多的障碍。一般来说,我认为您需要inspector在服务请求消息属性中放入一些数据,服务实现需要提取这些数据并复制到消息中以发送到WCF2,以便客户端inspector能够提取它们 这很难看,而且会让整个过程变得更脆弱
你能详细说明一下你想做什么吗?您希望通过这种方式传递什么样的数据?在我的例子中,我必须识别并记录客户端请求的嵌套服务调用。 为此,我通过ThreadStatic属性标记每个服务调用,并将此属性添加到客户端调用的头中(service1计数为service2的客户端),而不是在AfterReceiveRequest方法中检查其存在性。如果存在,则父服务请求了当前方法
public class GenericMessageInspector : IDispatchMessageInspector, IClientMessageInspector
{
[ThreadStatic]
private static string _masterServiceGUID;
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
if (request.Headers.Action == null)
return null;
//Control request header for nested call
string masterRequestId = string.Empty;
var IsMasterExist = request.Headers.FindHeader("MasterServiceGUID", "namespace");
if (IsMasterExist > -1)
{
//requested by internal service
masterRequestId = request.Headers.GetReaderAtHeader(IsMasterExist).ReadInnerXml();
}
}
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
if (!String.IsNullOrEmpty(_masterServiceGUID))
{
request.Headers.Add(MessageHeader.CreateHeader("MasterServiceGUID", "namespace", _masterServiceGUID));
}
return null;
}
}
}
我需要通过wcf1将自定义头从asp传递到wcf2。实际上,我需要传递一个GUID。我还没有尝试过它;但我认为可以在WCF1服务端上放置一个ICallContextInitializer,用于获取自定义头,将其放入线程本地存储,然后让客户端检查器从TLS获取值并将其复制到WCF2的传出消息中。这里有一个关于使用[ThreadStatic]的好教程: