若天明 发表于 2015-1-16 22:45:25

ASP.NET教程之ASP.NET 2.0 WebService中传送DataTabl...

前几天同学问我学习方向的问题。有点想法,不知道对不对,怕误导同学,现在“开源一下”。注:括号内是我现在整理的时填加上的。asp.net|web|参考  在2.0正式版公布之前,就满天的看到关于DataTable撑持序列化的新特征宣扬,满觉得今后今后利用DataTable就和DataSet一样便利了,了局在使用项目标时分才发明并不是那末回事。
  DataTable是撑持序列化了,可是微软并没有把他做的出格便利,还必要我们本人来做一些事情以后才干够在WebService内里传送DataTable,不然在援用DataTable的时分会发明DataTable酿成了一个甚么Proxy范例。
  起首编写类DataTableSchemaImporterExtension,代码以下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Xml.Serialization.Advanced;
usingSystem.Collections;
usingSystem.Xml.Schema;
usingSystem.Xml.Serialization;
usingSystem.CodeDom;
usingSystem.CodeDom.Compiler;
usingSystem.Xml;
usingSystem.Data;
namespaceXrinehart.Tools.WebService.SchemaImporter
{
classDataTableSchemaImporterExtension:SchemaImporterExtension
{
//DataTableSchemaImporterExtensionisusedforWebServices,itisusedtorecognizetheschemaforDataTablewithinwsdl
HashtableimportedTypes=newHashtable();
publicoverridestringImportSchemaType(stringname,stringschemaNamespace,XmlSchemaObjectcontext,XmlSchemasschemas,XmlSchemaImporterimporter,CodeCompileUnitcompileUnit,CodeNamespacemainNamespace,CodeGenerationOptionsoptions,CodeDomProvidercodeProvider)
{
IListvalues=schemas.GetSchemas(schemaNamespace);
if(values.Count!=1)
{
returnnull;
}
XmlSchemaschema=valuesasXmlSchema;
if(schema==null)
returnnull;
XmlSchemaTypetype=(XmlSchemaType)schema.SchemaTypes;
returnImportSchemaType(type,context,schemas,importer,compileUnit,mainNamespace,options,codeProvider);
}
publicoverridestringImportSchemaType(XmlSchemaTypetype,XmlSchemaObjectcontext,XmlSchemasschemas,XmlSchemaImporterimporter,CodeCompileUnitcompileUnit,CodeNamespacemainNamespace,CodeGenerationOptionsoptions,CodeDomProvidercodeProvider)
{
if(type==null)
{
returnnull;
}
if(importedTypes!=null)
{
mainNamespace.Imports.Add(newCodeNamespaceImport(typeof(DataSet).Namespace));
compileUnit.ReferencedAssemblies.Add("System.Data.dll");
return(string)importedTypes;
}
if(!(contextisXmlSchemaElement))
returnnull;
if(typeisXmlSchemaComplexType)
{
XmlSchemaComplexTypect=(XmlSchemaComplexType)type;
if(ct.ParticleisXmlSchemaSequence)
{
XmlSchemaObjectCollectionitems=((XmlSchemaSequence)ct.Particle).Items;
if(items.Count==2&&itemsisXmlSchemaAny&&itemsisXmlSchemaAny)
{
XmlSchemaAnyany0=(XmlSchemaAny)items;
XmlSchemaAnyany1=(XmlSchemaAny)items;
if(any0.Namespace==XmlSchema.Namespace&&any1.Namespace=="urn:schemas-microsoft-com:xml-diffgram-v1")
{
stringtypeName=typeof(DataTable).FullName;
importedTypes.Add(type,typeName);
mainNamespace.Imports.Add(newCodeNamespaceImport(typeof(DataTable).Namespace));
compileUnit.ReferencedAssemblies.Add("System.Data.dll");
returntypeName;
}
}
}
}
returnnull;
}
}

}
  为此类增加进一个项目中,并将此项目举行强定名后编译。
  然后,把该Assembly程序集到场到GAC中。
  最初修正本机的machine.config,代码以下:
<sectionGroupname="system.xml.serialization"type="System.Xml.Serialization.Configuration.SerializationSectionGroup,System.Xml,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089">
<sectionname="schemaImporterExtensions"type="System.Xml.Serialization.Configuration.SchemaImporterExtensionsSection,System.Xml,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"/>
<sectionname="dateTimeSerialization"type="System.Xml.Serialization.Configuration.DateTimeSerializationSection,System.Xml,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"/>
<sectionname="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>
<addname="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类工具也能够经由过程以上体例完成间接传送。
  但愿对人人有所匡助。
我认为,可以通过更加简单的首次编译,而增加第二次编译的负担,来提高java的运行效率。只是将java源代码进行简单的等价转换,而不假设编译成某种虚拟机器的目标格式,而由本地编译器针对性的二次编译。

山那边是海 发表于 2015-1-17 20:30:27

弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。

蒙在股里 发表于 2015-1-21 07:45:33

通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。

只想知道 发表于 2015-1-30 11:43:24

我的意思是.net好用,从功能上来说比JAVA强还是很明显的。

精灵巫婆 发表于 2015-2-6 11:01:25

比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。

不帅 发表于 2015-2-16 00:36:55

众所周知,Windows以易用而出名,也因此占据不少的服务器市场。

第二个灵魂 发表于 2015-3-11 20:48:51

由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。

灵魂腐蚀 发表于 2015-3-19 12:37:22

asp.net空间的支持有:ASP.NET1.1/虚拟目录/MicrosoftFrontPage2000扩展/CDONTS,同时他的网站上也提供了Asp.net的使用详解和程序源代码,相信对使用ASP.NET编程的程序员来说会非常有用哦!

若天明 发表于 2015-3-28 01:46:00

由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。
页: [1]
查看完整版本: ASP.NET教程之ASP.NET 2.0 WebService中传送DataTabl...