C# 在WCF中重新创建消息

C# 在WCF中重新创建消息,c#,wcf,C#,Wcf,我正在通过WCF从服务器检索数据(我是客户机)。不幸的是,服务器(我无法控制)有时返回无效的XML 为了解决这个问题,我计划添加一个IClientMessageInspector(在客户端上),它在WCF有机会解析返回的XML之前修改消息 我的第一步是实现IClientMessageInspector,但是让它保持响应不变(实际上应该是no-op),但由于某种原因,它会导致生成的WCF方法(client.getBar())返回null对象,而不是填充的对象 class UTF8Policer :

我正在通过WCF从服务器检索数据(我是客户机)。不幸的是,服务器(我无法控制)有时返回无效的XML

为了解决这个问题,我计划添加一个
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
。。。我所有的代码都在客户端。如果有帮助的话,我已经澄清了我的问题。