Controlando o FCM XmlSerializer
-
03-07-2019 - |
Pergunta
Eu tenho alguns serviços REST web implementado no WCF. Quero fazer estes serviços retornar "Bad Request" quando o XML contém elementos inválidos.
A serialização XML está sendo tratado pelo XmlSerializer. Por padrão XmlSerializer ignora elementos desconhecidos. Eu sei que é possível ligar XmlSerializer.UnknownElement e lançar uma exceção deste manipulador, mas porque este está em WCF Eu não tenho controle sobre a serialização. Alguma idéia de como eu poderia implementar este comportamento.
Solução
"Eu sei que é possível ligar XmlSerializer.UnknownElement e lançar uma exceção deste manipulador, mas porque este está em WCF Eu não tenho controle sobre a serialização"
É realmente possível fazer isso ...
Em um projeto WCF que eu trabalhei, fizemos algo semelhante usando a interface IDispatchMessageFormatter.
Mais informação pode ser encontrada aqui http://nayyeri.net/blog/use-idispatchmessageformatter-and-iclientmessageformatter-to-customize-messages-in-wcf/
Ele permite que você pico nos cabeçalhos de mensagens, controle de serialização / desserialização, códigos de status de retorno etc.
Outras dicas
Talvez você possa voltar o seu próprio tipo de implementar IXmlSerializable e lançar a exceção que você quer no ReadXml e WriteXml ...
Esta é a partir vaga memória como eu não tenho todo o código para a mão, mas você pode criar uma mensagem personalizada (herdam para a classe "Mensagem") tipo para retornar em seus serviços REST e substituir determinados métodos para criar personalizado respostas.
protected override void OnWriteMessage(XmlDictionaryWriter writer)
{
...
}
protected override void OnWriteStartEnvelope(XmlDictionaryWriter writer)
{
...
}
protected override void OnWriteStartBody(XmlDictionaryWriter writer)
{
...
}
protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
{
...
}
Não é uma resposta completa, mas pode empurrá-lo para o caminho certo.