Antes de que se lanzara la versión oficial 2.0, vi toda la publicidad sobre las nuevas funciones de DataTable que admiten la serialización. Pensé que usar DataTable sería tan conveniente como DataSet a partir de ahora. Sin embargo, descubrí que este no era el caso. aplicado el proyecto.
DataTable admite la serialización, pero Microsoft no lo ha hecho particularmente conveniente. Aún necesitamos hacer algo de trabajo nosotros mismos antes de poder pasar DataTable en WebService. De lo contrario, cuando hagamos referencia a DataTable, encontraremos que DataTable se ha convertido en un proxy. tipo.
Primero escriba la clase DataTableSchemaImporterExtension, el código es el siguiente:
usando Sistema;
usando System.Collections.Generic;
usando System.Text;
usando System.Xml.Serialization.Advanced;
usando System.Collections;
usando System.Xml.Schema;
usando System.Xml.Serialization;
usando System.CodeDom;
usando System.CodeDom.Compiler;
usando System.Xml;
usando
el espacio de nombres System.Data Xrinehart.Tools.WebService.SchemaImporter
;
{
clase DataTableSchemaImporterExtension: SchemaImporterExtension
{
// DataTableSchemaImporterExtension se usa para servicios web, se usa para reconocer el esquema de DataTable dentro de wsdl
Hashtable importTypes = new Hashtable();
cadena de anulación pública ImportSchemaType (nombre de cadena, cadena SchemaNamespace, contexto XmlSchemaObject, esquemas XmlSchemas, importador XmlSchemaImporter, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, opciones CodeGenerationOptions, CodeDomProvider codeProvider)
{
IList valores = esquemas.GetSchemas(schemaNamespace);
si (valores.Count!= 1)
{
retornar nulo;
}
esquema XmlSchema = valores [0] como XmlSchema;
si (esquema == nulo)
devuelve
nulo
, esquemas, importador, compileUnit, mainNamespace, opciones, codeProvider);
cadena de anulación pública ImportSchemaType (tipo XmlSchemaType, contexto XmlSchemaObject, esquemas XmlSchemas, importador XmlSchemaImporter, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, opciones CodeGenerationOptions, CodeDomProvider codeProvider)
{
si (tipo == nulo)
{
return null;
}
if (tipos importados[tipo]!= null)
{
mainNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataSet).Namespace));
compileUnit.ReferencedAssemblies.Add("System.Data.dll");
return
(
cadena)importedTypes[tipo];
XmlSchemaElement))
devuelve nulo;
si (el tipo es XmlSchemaComplexType)
{
XmlSchemaComplexType ct = (XmlSchemaComplexType)tipo
si (ct.Particle es XmlSchemaSequence)
{
{
XmlSchemaAny any0 = (XmlSchemaAny)elementos[0];
XmlSchemaAny any1 = (XmlSchemaAny)elementos[1]
if (any0.Namespace == diffgram-v1")
{
cadena typeName = typeof(DataTable).FullName;
importTypes.Add(type,
typeNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataTable).Namespace));
compileUnit.ReferencedAssemblies.Add("System.Data.dll) ");
devolver nombre de tipo;
}
}
}
}
devolver nulo;
}
}
}
Agregue esta clase a un proyecto y compílelo después de asignarle un nombre fuerte.
Luego, agregue la asamblea de la Asamblea al GAC.
Finalmente modifique el machine.config local, el código es el siguiente:
<sectionGroup name="system.xml.serialization" type="System.Xml.Serialization.Configuration.SerializationSectionGroup, System.Xml, Versión=2.0.0.0, Cultura=neutral, PublicKeyToken=b77a5c561934e089">
<section name="schemaImporterExtensions" type="System.Xml.Serialization.Configuration.SchemaImporterExtensionsSection, System.Xml, Versión=2.0.0.0, Cultura=neutral, PublicKeyToken=b77a5c561934e089" />
<section name="dateTimeSerialization" type="System.Xml.Serialization.Configuration.DateTimeSerializationSection, System.Xml, Versión=2.0.0.0, Cultura=neutral, PublicKeyToken=b77a5c561934e089" />
<section name="xmlSerializer" type="System.Xml.Serialization.Configuration.XmlSerializerSection, System.Xml, Versión=2.0.0.0, Cultura=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</secciónGrupo>
<sistema.xml.serialización>
<extensiones de importador de esquema>
<add name="dataTableSchemaImporterExtension" type="Xrinehart.Tools.WebService.SchemaImporter.DataTableSchemaImporterExtension, Xrinehart.Tools.WebService.SchemaImporter,Version=1.0.0.0,Culture=neutral,PublicKeyToken=5a627ce15fb94702" />
</schemaImporterExtensions>
</system.xml.serialization>
Después de completar los pasos anteriores, compilar el servicio web y volver a hacer referencia (o actualizar la referencia web), podrá identificar correctamente el tipo de DataTable.
De hecho, DataTable solo implementa la serialización, pero WebService no puede deserializarlo en un formato reconocible por sí solo, por lo que debe agregarse manualmente. A partir de esto, se pueden derivar varias entidades comerciales. Los objetos de la clase BusinessEntity también se pueden transferir directamente a través de los métodos anteriores.
Espero que ayude a todos.
http://www.cnblogs.com/Xrinehart/archive/2006/08/20/481956.html