在IDispatchMessageInspector.AfterReceiveRequest和IClientMessageInspector.BeforeSendRequest之间传递WCF上下文中的自定义值

在IDispatchMessageInspector.AfterReceiveRequest和IClientMessageInspector.BeforeSendRequest之间传递WCF上下文中的自定义值,wcf,Wcf,我有一个ASP应用程序,它是WCFService1的客户端,也是WCFService2的客户端 我已将IDispatchMessageInspector和IClientMessageInspector添加到WCF服务1 现在我需要将自定义值从ASP传递到WCF1,然后再传递到WCF2 从ASP到WCF1,通过消息头,它非常简单 问题是,如何将自定义值从IDispatchMessageInspector.AfterReceiveRequest(WCF1接收到来自ASP的请求)传递到IClientM

我有一个ASP应用程序,它是WCFService1的客户端,也是WCFService2的客户端

我已将IDispatchMessageInspector和IClientMessageInspector添加到WCF服务1

现在我需要将自定义值从ASP传递到WCF1,然后再传递到WCF2

从ASP到WCF1,通过消息头,它非常简单

问题是,如何将自定义值从IDispatchMessageInspector.AfterReceiveRequest(WCF1接收到来自ASP的请求)传递到IClientMessageInspector.BeforeSendRequest(准备将请求发送到WCF2)操作的WCF服务1


是否存在可以使用的上下文

您的代码是什么样子的?假设第一个分派消息检查器是向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]的好教程: