我正在通过WCF从服务器检索数据(我是客户端)。不幸的是,服务器(我无法控制)有时会返回无效的XML。
为了解决这个问题,我计划在客户端添加IClientMessageInspector
,在WCF有机会解析返回的XML之前修改Message
。
我的第一步是实现IClientMessageInspector
,但是让它保持响应不变(它实际上应该是无操作),但由于某种原因它会导致生成的WCF方法({{1}下面)返回一个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());
为空。如果我注释了检查员注册,response
可以正常工作。
因此,我的结论是,我在某种程度上使response
内的消息无效。任何人都可以建议重新创建收到的消息的正确方法是什么?
一旦我完成了这项工作,我希望在AfterReceiveReply
内修复XML是微不足道的,这样它实际上可以做一些有用的事情。
答案 0 :(得分:1)
参数参数不适用于WCF。
当您对服务进行调用时,所有内容都会作为序列化的输入消息传递。然后服务反序列化它并完成工作,最后它返回一个序列化响应给客户端反序列化的客户端。
ref参数可能会编译,但绝不保留对客户端计算机中的内存指针的引用。您必须使用响应返回对象。