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

时间:2011-03-28 19:38:56

标签: wcf

我有一个ASP应用程序,它是WCF SERVICE1的客户端,它是WCF SERVICE2的客户端。

我已将IDispatchMessageInspector和IClientMessageInspector添加到WCF SERVICE1。

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

从ASP到WCF1,它通过消息标题是微不足道的。

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

是否有一些可以使用的背景?

2 个答案:

答案 0 :(得分:1)

您的代码是什么样的?假设第一个Dispatch Message Inspector是向WCF2发出请求的那个,那么简单地使用消息属性就足够了。

但是,如果您的调度消息检查员做了某些事情;然后请求继续处理,它是实际调用WCF2的服务实现,然后你需要跳过几个箍。一般来说,我要求检查员将一些数据放入服务请求消息属性中, service 实现需要提取并复制到消息以发送到WCF2,以便客户检查员可以接他们。

这很难看,而且会让整个过程变得更加脆弱。

你能详细说明你想做什么吗?您希望以这种方式传递什么样的数据?

答案 1 :(得分:1)

就我而言,我必须识别并记录客户端请求的嵌套服务调用。 为此,我通过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;
        }
    }
}