قبل إصدار الإصدار 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؛
باستخدام
مساحة الاسم Xrinehart.Tools.WebService.SchemaImporter
{
فئة DataTableSchemaImporterExtension: SchemaImporterExtension
{
// يتم استخدام DataTableSchemaImporterExtension لخدمات الويب، ويتم استخدامه للتعرف على مخطط DataTable داخل wsdl
Hashtable importTypes = new Hashtable();
سلسلة التجاوز العامة ImportSchemaType (اسم السلسلة، سلسلة schemaNamespace، سياق XmlSchemaObject، مخططات XmlSchemas، مستورد XmlSchemaImporter، CodeCompileUnit، compileUnit، CodeNamespace mainNamespace، خيارات CodeGenerationOptions، CodeDomProvider codeProvider)
{
قيم IList = schemas.GetSchemas(schemaNamespace)
;
{
return null
}
XmlSchema schema = value[0] as XmlSchema;
if
(schema == null)
return
null
;
سلسلة التجاوز العامة ImportSchemaType (نوع XmlSchemaType، سياق XmlSchemaObject، مخططات XmlSchemas، مستورد XmlSchemaImporter، CodeCompileUnit، compileUnit، CodeNamespace mainNamespace، خيارات CodeGenerationOptions، CodeDomProvider codeProvider)
{
إذا (اكتب == فارغًا)
{
إرجاع فارغ
}
إذا (importedTypes[type] != null)
{
mainNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataSet).Namespace));
CompilUnit.ReferencedAssemblies.Add("System.Data.dll");
return (string)importedTypes[type]
}
if (!(context is XmlSchemaElement))
return null;
إذا (النوع هو XmlSchemaComplexType)
{
XmlSchemaComplexType ct = (XmlSchemaComplexType)type
إذا (ct.Particle هو XmlSchemaSequence)
{
{
XmlSchemaAny Any0 = (XmlSchemaAny)items[0];
XmlSchemaAny Any1 = (XmlSchemaAny)items[1]
;
{
string typeName = typeof(DataTable).FullName;
importTypes.Add(type, typeName);
mainNamespace.Imports.Add(new CodeNamespaceImport(typeof(DataTable).Namespace));
compileUnit.ReferencedAssemblies.Add("System.Data.dll ");
اسم نوع الإرجاع؛
}
}
}
}
إرجاع فارغ؛
}
}
}
أضف هذه الفئة إلى مشروع، وقم بتجميع المشروع بعد تسميته بقوة.
ثم قم بإضافة تجميع التجميع إلى GAC.
أخيرًا، قم بتعديل ملف Machine.config المحلي، ليصبح الكود كما يلي:
<sectionGroup name="system.xml.serialization" type="System.Xml.Serialization.Configuration.SerializationSectionGroup, System.Xml, الإصدار=2.0.0.0, الثقافة=محايدة, PublicKeyToken=b77a5c561934e089">
<section name="schemaImporterExtensions" type="System.Xml.Serialization.Configuration.SchemaImporterExtensionsSection, System.Xml, Version=2.0.0.0, Culture=محايد, PublicKeyToken=b77a5c561934e089" />
<section name="dateTimeSerialization" type="System.Xml.Serialization.Configuration.DateTimeSerializationSection, System.Xml, الإصدار=2.0.0.0, Culture=محايد, PublicKeyToken=b77a5c561934e089" />
<section name="xmlSerializer" type="System.Xml.Serialization.Configuration.XmlSerializerSection, System.Xml, الإصدار=2.0.0.0, Culture=محايد, 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=محايد,PublicKeyToken=5a627ce15fb94702" / >
</schemaImporterExtensions>
</system.xml.serialization>
بعد إكمال الخطوات المذكورة أعلاه، قم بتجميع WebService وإعادة المرجع (أو تحديث مرجع الويب)، يمكنك تحديد نوع DataTable بشكل صحيح.
في الواقع، يقوم DataTable بتنفيذ التسلسل فقط، لكن WebService لا يمكنه إلغاء تسلسله إلى تنسيق يمكن التعرف عليه بنفسه، لذلك يجب إضافته يدويًا. من هذا، يمكن أيضًا اشتقاق كائنات فئة BusinessEntity مباشرة من خلال الطرق المذكورة أعلاه.
نأمل أن يساعد الجميع.
http://www.cnblogs.com/Xrinehart/archive/2006/08/20/481956.html