كيفية تجنب معالجة محتويات = "lax" في WCF WSDL من الفئات التي تطبق IXmlSerializable؟

StackOverflow https://stackoverflow.com/questions/1619448

  •  06-07-2019
  •  | 
  •  

سؤال

لدي خدمة wcf مكتوبة بطريقة العقد أولاً.نظرًا لأن بعض العناصر الموجودة في المخطط تستخدم سمات، فقد اضطررت إلى إنشاء تسلسل مخصص لهذا (باستخدام IXmlSerializable).يوجد أدناه مقتطف من المخطط والفئات بالإضافة إلى المخطط من مخرجات wsdl.

مشكلتي هي أنه على الرغم من أنني أقوم بتقديم xsd لفئاتي IXmlSerializable، إلا أن المخطط غير مضمن في wsdl.تمت الإشارة إليهم فقط مع processContents="lax".يبدو أن هذا يمثل مشكلة بالنسبة لعملاء خدماتي، حيث لا يمكنهم استخدام المعالجات الخاصة بهم لإنشاء عملاء.

هل واجه أحد هذه المشكلة؟هل هناك أي طريقة للتحكم في إخراج wsdl لتجنب ذلك.أواجه نفس السلوك باستخدام كل من عقود الرسائل وعقود البيانات.

مخطط التجميع والصنف:

<xs:element name="TelephoneList">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Telephone" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Telephone">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="Type">
                        <xs:simpleType>
                            <xs:restriction base="xs:NMTOKEN">
                                <xs:enumeration value="Preferred"/>
                                <xs:enumeration value="Office"/>
                                <xs:enumeration value="Mobile"/>
                                <xs:enumeration value="Home"/>
                                <xs:enumeration value="MobilePhoneFromExternalPartner"/>
                                <xs:enumeration value="HomePhoneFromExternalPartner"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:attribute>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
      </xs:element>

فئة الجمع:

[CollectionDataContract(ItemName = "Telephone", Name = "TelephoneList", Namespace = Schema.WorkOrderNamespace)]
public class TelephoneSet : SetBase<Telephone>
{    }

فئة السلعة:

    [XmlSchemaProvider("GetSchemaFile")]
    public class Telephone : CustomSerializedEntity //The base class implements IXmlSerializable
    {
        public virtual TelephoneType? Type { get; set; }
        public virtual string Number { get; set; }

        /// <remarks>This method is referenced in the <seealso cref="XmlSchemaProviderAttribute"/> decoration.</remarks>
        public static XmlSchemaComplexType GetSchemaFile(XmlSchemaSet xs)
        {
            return CreateSchema(xs, "Telephone");
        }

        public override void ReadXml(XmlReader reader)
        {
            Type = ReadEnumAttribute<TelephoneType?>(reader, "Type");
            reader.MoveToElement();
            Number = reader.Value;
        }

        public override void WriteXml(XmlWriter writer)
        {
            WriteAttribute(writer, "Type", Type);
            if (!string.IsNullOrEmpty(Number))
            {
                writer.WriteValue(Number);
            }
        }
    }

xsd المقدمة من الخدمة:

<xs:complexType name="TelephoneList">
      <xs:sequence>
         <xs:element minOccurs="0" maxOccurs="unbounded" name="Telephone" nillable="true">
            <xs:complexType>
               <xs:sequence>
                  <xs:any minOccurs="0" processContents="lax"/>
               </xs:sequence>
            </xs:complexType>
         </xs:element>
      </xs:sequence>
   </xs:complexType>
   <xs:element name="TelephoneList" nillable="true" type="tns:TelephoneList"/>
هل كانت مفيدة؟

المحلول

أنت تقوم بإرجاع XmlSchemaComplexType من أسلوب GetSchemaFile الخاص بك، ولكن عقد الأسلوب الخاص بـ XmlSchemaProviderAttribute ينص على أنه يجب عليك إرجاع XmlQualifiedName.من قسم الملاحظات في وثائق MSDN لـ XmlSchemaProviderAttribute:

تقوم الخاصية MethodName بإرجاع اسم الطريقة الثابتة من خلال الانعكاس.يجب أن تأخذ الطريقة، التي يجب تنفيذها، معلمة واحدة، وهي كائن XmlSchemaSet، الذي يملأه الأسلوب بكائن XmlSchema.يجب أن يقوم الأسلوب أيضًا بإرجاع كائن XmlQualifiedName الذي يعرّف نوع البيانات.

السبب في ذلك بسيط:تخيل أن لديك عدة أنواع في مخططك، فكيف يمكن معرفة أي نوع يمثله الفصل الذي يعكسه؟لذلك، من خلال إرجاع XmlQualifiedName، فإنك في الواقع تقول أن هذه الفئة تتوافق مع هذا النوع في هذا المخطط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top