4

Java에서 구현 된 것으로 보이는 외부 공급 업체의 웹 서비스 (Apache Axis가 있다고 생각합니다)로 작업 중이며 WCF 클라이언트에서 사용하고 있습니다. 연산 중 일부는 열거 형의 입력 매개 변수를 필요로합니다. 문제는 특정 경우에만 enum이 전달되기를 원합니다. 요소는 WSDL에서 nillable로 표시되지 않습니다. 그러나 열거 형이므로 내 WCF 클라이언트는 지정되지 않은 경우에도 항상 기본값을 전달합니다. 이 동작으로 인해 서비스에 내부 오류가 발생했습니다.WCF 클라이언트의 선택적 열거 형

이 문제를 해결하는 방법에 대한 의견이 있으십니까? 프록시를 수동으로 수정하지 않아도되는 솔루션이 바람직합니다. 다른 개발자가 향후 독립적으로 생성해야하는 경우 혼동을 일으킬 수 있습니다.

특정 요소는

<xs:complexType name="complexTypeName"> 
<xs:sequence> 
    <!-- More Stuff Here--> 
    <xs:element minOccurs="0" name="parameterName" type="tns:parameterName" /> 
    <!-- More Stuff Here--> 
</xs:sequence> 
</xs:complexType> 

<!-- . . . --> 

<xs:simpleType name="parameterName"> 
    <xs:restriction base="xs:string"> 
    <xs:enumeration value="ONLY_AVAILABLE_VALUE" /> 
    </xs:restriction> 
</xs:simpleType> 

는 svcutil이 변환하는 WSDL 다음과 같이 지정

[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.0.30319.1")] 
[System.SerializableAttribute()] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://vendorwebservicenamespace.com/")] 
public enum parameterName 
{ 
    /// <remarks/> 
    ONLY_AVAILABLE_VALUE, 
} 

EDIT : 좀 더 연구 한 결과, 같은는 svcutil 해야 정상적으로 보이는 추가 매개 변수를 사용하여 선택적 매개 변수 (minOccurs = 0)를 생성하십시오. boolfieldNameSpecified par 필드를 직렬화해야하는지 여부를 호출자가 알 수 있도록합니다 (자세한 내용은 here, herehere). 내가 수동으로 적절한 방법을 fieldNameSpecified 추가하려고하면

[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://vendorservicenamespace.com/", Order=23)] 
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
public Namespace.parameterName parameterName; 

, 어떤 (직렬화에 영향을 미치는 것 같다하지 않습니다 다음과 같이이 경우

그러나, 매개 변수 참조 즉, 매개 변수는 여전히 비누 메시지에 표시됩니다. 이 시점에서

, 나는

  1. 매개 변수를 fieldNameSpecified 포함는 svcutil되지 않습니다 궁금?
  2. 매개 변수를 수동으로 추가하지 않는 이유는 무엇입니까?
  3. 다른 문제 해결 방법이 있습니까?

편집 : 아직 더 많은 연구 후에, 나는이 문제의 부분은 WSDL이 기록되는 방식입니다 것으로 확인되었습니다. 공급 업체의 WSDL이 DataContractSerializer의 Schema Reference을 따르지 않습니다. 이 때문에 svcutil은 XmlSerializer로 다시 실패합니다.

문제는 여전히 데이터 계약이 아니라 메소드에 대한 메시지 계약을 생성하고 있다는 것입니다. 이것은 메시지에서 제외 할 수 없다는 점에서 기본적으로 nullable이 아닌 유형의 경우 문제가되는 것으로 보입니다 (누구든지이를 확인할 수 있습니까?). 어떤 이유 XmlSerializer를위한 parameterNameSpecified 방법은 매개 변수가 MessageBodyMemberAttribute (확실하지 않은 이유는 무엇입니까?)

나는이 문제를 해결 얻을 수 있었던 유일한 방법은 /wrapped 옵션을 사용하는 것입니다으로 플래그 때 무시 나타납니다 svcutil.결과적으로 메시지 계약은 실제 seralized 매개 변수 자체와 분리됩니다. 이 경우, 매개 변수 이름 지정 메서드를 생성하고 XmlSerializer가이를 준수합니다.

+0

속성은 어떤 모양입니까? 그것은'parameterName' 또는'Nullable '타입입니까? –

+0

parameterName으로 생성됩니다. WSDL은 명시 적으로 매개 변수를 "nullable"(nillable = true)로 지정하지 않으므로 "optional"을 사용하는 것이 더 나은 용어 였을 것입니다. –

+0

솔루션을 찾은 경우이를 답으로 추가하고 대답을 수락하십시오. –

답변

3

문제를 조사한 후 svcutil에서/wrapped 옵션을 사용하여 프록시를 생성하는 것이 유일한 해결책입니다. 위의 질문에서 언급했듯이 이것은 추상화 계층을 추가하고 메시지 계약이 매개 변수 위에있는 레이어를 허용합니다. 이 경우 XmlSerializer는 fieldNameSpecified 속성을 생성하고이를 준수합니다.