나는 웹 서비스에 대한 클라이언트를 만들고있다. 다음은 스키마의 간단한 샘플입니다.svcutil을 사용하여 제한을 사용하여 요소를 숨기는 웹 서비스에서 C# WCF 프록시를 생성 하시겠습니까?
<xs:complexType name="A">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="element1" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="element2" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="B">
<xs:complexContent>
<xs:restriction base="A">
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="1" name="element2" type="xs:string" />
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
요약하면 모든 요소가 포함 된 객체 A가 있습니다. 이 서비스에는 A에 기반을 둔 몇 가지 유형이 있지만 상속 된 유형은 일반적으로 기본 유형보다 작습니다. 여기에는 유형 B가 있습니다.
Visual Studio 2010, SoapUI 등의 스키마 뷰어에서 이것은 예상대로 보인다. A는 2 개의 요소와 B 만 1 (= 요소 2)을가집니다. 나는이 & B 모두 내 유형의 요소의 전체 세트를 얻을, 또는 옵션으로 연주 할 때 나는 다음과 같은 오류 메시지 수는 svcutil 사용하여
:
Error: Type 'B' in namespace 'http://tempuri.org/XMLSchema.xsd' cannot be imported. Complex types derived by restriction not supported. Either change the schema so that the types can map to data contract types or use ImportXmlType or use a different serializer.
이 필드를 숨기기은/상속 유형의 속성입니다 연습/도로가 아니라 여행을 좋아하지만 공급자에게 WSDL을 변경시키지 못하면 그렇게 할 수밖에없는 것 같습니다.
제대로 처리 할 수있는 svcutil 대신 사용할 수있는 프록시가 있습니까? 아니면 프록시를 직접 코딩해야합니까?
업데이트 1
로 내가는 svcutil에서 제안의 결과를 표시하지 않은 존 손더스에 의해 지적했다. 즉 짧은 포스트를 유지하기 위해 부분적으로했다 ...하지만 여기 간다 :
schema.xsd가/datacontractonly에서 결과 importXmlTypes /는 svcutil:하는 XML 수준에서 작업
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="A", Namespace="http://tempuri.org/XMLSchema.xsd")]
public partial class A : object, System.Runtime.Serialization.IExtensibleDataObject
{
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
private string element1Field;
private string element2Field;
public System.Runtime.Serialization.ExtensionDataObject ExtensionData
{
get
{
return this.extensionDataField;
}
set
{
this.extensionDataField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false)]
public string element1
{
get
{
return this.element1Field;
}
set
{
this.element1Field = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false)]
public string element2
{
get
{
return this.element2Field;
}
set
{
this.element2Field = value;
}
}
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Xml.Serialization.XmlSchemaProviderAttribute("ExportSchema")]
[System.Xml.Serialization.XmlRootAttribute(IsNullable=false)]
public partial class B : object, System.Xml.Serialization.IXmlSerializable
{
private System.Xml.XmlNode[] nodesField;
private static System.Xml.XmlQualifiedName typeName = new System.Xml.XmlQualifiedName("B", "http://tempuri.org/XMLSchema.xsd");
public System.Xml.XmlNode[] Nodes
{
get
{
return this.nodesField;
}
set
{
this.nodesField = value;
}
}
public void ReadXml(System.Xml.XmlReader reader)
{
this.nodesField = System.Runtime.Serialization.XmlSerializableServices.ReadNodes(reader);
}
public void WriteXml(System.Xml.XmlWriter writer)
{
System.Runtime.Serialization.XmlSerializableServices.WriteNodes(writer, this.Nodes);
}
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public static System.Xml.XmlQualifiedName ExportSchema(System.Xml.Schema.XmlSchemaSet schemas)
{
System.Runtime.Serialization.XmlSerializableServices.AddDefaultSchema(schemas, typeName);
return typeName;
}
}
바람직하지 않고 것 래퍼를 쓰도록 강요하십시오. getgo에서 프록시를 handcode하기가 더 쉽습니다.
svcutil schema.xsd/serializer : XmlSerializer/datacontractonly 아래와 같은 오류가 표시되며 대체 도구를 요청하는 이유입니다. 오류 메시지가 /importXmlTypes
스위치를 사용하거나, 변경을 말하고있다
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/XMLSchema.xsd")]
[System.Xml.Serialization.XmlRootAttribute("request", Namespace="http://tempuri.org/XMLSchema.xsd", IsNullable=false)]
public partial class B : A {
}
/// <remarks/>
[System.Xml.Serialization.XmlIncludeAttribute(typeof(B))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/XMLSchema.xsd")]
public partial class A {
private string element1Field;
private string element2Field;
/// <remarks/>
public string element1 {
get {
return this.element1Field;
}
set {
this.element1Field = value;
}
}
/// <remarks/>
public string element2 {
get {
return this.element2Field;
}
set {
this.element2Field = value;
}
}
}
당신이 오류 메시지의 어느 부분을 이해하지 못했다? 그것은 문제를 해결하는 방법을 정확히 알려주었습니다. –
아니요. 원하는 결과를 얻지 못합니다. (예를 들어, 나는 단지 샘플 일뿐입니다. 내가 아는 가난한 사람입니다 ...). 이러한 옵션을 사용하여 시도한 경우 관련 속성이있는 프록시가 생성되지 않습니다.결과적으로 필자는 요소 목록과 serializtion을 직접 처리해야하는 번거 로움을 겪게됩니다. –
나는 이러한 옵션을 사용하는 데 관심이 없습니다. _ 너는 그들을 시험해 보았고, 결과를 안다. ** 시도해 봤던 ** 표시 ** 결과 ** 표시 **. –