IXMLSerializable을 구현하는 클래스에서 WCF WSDL에서 ProcessContents = "LAX"를 피하는 방법은 무엇입니까?

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

  •  06-07-2019
  •  | 
  •  

문제

계약 우선 방식으로 작성된 WCF 서비스가 있습니다. 스키마의 일부 요소는 속성을 사용하므로이를 위해 사용자 정의 직렬화를 만들어야했습니다 (사용 IXmlSerializable). 아래는 스키마의 스 니펫과 클래스와 WSDL 출력의 스키마입니다.

내 문제는 IXMLSerializable 클래스의 XSD를 렌더링하더라도 스키마가 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"/>
도움이 되었습니까?

해결책

GetSchemafile 메소드에서 XmlSchemacomplexType를 반환하고 있지만 XMLSCHEMAPROVIDERATTRIBUTE 방법의 계약은 XMLQUILIFIEDNAME을 반환해야한다고 지시합니다. MSDN 문서의 비고 섹션에서 xmlschemaproviderattribute:

MethodName 속성은 반사를 통해 정적 메소드의 이름을 반환합니다. 구현 해야하는이 메소드는 단일 매개 변수, XMLSChemaset 객체 인 XMLSCHEMA 객체로 채워진 단일 매개 변수를 가져와야합니다. 이 메소드는 또한 데이터 유형을 식별하는 xmlqualifiedName 객체를 반환해야합니다.

그 이유는 간단합니다. 스키마 내에 몇 가지 유형이 있다고 상상해보십시오. 반영하는 클래스가 어떤 클래스를 나타내는 지 어떻게 알 수 있습니까? 따라서 XMLQUILIFIEDNAME을 반환하면 실제로이 클래스 가이 스키마 에서이 유형에 맵핑을한다고 말합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top