Pregunta

Estoy construyendo un servicio web WCF que devuelve un objeto compuesto que tiene una apariencia similar a la siguiente:

    [DataContract]
    public class WebServiceReturn
    {
        ...

        [DataMember]
        public XmlElement Results { get; set; }

        ...
    }

Cuando regrese un objeto WebServiceReturn con el siguiente código, todo está bien:

    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;
    }

Sin embargo, cuando se utiliza el código de abajo, que toma un XmlElement de los resultados de una llamada de procedimiento almacenado que devuelve un XmlDataDocument, se emite una CommunicationException (que no tiene excepciones interiores).

XmlDataDocument xdd = DataAccess.ExecuteXML("MyStoredProc", parameter);
response.Results = xdd.DocumentElement;

La parte confusa es si puedo convertir el XmlDataDocument.DocumentElement (que es un XmlElement) en una XElement y luego de nuevo en un XmlElement, no hay problemas (Vaya que fue un bocado) - por lo que el código siguiente devuelve sin ningún 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;
        }   

Los detalles CommunicationException son:

[CommunicationException: El servidor no proporcionó una respuesta significativa; Esto puede ser causado por un desajuste contrato, un cierre de sesión prematuro o un error interno del servidor.]

También he actualizado la referencia de servicio en mi aplicación de prueba varias veces, lo cual ha tenido ningún efecto.

es el problema con mi código de prueba que llama al servicio web? ¿Por qué convertir un XmlElement en un XElement y luego de nuevo en un XmlElement solucionar el problema? Cualquier información en absoluto sería muy apreciada! :)

¿Fue útil?

Solución

No sé nada extraño en XmlDataDocument, pero no necesariamente tienen la XDocument - Proveedores:

XmlDocument newDoc = new XmlDocument();
newDoc.Load(new XmlNodeReader(doc.DocumentElement));
return newDoc.DocumentElement;

Aún así no es ideal, pero se ve más limpio que me ...

Otros consejos

Bueno, con el fin de obtener más información de error, será necesario que habilite los detalles de depuración de fallos del servidor - el mensaje que está recibiendo en este momento es el error genérico, revelar nada a posibles atacantes-WCF mensaje, básicamente diciendo:. algo salió mal

Con el fin de hacer eso, es necesario ajustar su configuración de servicios - añadir esta sección (si no tiene ya uno):

<behaviors>
  <serviceBehaviors>
    <behavior name="MEXandDebug">
      <serviceMetadata />
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

y después hacer referencia a esa sección de su definición de servicio:

<services>
  <service behaviorConfiguration="MEXandDebug" name="WCFService.MyWCFService">

Eso te dará un error más significativo, el cual esperamos le da una idea de lo que va mal.

De lo contrario tendrá que depurar en el código del lado del servidor y averiguar lo que está pasando allí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top