zoukankan      html  css  js  c++  java
  • ASP.NET 2.0 WebService中传递DataTable参考

      在2.0正式版发布之前,就满天的看到关于DataTable支持序列化的新特性宣传,满以为从此以后使用DataTable就和DataSet一样方便了,结果在应用项目的时候才发现并非那么回事。
      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[0as 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[0is XmlSchemaAny && items[1is 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类对象也可以通过以上方式实现直接传递。

      希望对大家有所帮助。

  • 相关阅读:
    Redis事务和锁
    11/6笔记 补充(Redis持久化,RDB&&AOF)
    11/6随笔
    Redis 安装教程
    Redis通用指令和第一个Jedis程序的实现
    Redis学习第二天
    SpringBoot学习笔记
    1000行代码手写服务器
    log4j创建实例异常
    寒假阅读人月神话3
  • 原文地址:https://www.cnblogs.com/Xrinehart/p/481956.html
Copyright © 2011-2022 走看看