2013-07-02 63 views
3

我正在與我們的合作伙伴之一合作來整合我們的業務服務。我正在使用WCF(.Net 3.5)與合作伙伴Web服務進行通信。我認爲合作伙伴網絡服務是用Java編寫的。前綴SOAP XML改爲直接命名空間

使用SVC util我生成的代理類。改爲DataContract序列化程序,svcutil使用xmlserializer。但是合作伙伴提供的WSDL和Web服務響應SOAP xml不匹配。由於合作伙伴對更改wsdl不感興趣,我已經手動更改了下載的WSDL以匹配響應。該問題已得到解決。

現在我遇到了不同的問題。當我向Web服務發送請求時,它總是失敗。然後我使用fiddler來獲取轉發給合作伙伴的SOAP請求。合作伙伴表示,請求發送的xml名稱空間不會針對他們的系統進行驗證。他們還回復了示例SOAP請求。

通過比較這兩個請求,名稱空間看起來是正確的。但是,合作伙伴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預期的XML,命名空間http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/的前綴「acd」在合作伙伴xml中我們沒有。合作伙伴希望我們發送這種格式。

我認爲Partner Xml不符合標準。這真是合夥人的問題。但我沒有選擇餘地,需要改變我的Xml。

儘管我們可以在WCF服務中定製序列化,但我不確定是否可以在此級別更改前綴。此外,我不確定遵循XSD標準的合作伙伴Xml。

如果你可以指導修改WCF序列化以適應上述變化,我將不勝感激。

+0

您應該找到了解XML的合作伙伴。 XML中的前綴無關緊要 - 只有名稱空間。如果你的伴侶認爲不然,那麼他們就沒有能力。 –

+0

標準的全部目的是讓你這樣的人不必爲你處理的每個合作伙伴定製你的軟件。他們都應該遵循標準 - 這不是一個新標準。真的沒有理由不支持它。 –

+0

@JohnSaunders我完全同意你的看法。 – Amzath

回答

3

我修復了由SVC Util生成的代理類。我添加了一個發佈前綴的新屬性。例如在類SignonRq中,我添加了以下屬性。該序列化XML前綴ACD

 [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. 
     } 
    } 
+0

他們不是不想要'acd'作爲前綴? –

+0

@JohnSaunders對於命名空間http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/,他們希望使用acd前綴。他們想要名稱空間http://schemas.WebServiceProvider.com/us/ileads/types/Servicing的前綴stc1。 – Amzath

+0

您可否請您發佈整個班級,包括您給予它的屬性,因爲我已將此屬性添加到我的班級,並且沒有任何更改。謝謝。 –