WCF não pode Retorno XmlElement de XmlDataDocument.DocumentElement
-
19-09-2019 - |
Pergunta
Eu estou construindo um serviço web WCF que retorna um objeto composto que se parece com o seguinte:
[DataContract]
public class WebServiceReturn
{
...
[DataMember]
public XmlElement Results { get; set; }
...
}
Quando eu retornar um objeto WebServiceReturn com o seguinte código, está tudo bem:
XElement cities = new XElement("Cities",
from r in results
select new XElement("City", r));
using (XmlReader xmlReader = cities.CreateReader())
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlReader);
WebServiceReturn response = new WebServiceReturn();
response.Results = xmlDoc.DocumentElement;
}
No entanto, quando eu uso o código abaixo, que leva um XmlElement a partir dos resultados de uma chamada de procedimento armazenado que retorna um XmlDataDocument, uma CommunicationException é lançado (que não tem exceções internas).
XmlDataDocument xdd = DataAccess.ExecuteXML("MyStoredProc", parameter);
response.Results = xdd.DocumentElement;
A parte confusa é se eu converter o XmlDataDocument.DocumentElement (que é um XmlElement) em um XElement e depois de volta para um XmlElement, não há problemas (wow que foi um bocado) - assim os seguintes retornos de código com nenhum problema .
XmlElement xe = DataAccess.ExecuteXML("MyStoredProc", parameter).DocumentElement;
XDocument xDoc = new XDocument();
using (XmlWriter xmlWriter = xDoc.CreateWriter()){
xe.WriteTo(xmlWriter);
}
using (XmlReader xmlReader = xDoc.Root.CreateReader())
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlReader);
response.Results = xmlDoc.DocumentElement;
}
Os detalhes CommunicationException são:
[CommunicationException: O servidor não forneceu uma resposta significativa; isso pode ser causado por uma incompatibilidade do contrato, um desligamento sessão prematura ou um erro interno do servidor.]
Eu também atualizou a referência de serviço no meu aplicativo de teste várias vezes que não teve efeito.
O problema com o meu código de teste que está chamando o serviço web? Por que a conversão de um XmlElement em um XElement e depois de volta para uma correção XmlElement o problema? Qualquer informação a todos seria muito apreciada! :)
Solução
Eu não sei nada de estranho XmlDataDocument
, mas você não precisa necessariamente a XDocument
- tentativa:
XmlDocument newDoc = new XmlDocument();
newDoc.Load(new XmlNodeReader(doc.DocumentElement));
return newDoc.DocumentElement;
Ainda não é o ideal, mas parece mais limpo para mim ...
Outras dicas
Bem, a fim de obter mais informações sobre o erro, você precisa habilitar os detalhes de depuração em culpa do seu servidor - a mensagem que você está recebendo agora é o genérico, revelam-nada-a-possíveis-atacantes erro WCF mensagem, basicamente, dizendo:. algo deu errado
A fim de fazer isso, você precisa de ajustar sua configuração do serviço - adicione esta secção (se você não tiver um):
<behaviors>
<serviceBehaviors>
<behavior name="MEXandDebug">
<serviceMetadata />
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
e, em seguida, fazer referência a essa seção de sua definição de serviço:
<services>
<service behaviorConfiguration="MEXandDebug" name="WCFService.MyWCFService">
Isso deve dar-lhe um erro mais significativo, o que esperamos que lhe dá uma idéia do que vai mal.
Caso contrário, você vai precisar de depuração no código do lado do servidor e descobrir o que está acontecendo lá.