Error: "Implícitamente no se puede convertir 'System.Data.DataSet' de tipo" error al genera la aplicación

Seleccione idioma Seleccione idioma
Id. de artículo: 815131 - Ver los productos a los que se aplica este artículo
Información de la versión beta
En este artículo se describe una versión Beta de un producto de Microsoft. La información contenida en este artículo se proporciona tal cual y está sujeta a cambios sin previo aviso.

No hay disponible soporte técnico formal del producto por parte de Microsoft para esta versión Beta. Si desea información acerca de cómo obtener soporte técnico para una versión Beta, consulte la documentación incluida con los archivos del producto o busque en el sitio Web desde el que descargó la versión.
Expandir todo | Contraer todo

En esta página

Síntomas

Tiene un servicio Web que tiene un método de Servicio Web que devuelve una instancia de una clase personalizada. La clase devuelta por el método de Servicio Web implementa la interfaz IXmlSerializable . Si utiliza este servicio Web en una aplicación, puede recibir el siguiente mensaje de error al generar la aplicación:
No se puede convertir implícitamente el tipo 'System.Data.DataSet' a 'ClassLibrary.ClassName'

Causa

Cuando se agrega una referencia Web a un servicio Web, Microsoft Visual Studio .NET utiliza incorrectamente System.Data.DataSet en lugar de la clase que implementa la interfaz IXmlSerializable . Por lo tanto, el método del Servicio Web en la clase de proxy devuelve System.Data.DataSet en lugar de la clase personalizada que implementa la interfaz IXmlSerializable . Por lo tanto, recibirá el mensaje de error al consumir el método de Servicio Web en la aplicación Web.

Solución

Para resolver este problema, reemplace manualmente System.Data.DataSet en la clase de proxy con la clase personalizada que implementa la interfaz IXmlSerializable . Para ello, siga estos pasos:
  1. En el Explorador de soluciones, haga clic en la aplicación proyecto.
  2. En el menú proyecto , haga clic en Mostrar todos los archivos .
  3. En el Explorador de soluciones, expanda Web referencias y a continuación, expanda localhost .
  4. Expanda el nodo Reference.Map y, a continuación, haga doble clic en el archivo de proxy Reference.cs o Reference.vb .
  5. Busque el método devuelve incorrectamente System.Data.DataSet . Por ejemplo, busque el siguiente código para el archivo del proxy del servicio Web que se utiliza en la sección "Más información" de este artículo:

    Código Visual C# .NET

            [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetMyObject", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
            public System.Data.DataSet GetMyObject() {
                object[] results = this.Invoke("GetMyObject", new object[0]);
                return ((System.Data.DataSet)(results[0]));
            }

    Código de Visual Basic .NET

          <System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetMyObject", RequestNamespace:="http://tempuri.org/", ResponseNamespace:="http://tempuri.org/", Use:=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle:=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)> _
          Public Function GetMyObject() As System.Data.DataSet
             Dim results() As Object = Me.Invoke("GetMyObject", New Object(-1) {})
             Return CType(results(0), System.Data.DataSet)
          End Function
  6. Reemplazar manualmente System.Data.DataSet con el nombre de la clase personalizada que implementa la interfaz IXmlSerializable . Por ejemplo, modifique el método que encontró en el paso 5 como sigue:

    Código Visual C# .NET

            [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetMyObject", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
            public MyTestClass GetMyObject() {
                object[] results = this.Invoke("GetMyObject", new object[0]);
                return ((MyTestClass)(results[0]));
            }

    Código de Visual Basic .NET

          <System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetMyObject", RequestNamespace:="http://tempuri.org/", ResponseNamespace:="http://tempuri.org/", Use:=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle:=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)> _
          Public Function GetMyObject() As MyTestClass
             Dim results() As Object = Me.Invoke("GetMyObject", New Object(-1) {})
             Return CType(results(0), MyTestClass)
          End Function

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados al principio de este artículo.

Más información

Pasos para reproducir el comportamiento

  1. Cree un nuevo proyecto de Visual Basic o servicio Web de Visual C# ASP.NET y asígnele el nombre MyTestWebService .
  2. En el Explorador de soluciones, haga clic con el botón secundario del mouse en Service1.asmx y, a continuación, haga clic en Ver código .
  3. Reemplace el código existente con el código siguiente:

    Código Visual C# .NET

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Web;
    using System.Web.Services;
    using System.Xml;
    using System.Xml.Schema;
    using System.Xml.Serialization;
    
    namespace MyTestWebService
    {
       public class MyTestWebService : WebService
       {
          public MyTestWebService()
          {
          }
          
          // Web Service method that Returns Custom Class
          [WebMethod]
          public MyTestClass GetMyObject()
          {
             MyTestClass myObj = new MyTestClass();
             return myObj;
          }
       }
    
       // Class that implements IXmlSerializable
       public class MyTestClass : IXmlSerializable
       {
          // Constructor
          public MyTestClass()
          {
          }
          
          // Implementing IXmlSerializable method GetSchema 
          XmlSchema IXmlSerializable.GetSchema()
          {
             return null;
          }
          
          // Implementing IXmlSerializable method ReadXml
          void IXmlSerializable.ReadXml(XmlReader reader)
          {
          }
    
          // Implementing IXmlSerializable method WriteXml
          void IXmlSerializable.WriteXml(XmlWriter writer)
          {
          }
       }
    }

    Código de Visual Basic .NET

    Imports System
    Imports System.Collections
    Imports System.ComponentModel
    Imports System.Data
    Imports System.Diagnostics
    Imports System.Web
    Imports System.Web.Services
    Imports System.Xml
    Imports System.Xml.Schema
    Imports System.Xml.Serialization
    
    <WebService(Namespace:="http://tempuri.org/")> _
    Public Class MyWebServiceClass
       Inherits System.Web.Services.WebService
    
       Public Sub New()
    
       End Sub
    
       <WebMethod()> _
       Public Function GetMyObject() As MyTestClass
          Dim myObj As New MyTestClass()
          Return myObj
       End Function
    
    End Class
    
    ' Class that implements IXmlSerializable
    Public Class MyTestClass
       Implements IXmlSerializable
    
       ' Default Constructor
       Public Sub New()
    
       End Sub
    
       ' Implementing IXmlSerializable method GetSchema 
       Public Function GetSchema() As XmlSchema Implements IXmlSerializable.GetSchema
    
       End Function
    
       ' Implementing IXmlSerializable method ReadXml
       Public Sub ReadXml(ByVal reader As XmlReader) Implements IXmlSerializable.ReadXml
    
       End Sub
    
       ' Implementing IXmlSerializable method WriteXml
       Public Sub WriteXml(ByVal writer As XmlWriter) Implements IXmlSerializable.WriteXml
    
       End Sub
    End Class
  4. En el menú Generar , haga clic en Generar soluciones .
  5. En el menú archivo , elija Agregar proyecto y a continuación, haga clic en Nuevo proyecto .
  6. En Tipos de proyecto , haga clic en Proyectos de Visual C# o Proyectos de Visual Basic y en plantillas , haga clic en Aplicación Web ASP.NET .
  7. Denomine el proyecto MyTestApplication y, a continuación, haga clic en Aceptar .
  8. En el Explorador de soluciones, haga clic con el botón secundario del mouse en WebForm1.aspx y, a continuación, haga clic en Ver código .
  9. Reemplace el código existente con el código siguiente:

    Código Visual C# .NET

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Xml;
    using System.Xml.Schema;
    using System.Xml.Serialization;
    
    namespace WebApplication47
    {
    	public class WebForm1 : System.Web.UI.Page
    	{
    		private void Page_Load(object sender, System.EventArgs e)
    		{
    			localhost.MyObjectService obj = new localhost.MyObjectService();
             MyTestClass objTest;
             objTest = obj.GetMyObject();
    		}
    
    		#region Web Form Designer generated code
    		override protected void OnInit(EventArgs e)
    		{
    			InitializeComponent();
    			base.OnInit(e);
    		}
    		
    		private void InitializeComponent()
    		{    
    			this.Load += new System.EventHandler(this.Page_Load);
    		}
    		#endregion
    	}
    
       // Class that implements IXmlSerializable
       public class MyTestClass : IXmlSerializable
       {
          // Constructor
          public MyTestClass()
          {
          }
          
          // Implementing IXmlSerializable method GetSchema 
          XmlSchema IXmlSerializable.GetSchema()
          {
             return null;
          }
          
          // Implementing IXmlSerializable method ReadXml
          void IXmlSerializable.ReadXml(XmlReader reader)
          {
          }
    
          // Implementing IXmlSerializable method WriteXml
          void IXmlSerializable.WriteXml(XmlWriter writer)
          {
          }
       }
    }

    Código de Visual Basic .NET

    Imports System
    Imports System.Xml
    Imports System.Xml.Schema
    Imports System.Xml.Serialization
    
    Public Class WebForm1
       Inherits System.Web.UI.Page
    
    #Region " Web Form Designer Generated Code "
    
       'This call is required by the Web Form Designer.
       <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
    
       End Sub
    
       Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
           InitializeComponent()
       End Sub
    
    #End Region
    
       Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
          Dim obj As New localhost.MyWebServiceClass()
          Dim objTest As MyTestClass
          objTest = obj.GetMyObject()
       End Sub
    
    End Class
    
    ' Class that implements IXmlSerializable
    Public Class MyTestClass
       Implements IXmlSerializable
    
       ' Default Constructor
       Public Sub New()
    
       End Sub
    
       ' Implementing IXmlSerializable method GetSchema 
       Public Function GetSchema() As System.Xml.Schema.XmlSchema Implements IXmlSerializable.GetSchema
    
       End Function
    
       ' Implementing IXmlSerializable method ReadXml
       Public Sub ReadXml(ByVal reader As System.Xml.XmlReader) Implements IXmlSerializable.ReadXml
    
       End Sub
    
       ' Implementing IXmlSerializable method WriteXml
       Public Sub WriteXml(ByVal writer As System.Xml.XmlWriter) Implements IXmlSerializable.WriteXml
    
       End Sub
    End Class
  10. En el Explorador de soluciones, haga clic con el botón secundario del mouse en MyTestApplication y, a continuación, haga clic en Agregar referencia Web .
  11. En el cuadro de texto dirección , escriba http://localhost/MyTestWebService/Service1.asmx y, a continuación, presione ENTRAR.
  12. Haga clic en agrega referencia .
  13. En el menú archivo , haga clic en Guardar todo .
  14. En el menú Generar , haga clic en Generar soluciones . Durante la compilación de MyTestApplication, recibirá el mensaje de error que se describe en la sección "Síntomas".

Referencias

Para obtener más información, visite los siguientes sitios Web de Microsoft Developer Network (MSDN):
Fundamentos XML Web Services
http://msdn2.microsoft.com/en-us/library/ms996507.aspx
Clase WebService
http://msdn2.microsoft.com/en-us/library/system.web.services.webservice(vs.71).aspx
Declarar un servicio Web XML
http://msdn2.microsoft.com/en-us/library/aa719891(VS.71).aspx

Propiedades

Id. de artículo: 815131 - Última revisión: sábado, 12 de mayo de 2007 - Versión: 2.5
La información de este artículo se refiere a:
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft .NET Framework 1.0
  • Microsoft .NET Framework 1.1
Palabras clave: 
kbmt kbvs2002sp1sweep kbcodegen kbwebservices kbbug KB815131 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 815131

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com