我正在使用WCF .Net 4.0調用用Java編寫的Web服務。部分WSDL引用了SPML 2.0,我附加了一些代碼來描述發生的事情。WCF 4.0無法從Java Web Service反序列化SOAP
的WSDL引用一些XSD,我使用的作品是
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:spml="urn:oasis:names:tc:SPML:2:0" xmlns:sec="urn:corp:iam:spml2:security" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:corp:iam:spml2:security" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import schemaLocation="../oasis-spml-xsds/pstc_spmlv2_core.xsd" namespace="urn:oasis:names:tc:SPML:2:0" />
<xsd:complexType name="SuggestUserIDResponseType">
<xsd:complexContent mixed="false">
<xsd:extension base="spml:ResponseType">
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="5" name="uid" type="xsd:string" />
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
而且
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:spml="urn:oasis:names:tc:SPML:2:0" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:oasis:names:tc:SPML:2:0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="ExtensibleType">
<xsd:sequence>
<xsd:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
</xsd:sequence>
<xsd:anyAttribute namespace="##other" processContents="lax" />
</xsd:complexType>
<xsd:complexType name="ResponseType">
<xsd:complexContent mixed="false">
<xsd:extension base="spml:ExtensibleType">
<xsd:sequence>
<xsd:element minOccurs="0" maxOccurs="unbounded" name="errorMessage" type="xsd:string" />
</xsd:sequence>
<xsd:attribute name="status" type="spml:StatusCodeType" use="required" />
<xsd:attribute name="requestID" type="xsd:ID" use="optional" />
<xsd:attribute name="error" type="spml:ErrorCode" use="optional" />
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
所以WCF服務引用生成的代理類是
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SchemaType1))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ObjectClassDefinitionType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ObjectClassDefinitionReferencesType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ObjectClassDefinitionReferenceType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(AttributeDefinitionReferencesType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(AttributeDefinitionReferenceType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(AttributeDefinitionType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(CapabilityType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(CapabilitiesListType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SchemaEntityRefType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SchemaType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(TargetType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(PSOType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ActiveResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SearchResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ValidatePasswordResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ResetPasswordResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(BatchResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ListTargetsResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(LookupResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ModifyResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(AddResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(AuthenticateUserResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SuggestUserIDResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ResultsIteratorType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SearchQueryType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(NamespacePrefixMappingType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(QueryClauseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(IsActiveType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(LogicalOperatorType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SelectionType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ModificationType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(IdentifierType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(PSOIdentifierType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(RequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ActiveRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ResumeRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SuspendRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(CloseIteratorRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(IterateRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SearchRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ValidatePasswordRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ResetPasswordRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ExpirePasswordRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SetPasswordRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(BatchRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ListTargetsRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(LookupRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(DeleteRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ModifyRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(AddRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(AuthenticateUserRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SuggestUserIDRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(VerifySecurityAnswerRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(CapabilityDataType))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.225")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:oasis:names:tc:SPML:2:0")]
public partial class ExtensibleType : object, System.ComponentModel.INotifyPropertyChanged {
private System.Xml.XmlElement[] anyField;
private System.Xml.XmlAttribute[] anyAttrField;
/// <remarks/>
[System.Xml.Serialization.XmlAnyElementAttribute(Order=0)]
public System.Xml.XmlElement[] Any {
get {
return this.anyField;
}
set {
this.anyField = value;
this.RaisePropertyChanged("Any");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAnyAttributeAttribute()]
public System.Xml.XmlAttribute[] AnyAttr {
get {
return this.anyAttrField;
}
set {
this.anyAttrField = value;
this.RaisePropertyChanged("AnyAttr");
}
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName) {
System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
if ((propertyChanged != null)) {
propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
}
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ActiveResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SearchResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ValidatePasswordResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ResetPasswordResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(BatchResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ListTargetsResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(LookupResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ModifyResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(AddResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(AuthenticateUserResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SuggestUserIDResponseType))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.225")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:oasis:names:tc:SPML:2:0")]
public partial class ResponseType : ExtensibleType {
private string[] errorMessageField;
private StatusCodeType statusField;
private string requestIDField;
private ErrorCode errorField;
private bool errorFieldSpecified;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("errorMessage", Order=0)]
public string[] errorMessage {
get {
return this.errorMessageField;
}
set {
this.errorMessageField = value;
this.RaisePropertyChanged("errorMessage");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public StatusCodeType status {
get {
return this.statusField;
}
set {
this.statusField = value;
this.RaisePropertyChanged("status");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="ID")]
public string requestID {
get {
return this.requestIDField;
}
set {
this.requestIDField = value;
this.RaisePropertyChanged("requestID");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public ErrorCode error {
get {
return this.errorField;
}
set {
this.errorField = value;
this.RaisePropertyChanged("error");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool errorSpecified {
get {
return this.errorFieldSpecified;
}
set {
this.errorFieldSpecified = value;
this.RaisePropertyChanged("errorSpecified");
}
}
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.225")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:corp:iam:spml2:security")]
public partial class SuggestUserIDResponseType : ResponseType {
private string[] uidField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("uid", Order=0)]
public string[] uid {
get {
return this.uidField;
}
set {
this.uidField = value;
this.RaisePropertyChanged("uid");
}
}
}
在一個的服務調用,返回的SOAP消息是
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns3:suggestUserIDResponse status="success" requestID="MyApp" xmlns="urn:oasis:names:tc:SPML:2:0" xmlns:ns2="urn:oasis:names:tc:SPML:2:0:password" xmlns:ns3="urn:corp:iam:spml2:security" xmlns:ns4="urn:oasis:names:tc:SPML:2:0:suspend" xmlns:ns5="urn:oasis:names:tc:SPML:2:0:search" xmlns:ns6="urn:oasis:names:tc:SPML:2:0:DSML" xmlns:ns7="urn:oasis:names:tc:DSML:2:0:core" xmlns:ns8="urn:oasis:names:tc:SPML:2:0:batch">
<ns3:uid>text1</ns3:uid>
<ns3:uid>text2</ns3:uid>
<ns3:uid>text3</ns3:uid>
</ns3:suggestUserIDResponse>
</soap:Body>
</soap:Envelope>
在這一點上的SOAP不反序列化到SuggestUserIDResponseType
類得當,SuggestUserIDResponseType.uid
永遠是空的,但重複的UID只出現在SuggestUserIDResponseType.Any
爲XmlElement
數據類型。
任何建議有什麼不對?
我改爲使用Web引用,它現在工作正常,引擎蓋下有什麼區別? – hardywang
有沒有故意的區別,只是不同的錯誤... –