在WCF中重新创建消息

时间:2015-07-23 12:31:24

标签: c# wcf

我正在通过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是微不足道的,这样它实际上可以做一些有用的事情。

1 个答案:

答案 0 :(得分:1)

参数参数不适用于WCF。

当您对服务进行调用时,所有内容都会作为序列化的输入消息传递。然后服务反序列化它并完成工作,最后它返回一个序列化响应给客户端反序列化的客户端。

ref参数可能会编译,但绝不保留对客户端计算机中的内存指针的引用。您必须使用响应返回对象。