上下文:我正在尝试与 DocuSign 的 Connect 通知服务集成。我已经使用名为 DocuSignConnectUpdate 的方法设置了 WCF 服务,该方法将 DocuSignEnvelopeInformation 作为其唯一参数,如 DocuSign 所指定。此 DocuSignEnvelopeInformation 对象来自对他们的API https://demo.docusign.net/api/3.0/api.asmx,以便他们可以将此对象传递到我的 Web 服务,并且我确切地知道会发生什么。 DocuSign 要求提供我的服务地址和命名空间,这些是我在他们的网站上配置的。
问题:DocuSign 发送的 XML 正是我所期望的。 DocuSignEnvelopeInformation 及其子项位于命名空间“http://www.docusign.net/API/3.0 http://www.docusign.net/API/3.0" 并且元素名称与对象名称匹配:
<DocuSignEnvelopeInformation xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.docusign.net/API/3.0">
<EnvelopeStatus>...</EnvelopeStatus>
</DocuSignEnvelopeInformation>
但我的 Web 服务期望出现不同的情况,在错误的命名空间中,并且元素名称已修改。这就是我的 WSDL 中定义 DocuSignConnectUpdate 方法的方式:
<xs:element name="DocuSignConnectUpdate">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="DocuSignEnvelopeInformation" nillable="true" type="tns:DocuSignEnvelopeInformation"/>
</xs:sequence>
</xs:complexType>
</xs:element>
这就是我的 WSDL 中定义 DocuSignEnvelopeInformation 类型的方式:
<xs:complexType name="DocuSignEnvelopeInformation">
<xs:sequence>
<xs:element xmlns:q1="http://schemas.datacontract.org/2004/07/System.ComponentModel" name="PropertyChanged" nillable="true" type="q1:PropertyChangedEventHandler"/>
<xs:element name="documentPDFsField" nillable="true" type="tns:ArrayOfDocumentPDF"/>
<xs:element name="envelopeStatusField" nillable="true" type="tns:EnvelopeStatus"/>
<xs:element name="timeZoneField" nillable="true" type="xs:string"/>
<xs:element name="timeZoneOffsetField" type="xs:int"/>
<xs:element name="timeZoneOffsetFieldSpecified" type="xs:boolean"/>
</xs:sequence>
</xs:complexType>
像envelopeStatusField这样的元素名称是private自动生成的代码中使用的变量。公共属性名称与 DocuSign 发送的 xml 匹配。自动生成的代码还使用 XmlTypeAttribute 用正确的文档签名命名空间标记每个对象。因此,从查看自动生成的代码来看,我希望我的服务对输入感到满意,但生成的 WSDL 不同,如上所示,并且我的服务无法反序列化 xml。
一些代码:自动生成的 DocuSignEnvelopeInformation 声明:
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.docusign.net/API/3.0")]
public partial class DocuSignEnvelopeInformation : object, System.ComponentModel.INotifyPropertyChanged {
private EnvelopeStatus envelopeStatusField;
private DocumentPDF[] documentPDFsField;
private string timeZoneField;
private int timeZoneOffsetField;
private bool timeZoneOffsetFieldSpecified;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=0)]
public EnvelopeStatus EnvelopeStatus {
...
...
唯一方法的OperationContract:
[SoapHeaders]
[ServiceContract(Namespace = "http:/MyNameSpace")]
public interface IDocusignEventListener
{
[OperationContract]
[FaultContract(typeof(ErrorMessageCollection), Action = Constants.FaultAction)]
string DocuSignConnectUpdate(DocuSignEnvelopeInformation DocuSignEnvelopeInformation);
}
DocuSign调用的方法
[ServiceBehavior(Namespace = "http:/MyNameSpace", ConfigurationName = "DocusignEventListener")]
public class DocusignEventListener : IDocusignEventListener
{
public string DocuSignConnectUpdate(DocuSignEnvelopeInformation DocuSignEnvelopeInformation)
{
...
return DocuSignEnvelopeInformation.EnvelopeStatus.EnvelopeID;
}
}
那么,问题又是为什么 wsdl 会以这种方式显示?为什么该对象与我从中提取它的引用不同?更重要的是,我能修复它吗?