C# 在WCF中重新创建消息
我正在通过WCF从服务器检索数据(我是客户机)。不幸的是,服务器(我无法控制)有时返回无效的XML 为了解决这个问题,我计划添加一个C# 在WCF中重新创建消息,c#,wcf,C#,Wcf,我正在通过WCF从服务器检索数据(我是客户机)。不幸的是,服务器(我无法控制)有时返回无效的XML 为了解决这个问题,我计划添加一个IClientMessageInspector(在客户端上),它在WCF有机会解析返回的XML之前修改消息 我的第一步是实现IClientMessageInspector,但是让它保持响应不变(实际上应该是no-op),但由于某种原因,它会导致生成的WCF方法(client.getBar())返回null对象,而不是填充的对象 class UTF8Policer :
IClientMessageInspector
(在客户端上),它在WCF有机会解析返回的XML之前修改消息
我的第一步是实现IClientMessageInspector
,但是让它保持响应不变(实际上应该是no-op),但由于某种原因,它会导致生成的WCF方法(client.getBar()
)返回null
对象,而不是填充的对象
class UTF8Policer : IClientMessageInspector
{
public void AfterReceiveReply(ref Message reply, object correlationState)
{
Message revised = null;
var contents = new StringBuilder();
var writer = XmlWriter.Create(contents);
reply.WriteMessage(writer);
writer.Flush();
revised = Message.CreateMessage(reply.Version, reply.Headers.Action, XmlReader.Create(new StringReader(contents.ToString()));
revised.Headers.CopyHeadersFrom(reply);
revised.Properties.CopyProperties(reply.Properties);
reply = revised;
}
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
return null;
}
}
但是,在运行时:
var client = new Foo_RPCClient();
var header = new header();
// This is what registers the inspector
client.Endpoint.EndpointBehaviors.Add(new FooEndpointBehaviour());
var response = client.getBar(ref header, new BarRequest());
<代码>响应
为空。如果我注释掉检查员注册,响应
有效
因此,我的结论是,我在某种程度上在接收方之后使中的消息无效。有人能告诉我重新创建收到的消息的正确方法吗
一旦我完成了这项工作,我希望在接收后修复中的XML将变得很简单,这样它实际上可以做一些有用的事情。Ref参数不会与WCF一起工作
当您对服务进行调用时,所有内容都将作为序列化的输入消息传递。然后,服务将其反序列化并执行工作,最后它将向客户端反序列化的客户端返回一个序列化响应
ref参数可能会编译,但决不能在客户端计算机中保留对内存指针的引用。您必须使用响应返回对象。感谢您的帮助。。。我理解你的第二段,但我正在努力理解第三段,尤其是你的最后一句话。为了澄清,万一有任何混乱。。。我的AfterReceiverly
正在客户端上执行,我希望它在反序列化之前修改表示服务器响应的消息
,WCF意识到部分XML无效。Franck,我认为我在哪里实现IClientMessageInspector
。。。我所有的代码都在客户端。如果有帮助的话,我已经澄清了我的问题。不要使用ref
,因为它们对WCF毫无用处,只需发送实例创建副本修改副本并发回该副本或使用out
parameters@Fabjan:我想我在哪里实现了IClientMessageInspector
。。。我所有的代码都在客户端。如果有帮助的话,我已经澄清了我的问题。