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)를 생성하십시오. bool
fieldNameSpecified par 필드를 직렬화해야하는지 여부를 호출자가 알 수 있도록합니다 (자세한 내용은 here, here 및 here). 내가 수동으로 적절한 이 방법을 fieldNameSpecified 추가하려고하면
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://vendorservicenamespace.com/", Order=23)]
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public Namespace.parameterName parameterName;
, 어떤 (직렬화에 영향을 미치는 것 같다하지 않습니다 다음과 같이이 경우
그러나, 매개 변수 참조 즉, 매개 변수는 여전히 비누 메시지에 표시됩니다. 이 시점에서 , 나는- 왜 이 매개 변수를 fieldNameSpecified 포함는 svcutil되지 않습니다 궁금?
- 매개 변수를 수동으로 추가하지 않는 이유는 무엇입니까?
- 다른 문제 해결 방법이 있습니까?
편집 : 아직 더 많은 연구 후에, 나는이 문제의 부분은 WSDL이 기록되는 방식입니다 것으로 확인되었습니다. 공급 업체의 WSDL이 DataContractSerializer의 Schema Reference을 따르지 않습니다. 이 때문에 svcutil은 XmlSerializer로 다시 실패합니다.
문제는 여전히 데이터 계약이 아니라 메소드에 대한 메시지 계약을 생성하고 있다는 것입니다. 이것은 메시지에서 제외 할 수 없다는 점에서 기본적으로 nullable이 아닌 유형의 경우 문제가되는 것으로 보입니다 (누구든지이를 확인할 수 있습니까?). 어떤 이유 XmlSerializer를위한 parameterNameSpecified 방법은 매개 변수가 MessageBodyMemberAttribute
(확실하지 않은 이유는 무엇입니까?)
나는이 문제를 해결 얻을 수 있었던 유일한 방법은 /wrapped
옵션을 사용하는 것입니다으로 플래그 때 무시 나타납니다 svcutil.결과적으로 메시지 계약은 실제 seralized 매개 변수 자체와 분리됩니다. 이 경우, 은이 매개 변수 이름 지정 메서드를 생성하고 XmlSerializer가이를 준수합니다.
속성은 어떤 모양입니까? 그것은'parameterName' 또는'Nullable'타입입니까? –
parameterName으로 생성됩니다. WSDL은 명시 적으로 매개 변수를 "nullable"(nillable = true)로 지정하지 않으므로 "optional"을 사용하는 것이 더 나은 용어 였을 것입니다. –
솔루션을 찾은 경우이를 답으로 추가하고 대답을 수락하십시오. –