ASP.NET 2.0 WebService中传递DataTable参考
点击次数:25 次 发布日期:2008-11-26 12:25:05 作者:源代码网
|
源代码网推荐 DataTable是支持序列化了,但是微软并没有把他做的特别方便,还需要我们自己来做一些工作之后才能够在WebService里面传递DataTable,否则在引用DataTable的时候会发现DataTable变成了一个什么Proxy类型。 源代码网推荐 首先编写类DataTableSchemaImporterExtension,代码如下: 源代码网推荐 using System; 源代码网推荐 using System.Collections.Generic; 源代码网推荐 using System.Text; 源代码网推荐 using System.Xml.Serialization.Advanced; 源代码网推荐 using System.Collections; 源代码网推荐 using System.Xml.Schema; 源代码网推荐 using System.Xml.Serialization; 源代码网推荐 using System.CodeDom; 源代码网推荐 using System.CodeDom.Compiler; 源代码网推荐 using System.Xml; 源代码网推荐 using System.Data; 源代码网推荐 源代码网推荐 namespace Xrinehart.Tools.WebService.SchemaImporter 源代码网推荐 { 源代码网推荐 class DataTableSchemaImporterExtension : SchemaImporterExtension 源代码网推荐 { 源代码网推荐 源代码网推荐 // DataTableSchemaImporterExtension is used for WebServices, it is used to recognize the schema for DataTable within wsdl 源代码网推荐 源代码网推荐 Hashtable importedTypes = new Hashtable(); 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 public override string ImportSchemaType(string name, string schemaNamespace, XmlSchemaObject context, XmlSchemas schemas, XmlSchemaImporter importer, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions options, CodeDomProvider codeProvider) 源代码网推荐 { 源代码网推荐 源代码网推荐 IList values = schemas.GetSchemas(schemaNamespace); 源代码网推荐 源代码网推荐 if (values.Count != 1) 源代码网推荐 { 源代码网推荐 源代码网推荐 return null; 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 XmlSchema schema = values[0] as XmlSchema; 源代码网推荐 源代码网推荐 if (schema == null) 源代码网推荐 源代码网推荐 return null; 源代码网推荐 源代码网推荐 XmlSchemaType type = (XmlSchemaType)schema.SchemaTypes[new XmlQualifiedName(name, schemaNamespace)]; 源代码网推荐 源代码网推荐 return ImportSchemaType(type, context, schemas, importer, compileUnit, mainNamespace, options, codeProvider); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 public override string ImportSchemaType(XmlSchemaType type, XmlSchemaObject context, XmlSchemas schemas, XmlSchemaImporter importer, CodeCompileUnit compileUnit, CodeNamespace mainNamespace, CodeGenerationOptions options, CodeDomProvider codeProvider) 源代码网推荐 { 源代码网推荐 源代码网推荐 if (type == null) 源代码网推荐 { 源代码网推荐 源代码网推荐 return null; 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 if (importedTypes[type] != null) 源代码网推荐 { 源代码网推荐 源代码网推荐 mainNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataSet).Namespace)); 源代码网推荐 源代码网推荐 compileUnit.ReferencedAssemblies.Add("System.Data.dll"); 源代码网推荐 源代码网推荐 return (string)importedTypes[type]; 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 if (!(context is XmlSchemaElement)) 源代码网推荐 源代码网推荐 return null; 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 if (type is XmlSchemaComplexType) 源代码网推荐 { 源代码网推荐 源代码网推荐 XmlSchemaComplexType ct = (XmlSchemaComplexType)type; 源代码网推荐 源代码网推荐 if (ct.Particle is XmlSchemaSequence) 源代码网推荐 { 源代码网推荐 源代码网推荐 XmlSchemaObjectCollection items = ((XmlSchemaSequence)ct.Particle).Items; 源代码网推荐 源代码网推荐 if (items.Count == 2 && items[0] is XmlSchemaAny && items[1] is XmlSchemaAny) 源代码网推荐 { 源代码网推荐 源代码网推荐 XmlSchemaAny any0 = (XmlSchemaAny)items[0]; 源代码网推荐 源代码网推荐 XmlSchemaAny any1 = (XmlSchemaAny)items[1]; 源代码网推荐 源代码网推荐 if (any0.Namespace == XmlSchema.Namespace && any1.Namespace == "urn:schemas-microsoft-com:xml-diffgram-v1") 源代码网推荐 { 源代码网推荐 源代码网推荐 string typeName = typeof(DataTable).FullName; 源代码网推荐 源代码网推荐 importedTypes.Add(type, typeName); 源代码网推荐 源代码网推荐 mainNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataTable).Namespace)); 源代码网推荐 源代码网推荐 compileUnit.ReferencedAssemblies.Add("System.Data.dll"); 源代码网推荐 源代码网推荐 return typeName; 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 return null; 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 } 源代码网推荐 为此类添加进一个项目中,并将此项目进行强命名后编译。 源代码网推荐 源代码网推荐 然后,把该Assembly程序集加入到GAC中。 源代码网推荐 源代码网推荐 最后修改本机的machine.config,代码如下: 源代码网推荐 <sectionGroup name="system.xml.serialization" type="System.Xml.Serialization.Configuration.SerializationSectionGroup, System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 源代码网推荐 <section name="schemaImporterExtensions" type="System.Xml.Serialization.Configuration.SchemaImporterExtensionsSection, System.Xml, Version=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> 源代码网推荐 源代码网推荐 完成以上的步骤后,再编译WebService,重新引用(或者更新Web引用),就可以正确的识别DataTable类型了。 源代码网推荐 其实DataTable只实现了序列化,但WebService并不能自己反序列化为可识别的格式,所以需要自己手动增加。由此可以衍生为各种业务实体BussinessEntity类对象也可以通过以上方式实现直接传递。 源代码网推荐 源代码网推荐 希望对大家有所帮助。 源代码网推荐 源代码网推荐 http://www.cnblogs.com/Xrinehart/archive/2006/08/20/481956.html 源代码网推荐 源代码网推荐 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
