我有一个ASP应用程序,它是WCF SERVICE1的客户端,它是WCF SERVICE2的客户端。
我已将IDispatchMessageInspector和IClientMessageInspector添加到WCF SERVICE1。
现在我需要将自定义值从ASP传递到WCF1,然后传递给WCF2。
从ASP到WCF1,它通过消息标题是微不足道的。
问题是,如何将自定义值从IDispatchMessageInspector.AfterReceiveRequest(来自WCF1收到的ASP的请求)传递给IClientMessageInspector.BeforeSendRequest(准备发送请求到WCF2)WCF SERVICE 1的操作?
是否有一些可以使用的背景?
答案 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;
}
}
}