Управление WCF XmlSerializer - PullRequest
       6

Управление WCF XmlSerializer

2 голосов
/ 01 октября 2008

У меня есть несколько веб-сервисов REST, реализованных в WCF. Я хочу, чтобы эти сервисы возвращали «Bad Request», когда xml содержит недопустимые элементы.

Сериализация xml обрабатывается XmlSerializer. По умолчанию XmlSerializer игнорирует неизвестные элементы. Я знаю, что можно перехватить XmlSerializer.UnknownElement и выдать исключение из этого обработчика, но, поскольку это в WCF, я не могу контролировать сериализацию Любые идеи, как я мог бы реализовать это поведение.

Ответы [ 3 ]

2 голосов
/ 01 июля 2009

"Я знаю, что можно перехватить XmlSerializer.UnknownElement и выдать исключение из этого обработчика, но, поскольку это в WCF, я не могу контролировать сериализацию"

На самом деле это можно сделать ...

В проекте WCF, над которым я работал, мы сделали нечто подобное, используя интерфейс IDispatchMessageFormatter.

Более подробную информацию можно найти здесь http://nayyeri.net/blog/use-idispatchmessageformatter-and-iclientmessageformatter-to-customize-messages-in-wcf/

Позволяет пиковать заголовки сообщений, управлять сериализацией / десериализацией, возвращать коды состояния и т. Д.

1 голос
/ 02 октября 2008

Это из расплывчатой ​​памяти, так как у меня нет всего кода, но вы можете создать пользовательский тип 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)
    {
        ...
    }

Не полный ответ, но может подтолкнуть вас на правильный путь.

1 голос
/ 02 октября 2008

Может быть, вы можете вернуть свой собственный тип, реализующий IXmlSerializable, и выдать исключение, которое вы хотите в методах ReadXml и WriteXml ...

...