ก่อนที่จะเปิดตัวเวอร์ชัน 2.0 อย่างเป็นทางการ ฉันเห็นการประชาสัมพันธ์ทั้งหมดเกี่ยวกับคุณสมบัติใหม่ของ DataTable ที่รองรับการทำให้เป็นอนุกรม ฉันคิดว่าการใช้ DataTable จะสะดวกพอๆ กับ DataSet นับจากนี้ไป อย่างไรก็ตาม ฉันพบว่านี่ไม่ใช่กรณีนี้เมื่อฉัน ประยุกต์ใช้โครงการ
DataTable รองรับการทำให้เป็นอนุกรม แต่ Microsoft ไม่ได้ทำให้สะดวกเป็นพิเศษ เรายังต้องทำงานบางอย่างด้วยตัวเองก่อนจึงจะสามารถส่ง DataTable ใน WebService ได้ มิฉะนั้น เมื่อเราอ้างอิง DataTable เราจะพบว่า DataTable กลายเป็นพร็อกซี พิมพ์.
ขั้นแรกให้เขียนคลาส DataTableSchemaImporterExtension รหัสจะเป็นดังนี้:
ใช้ระบบ;
ใช้ System.Collections.Generic;
ใช้ System.Text;
โดยใช้ System.Xml.Serialization.Advanced;
ใช้ System.Collections;
ใช้ System.Xml.Schema;
ใช้ System.Xml.Serialization;
โดยใช้ System.CodeDom;
โดยใช้ System.CodeDom.Compiler;
ใช้ System.Xml;
ใช้ System.Data;
เนมสเปซ Xrinehart.Tools.WebService.SchemaImporter
-
คลาส DataTableSchemaImporterExtension : SchemaImporterExtension
{
// DataTableSchemaImporterExtension ใช้สำหรับ WebServices ใช้เพื่อจดจำสคีมาสำหรับ DataTable ภายใน wsdl
Hashtable importTypes = new Hashtable();
สตริงการแทนที่สาธารณะ ImportSchemaType (ชื่อสตริง, สตริง schemaNamespace, บริบท XmlSchemaObject, สกีมา XmlSchemas, ผู้นำเข้า XmlSchemaImporter, CodeCompileUnit CompileUnit, CodeNamespace mainNamespace, ตัวเลือก CodeGenerationOptions, CodeDomProvider codeProvider)
{
ค่า IList = schema.GetSchemas(schemaNamespace);
ถ้า (values.Count != 1)
{
return null;
}
XmlSchema schema = ค่า [0] เป็น XmlSchema;
if (schema == null)
ส่งคืน
null
;
, schema, ผู้นำเข้า, CompileUnit, mainNamespace, ตัวเลือก, codeProvider);
สตริงการแทนที่สาธารณะ ImportSchemaType (ชนิด XmlSchemaType, บริบท XmlSchemaObject, สกีมา XmlSchemas, ผู้นำเข้า XmlSchemaImporter, CodeCompileUnit CompileUnit, CodeNamespace mainNamespace, ตัวเลือก CodeGenerationOptions, CodeDomProvider codeProvider)
{
ถ้า (ประเภท == null)
{
กลับ null;
}
ถ้า (importedTypes[type] != null)
{
mainNamespace.Imports.Add
(ใหม่ CodeNamespaceImport(typeof(DataSet
)
.Namespace))
;
XmlSchemaElement))
ส่งกลับค่าว่าง;
ถ้า (ประเภทคือ XmlSchemaComplexType)
{
XmlSchemaComplexType ct = (XmlSchemaComplexType) พิมพ์;
ถ้า (ct.Particle คือ XmlSchemaSequence)
{
{
XmlSchemaAny any0 = (XmlSchemaAny)items[0];
XmlSchemaAny any1 = (XmlSchemaAny)items[1];
ถ้า (any0.Namespace == diffgram-v1")
{
string typeName = typeof(DataTable).FullName;
importTypes.Add
(type, typeName);
mainNamespace.Imports.Add(ใหม่ CodeNamespaceImport(typeof(DataTable).Namespace));
");
ส่งคืน typeName;
}
}
}
}
ส่งคืน null;
}
}
-
เพิ่มคลาสนี้ให้กับโปรเจ็กต์ และคอมไพล์โปรเจ็กต์หลังจากตั้งชื่ออย่างแน่นหนา
จากนั้นเพิ่มชุดประกอบเข้ากับ GAC
ในที่สุดก็แก้ไข local machine.config รหัสจะเป็นดังนี้:
<sectionGroup name="system.xml.serialization" type="System.Xml.Serialization.Configuration.SerializationSectionGroup, System.Xml, Version=2.0.0.0, วัฒนธรรม=เป็นกลาง, PublicKeyToken=b77a5c561934e089">
<ชื่อส่วน = "schemaImporterExtensions" type = "System.Xml.Serialization.Configuration.SchemaImporterExtensionsSection, System.Xml, เวอร์ชัน = 2.0.0.0, วัฒนธรรม =เป็นกลาง, PublicKeyToken = b77a5c561934e089" />
<ชื่อส่วน = "dateTimeSerialization" type = "System.Xml.Serialization.Configuration.DateTimeSerializationSection, System.Xml, เวอร์ชัน = 2.0.0.0, วัฒนธรรม =เป็นกลาง, PublicKeyToken = b77a5c561934e089" />
<ชื่อส่วน = "xmlSerializer" type = "System.Xml.Serialization.Configuration.XmlSerializerSection, System.Xml, Version = 2.0.0.0, วัฒนธรรม =เป็นกลาง, PublicKeyToken = b77a5c561934e089" needPermission = "false" />
</ส่วนกลุ่ม>
<system.xml.serialization>
<schemaImporterExtensions>
<เพิ่มชื่อ = "dataTableSchemaImporterExtension" type = "Xrinehart.Tools.WebService.SchemaImporter.DataTableSchemaImporterExtension, Xrinehart.Tools.WebService.SchemaImporter,Version=1.0.0.0,วัฒนธรรม=เป็นกลาง,PublicKeyToken=5a627ce15fb94702" />
</schemaImporterExtensions>
</system.xml.serialization>
หลังจากทำตามขั้นตอนข้างต้นแล้ว ให้คอมไพล์ WebService และการอ้างอิงใหม่ (หรืออัปเดตการอ้างอิงเว็บ) คุณจะสามารถระบุประเภท DataTable ได้อย่างถูกต้อง
ในความเป็นจริง DataTable ใช้งานการทำให้เป็นอนุกรมเท่านั้น แต่ WebService ไม่สามารถทำการดีซีเรียลไลซ์ให้เป็นรูปแบบที่รู้จักได้ด้วยตัวเอง ดังนั้นจึงจำเป็นต้องเพิ่มด้วยตนเอง จากนี้ สามารถรับเอนทิตีธุรกิจต่างๆ ได้ ออบเจ็กต์คลาส BusinessEntity สามารถถ่ายโอนได้โดยตรงผ่านวิธีการข้างต้น
หวังว่ามันจะช่วยทุกคนได้
http://www.cnblogs.com/Xrinehart/archive/2006/08/20/481956.html