控制WCF XmlSerializer

时间:2020-03-06 14:58:08  来源:igfitidea点击:

我在WCF中实现了一些REST Web服务。我希望这些服务在xml包含无效元素时返回"错误请求"。

XmlSerializer正在处理xml序列化。默认情况下,XmlSerializer会忽略未知元素。我知道可以钩住XmlSerializer.UnknownElement并从此处理程序中引发异常,但是因为这在WCF中,所以我无法控制序列化。关于如何实现此行为的任何想法。

解决方案

也许我们可以返回实现IXmlSerializable的自己的类型,并在ReadXml和WriteXml方法中阻止所需的异常...

这是由于内存不清晰,因为我手头没有全部代码,但是我们可以创建一个自定义Message(类为" Message"的继承)类型以返回REST服务并重写某些方法以创建自定义响应。

protected override void OnWriteMessage(XmlDictionaryWriter writer)
    {
        ...
    }

    protected override void OnWriteStartEnvelope(XmlDictionaryWriter writer)
    {
        ...
    }

    protected override void OnWriteStartBody(XmlDictionaryWriter writer)
    {
        ...
    }

    protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
    {
        ...
    }

这不是一个完整的答案,但可能会将我们推向正确的道路。

"我知道可以钩住XmlSerializer.UnknownElement并从此处理程序中引发异常,但是因为这在WCF中,所以我无法控制序列化"

实际上有可能做到这一点...

在我从事的WCF项目中,我们使用IDispatchMessageFormatter接口做了类似的事情。

可以在这里找到更多信息http://nayyeri.net/blog/use-idispatchmessageformatter-and-iclientmessageformatter-to-customize-messages-in-wcf/

它允许我们在消息头处达到峰值,控制序列化/反序列化,返回状态代码等。