Antes do lançamento da versão oficial 2.0, vi toda a publicidade sobre os novos recursos do DataTable que suportam serialização. Achei que usar o DataTable seria tão conveniente quanto o DataSet de agora em diante. aplicou o projeto.
DataTable suporta serialização, mas a Microsoft não o tornou particularmente conveniente. Ainda precisamos fazer algum trabalho antes de podermos passar o DataTable no WebService. Caso contrário, quando fizermos referência ao DataTable, descobriremos que o DataTable se tornou um proxy. tipo.
Primeiro escreva a classe DataTableSchemaImporterExtension, o código é o seguinte:
usando o 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
o namespace System.Data Xrinehart.Tools.WebService.SchemaImporter
;
{
classe DataTableSchemaImporterExtension: SchemaImporterExtension
{
// DataTableSchemaImporterExtension é usado para WebServices, é usado para reconhecer o esquema para DataTable dentro do wsdl
Hashtable importTypes = new Hashtable();
string de substituição pública ImportSchemaType (nome da string, string schemaNamespace, contexto XmlSchemaObject, esquemas XmlSchemas, importador XmlSchemaImporter, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, opções CodeGenerationOptions, CodeDomProvider codeProvider)
{
(
schemaNamespace);
{
return null;
}
esquema XmlSchema = valores[0] como XmlSchema
if
(schema == null)
return
null
;
string de substituição pública ImportSchemaType (tipo XmlSchemaType, contexto XmlSchemaObject, esquemas XmlSchemas, importador XmlSchemaImporter, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, opções CodeGenerationOptions, CodeDomProvider codeProvider)
{
if (tipo == nulo)
{
retornar nulo
}
if (importedTypes[tipo]! = nulo)
{
mainNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataSet).Namespace));
compileUnit.ReferencedAssemblies.Add("System.Data.dll");
return (string)importedTypes[type]
}
if (!(contexto é). XmlSchemaElement))
retorna nulo;
if (o tipo é XmlSchemaComplexType)
{
XmlSchemaComplexType ct = (XmlSchemaComplexType)tipo
;
{
{
XmlSchemaAny any0 = (XmlSchemaAny)items[0];
XmlSchemaAny any1 = (XmlSchemaAny)items[1]
;
{
string typeName = typeof(DataTable
)
.FullName
;
");
return typeName;
}
}
}
}
return null;
}
}
}
Adicione esta classe a um projeto e compile o projeto após nomeá-lo fortemente.
Em seguida, adicione o assembly Assembly ao GAC.
Por fim, modifique o machine.config local, o código é o seguinte:
<sectionGroup name="system.xml.serialization" type="System.Xml.Serialization.Configuration.SerializationSectionGroup, System.Xml, Versão=2.0.0.0, Culture=neutro, PublicKeyToken=b77a5c561934e089">
<section name="schemaImporterExtensions" type="System.Xml.Serialization.Configuration.SchemaImporterExtensionsSection, System.Xml, Versão=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<section name="dateTimeSerialization" type="System.Xml.Serialization.Configuration.DateTimeSerializationSection, System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<section name="xmlSerializer" type="System.Xml.Serialization.Configuration.XmlSerializerSection, System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
<system.xml.serialization>
<schemaImporterExtensions>
<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>
Após concluir as etapas acima, compilar o WebService e referenciar novamente (ou atualizar a referência da Web), você poderá identificar corretamente o tipo DataTable.
Na verdade, o DataTable implementa apenas serialização, mas o WebService não pode desserializá-lo sozinho em um formato reconhecível, portanto, ele precisa ser adicionado manualmente. A partir disso, várias entidades de negócios podem ser derivadas de objetos da classe BusinessEntity que também podem ser transferidos diretamente por meio dos métodos acima.
Espero que ajude a todos.
http://www.cnblogs.com/Xrinehart/archive/2006/08/20/481956.html