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! :)

Foi útil?

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á.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top