我正在与我们的合作伙伴合作,整合我们的业务服务。我正在使用WCF(.Net 3.5)与合作伙伴Web服务进行通信。我认为合作伙伴Web服务是用Java编写的。
使用SVC util我生成了代理类。而不是DataContract序列化程序,svcutil使用xmlserializer。但是合作伙伴提供的WSDL与Web服务响应SOAP xml不匹配。由于合作伙伴对更改wsdl不感兴趣,因此我手动更改了下载的WSDL以匹配响应。这个问题已得到解决。
现在我遇到了不同的问题。当我向Web服务发送请求时,它总是失败。然后我使用fiddler将SOAP请求转发给合作伙伴。合作伙伴表示请求发送的xml命名空间不会对其系统进行验证。他们还回复了样本SOAP请求。
通过比较两个请求,命名空间看起来是正确的。但是伙伴xml使用前缀来定义名称空间,并且元素是前缀的。虽然我们这边的xml没有前缀而是直接在父元素中使用了命名空间。
以下是我们发送的XML
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<iL21stCentRq xmlns="http://schemas.WebServiceProvider.com/us/ileads/messages/Servicing">
<ACORD xmlns="http://schemas.WebServiceProvider.com/us/ileads/types/Servicing">
<SignonRq xmlns="http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/">
<SignonPswd>
<CustId>
<SPName>111</SPName>
</CustId>
</SignonPswd>
</SignonRq>
</ACORD>
</iL21stCentRq>
</s:Body>
以下是合作伙伴希望我们提供的示例XML
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stc="http://schemas.WebServiceProvider.com/us/ileads/messages/Servicing" xmlns:stc1="http://schemas.WebServiceProvider.com/us/ileads/types/Servicing" xmlns:acd="http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/">
<soapenv:Header/>
<soapenv:Body>
<stc:iL21stCentRq>
<stc:input>
<stc1:ACORD>
<acd:SignonRq>
<acd:SignonPswd>
<acd:CustId>
<acd:SPName>yourcompany.com</acd:SPName>
</acd:CustId>
</acd:SignonPswd>
</acd:SignonRq>
</stc1:ACORD>
</stc:input>
</stc:iL21stCentRq>
</soapenv:Body>
如果比较两个XML,则命名空间http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/在伙伴xml中以“acd”为前缀,而不是。合作伙伴希望我们以这种格式发送。
我认为合作伙伴Xml不符合标准。这真是伴侣问题。但我没有选择,需要更改我身边的Xml。
虽然我们可以在WCF服务中自定义序列化,但我不确定是否可以在此级别更改前缀。此外,我不确定Partner Xml是否遵循XSD标准。
如果您可以指导修改WCF序列化以适应上述更改,我将不胜感激。
答案 0 :(得分:4)
我修复了SVC Util生成的代理类。我添加了一个发出前缀的新属性。例如,在SignonRq类中,我添加了以下属性。用前缀acd
序列化XML [XmlNamespaceDeclarations()]
public XmlSerializerNamespaces xmlsn
{
get
{
XmlSerializerNamespaces xsn = new XmlSerializerNamespaces();
xsn.Add("acd", "http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/");
return xsn;
}
set
{
//Just provide an empty setter.
}
}
例如,类ACORD,我添加了以下属性。这使用前缀stc1序列化XML。
[XmlNamespaceDeclarations()]
public XmlSerializerNamespaces xmlsn
{
get
{
XmlSerializerNamespaces xsn = new XmlSerializerNamespaces();
xsn.Add("stc1", "http://schemas.WebServiceProvider.com/us/ileads/types/Servicing");
return xsn;
}
set
{
//Just provide an empty setter.
}
}