在 WCF 中重新创建消息
Recreating a Message in WCF
我正在通过 WCF 从服务器检索数据(我是客户端)。不幸的是,服务器(我无法控制)有时 returning 无效 XML。
为了解决这个问题,我计划添加一个 IClientMessageInspector
(在客户端),它会在 WCF 有机会解析 returned [= 之前修改 Message
36=]。
我的第一步是实现 IClientMessageInspector
,但它让响应保持不变(它实际上应该是一个无操作),但由于某种原因它导致生成的 WCF 方法(client.getBar()
下面)到 return 一个 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
中的消息无效。谁能告诉我重新创建收到的消息的正确方法是什么?
一旦我完成了这项工作,我希望修复 AfterReceiveReply
中的 XML 会变得很简单,这样它实际上会做一些有用的事情。
Ref 参数不适用于 WCF。
当您调用服务时,所有内容都作为序列化的输入消息传递。然后服务反序列化它并完成工作,最后它 return 对在客户端反序列化的客户端的序列化响应。
ref 参数可能会编译,但您绝不会在客户端计算机中保留对内存指针的引用。您必须使用对 return 返回对象的响应。
我正在通过 WCF 从服务器检索数据(我是客户端)。不幸的是,服务器(我无法控制)有时 returning 无效 XML。
为了解决这个问题,我计划添加一个 IClientMessageInspector
(在客户端),它会在 WCF 有机会解析 returned [= 之前修改 Message
36=]。
我的第一步是实现 IClientMessageInspector
,但它让响应保持不变(它实际上应该是一个无操作),但由于某种原因它导致生成的 WCF 方法(client.getBar()
下面)到 return 一个 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
中的消息无效。谁能告诉我重新创建收到的消息的正确方法是什么?
一旦我完成了这项工作,我希望修复 AfterReceiveReply
中的 XML 会变得很简单,这样它实际上会做一些有用的事情。
Ref 参数不适用于 WCF。
当您调用服务时,所有内容都作为序列化的输入消息传递。然后服务反序列化它并完成工作,最后它 return 对在客户端反序列化的客户端的序列化响应。
ref 参数可能会编译,但您绝不会在客户端计算机中保留对内存指针的引用。您必须使用对 return 返回对象的响应。