Problemas al utilizar un servicio Web XML devuelve un objeto DataTable

Síntomas

Cuando se desplaza a la dirección URL de un servicio Web XML que devuelve un objeto DataTable de uno de sus métodos Web, puede recibir el siguiente mensaje de error:
No se puede serializar System.Data.DataRelation porque no tiene un constructor público predeterminado.
También puede ver un mensaje de error similar al siguiente cuando intenta establecer una referencia Web al servicio Web XML en el entorno de desarrollo integrado (IDE) de Visual Studio .NET:
Error interno del servidor. No se puede solicitar "http://localhost/Webservice1/Service1.asmx?WSDL". El servidor respondió con código de error "Error de protocolo".
Con el.NET Framework 1.1 Service Pack 1 (SP1), puede recibir el siguiente mensaje de error:
System.NotSupportedException: No se puede serializar el miembro System.ComponentModel.MarshalByValueComponent.Site de tipo System.ComponentModel.ISite porque es una interfaz.
También puede recibir una página en blanco en lugar de cualquiera de estos mensajes de error si Mostrar mensajes de error HTTP descriptivos está habilitada en Microsoft Internet Explorer. De forma predeterminada, está habilitada la opción Mostrar mensajes de error HTTP descriptivos .

Si intenta agregar una referencia Web a un servicio Web XML que devuelve un objeto DataTable, puede recibir el siguiente mensaje de error:
El documento en la dirección url de http://<server>/vdir/service1.asmx no se reconoció como tipo de documento conocido.

Causa

Los objetos DataTable, DataRow, DataViewy DataViewManager no se puede serializar y no pueden ser devueltos desde un servicio Web XML. Para devolver en menos de un completo conjunto de datos, debe copiar los datos que desee volver a un nuevo conjunto de datos.

Solución

Para resolver este problema, devolver un conjunto de datos en lugar de una DataTable. Objetos DataSet pueden contener uno o más objetos DataTable .

Estado

Este comportamiento es por diseño.

Más información

Pasos para reproducir el comportamiento

Nota: se proporciona código de ejemplo para .NET de Visual Basic, Visual C# .NET y Visual J#. NET.
  1. Agregue un método Web que devuelve un objeto DataTable a un servicio Web XML existente. El código siguiente crea una conexión a una base de datos de Microsoft SQL Server y recupera la tabla Authors. Si desea utilizar el código, modificarlo para conectarse a uno de los equipos de SQL Server.
    'Visual Basic    <WebMethod()> Function GiveMeADataTable() As System.Data.DataTable
    Dim conn As New System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;")
    Dim ds As New System.Data.DataSet()
    Dim adapter As New System.Data.SqlClient.SqlDataAdapter()
    adapter.SelectCommand = New System.Data.SqlClient.SqlCommand("Select * From Authors", conn)
    adapter.Fill(ds, "Authors")
    Return ds.Tables("Authors")
    End Function

    //Visual C#   [WebMethod]
    public System.Data.DataTable GiveMeADataTable()
    {
    System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;");
    System.Data.DataSet ds = new System.Data.DataSet();
    System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter();
    adapter.SelectCommand = new System.Data.SqlClient.SqlCommand("Select * From Authors", conn);
    adapter.Fill(ds, "Authors");
    return ds.Tables["Authors"];
    }


    /**Visual J# */ /** @attribute WebMethod() */ 
    public System.Data.DataTable GiveMeADataTable()
    {
    System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;");
    System.Data.DataSet ds = new System.Data.DataSet();
    System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter();
    adapter.set_SelectCommand(new System.Data.SqlClient.SqlCommand("Select * From Authors", conn));
    adapter.Fill(ds, "Authors");
    System.Data.DataTableCollection dtc = ds.get_Tables();
    return dtc.get_Item("Authors");
    }

  2. Compile el servicio Web XML.
  3. Vaya a la dirección URL del servicio Web XML en el que acaba de agregar el código. Tenga en cuenta que recibirá un mensaje de error.
  4. Modifique el código como sigue, para devolver un conjunto de datos en lugar de una DataTable:
    'Visual Basic    <WebMethod()> Function GiveMeADataSet() As System.Data.DataSet
    Dim conn As New System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;")
    Dim ds As New System.Data.DataSet()
    Dim adapter As New System.Data.SqlClient.SqlDataAdapter()
    adapter.SelectCommand = New System.Data.SqlClient.SqlCommand("Select * From Authors", conn)
    adapter.Fill(ds, "Authors")
    Return ds
    End Function

    //Visual C#   [WebMethod]
    public System.Data.DataSet GiveMeADataSet()
    {
    System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;");
    System.Data.DataSet ds = new System.Data.DataSet();
    System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter();
    adapter.SelectCommand = new System.Data.SqlClient.SqlCommand("Select * From Authors", conn);
    adapter.Fill(ds, "Authors");
    return ds;
    }


    /**Visual J# */ /** @attribute WebMethod() */ 
    public System.Data.DataSet GiveMeADataSet()
    {
    System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("Server=YourServer;Initial Catalog=pubs;Integrated Security=SSPI;");
    System.Data.DataSet ds = new System.Data.DataSet();
    System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter();
    adapter.set_SelectCommand(new System.Data.SqlClient.SqlCommand("Select * From Authors", conn));
    adapter.Fill(ds, "Authors");
    return ds;
    }

  5. Compile el servicio Web XML.
  6. Vaya a la dirección URL del servicio Web XML en el que acaba de agregar el código anterior. Tenga en cuenta que no recibe un mensaje de error.
Propiedades

Id. de artículo: 306134 - Última revisión: 22 ene. 2017 - Revisión: 1

Comentarios