ASP.NET 2.0 WebService中传递DataTable参考

2008-02-22 09:37:48来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  在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" />

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:ASP.NET实现下拉框二级联动组件

下一篇:ASP.NET服务器控件PleaseWaitButton[翻译]