欢迎光临
我们一直在努力

asp.net 2.0 webservice中传递datatable参考_asp.net技巧

建站超值云服务器,限时71元/月

  在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[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

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » asp.net 2.0 webservice中传递datatable参考_asp.net技巧
分享到: 更多 (0)