2012-08-02 32 views
3

我使用Visual Studio 2010生成的webservice代理類從我的.net 2.0客戶端訪問Web服務。c#代理類用於測試和生產Web服務

這工作得很好,但我的問題是,web服務有一個測試系統的wsdl和生產系統的wsdl。

儘管webservices在結構上完全相同,但它們的xml名稱空間並不是。

在我的代碼中,我可以設置web服務的服務URL和通信工作(我使用TraceExtension將SOAP消息轉儲到日誌文件),但是當涉及到反序列化時,我會遇到異常。

我認爲這是因爲我生成代理類與來自測試系統的WSDL文件,這增加了一些屬性是這樣的: [System.Xml.Serialization.SoapTypeAttribute(命名空間=「TestService的URL這裏」)]

我當然可以複製我的項目並在生產服務中添加一個web參考,但是這會複製我的代碼,我將不得不在將來對兩個項目進行任何進一步的更改,當然這很容易出錯。

這裏是調用依據測試系統服務的登錄,方法的工作響應:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://TEST_SERVER_NAME/ProjectService"> 
    <SOAP-ENV:Body> 
     <ns1:loginResponse xmlns:ns1="http://TEST_SERVER_NAME/ProjectService"> 
      <login_result xsi:type="tns:LoginResult"> 
       <errorcode xsi:type="xsd:integer">0</errorcode> 
       <errortext xsi:type="xsd:string">Successfully logged in</errortext> 
       <logincode xsi:type="xsd:string">wF3N5vdPsueL0aYlp41i6B8VTZEJztqx</logincode> 
      </login_result> 
     </ns1:loginResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

這裏是從生產web服務相同的反應:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://PRODUCTION_SERVER_NAME/ProjectService"> 
    <SOAP-ENV:Body> 
     <ns1:loginResponse xmlns:ns1="http://TEST_SERVER_NAME/ProjectService"> 
      <login_result xsi:type="tns:LoginResult"> 
       <errorcode xsi:type="xsd:integer">0</errorcode> 
       <errortext xsi:type="xsd:string">Successfully logged in</errortext> 
       <logincode xsi:type="xsd:string">wOmdlZMkIXVL4H8uTGU69hgpNsK1Cz3Q</logincode> 
      </login_result> 
     </ns1:loginResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

正如你所看到的,這兩個響應只在xmlns:tns屬性上有所不同,而xmlns:ns1屬性始終爲http://TEST_SERVER_NAME/ProjectService(我想這是來自生成的代理類和測試系統的WSDL)。 logincode只是一個認證令牌,並且會始終不同,所以沒關係。

有沒有其他解決方案來解決這個問題?

+0

解決此問題的運氣如何? – user324365 2012-08-29 11:13:09

回答

1

真正遲到了,但我用預處理指令來解決這個問題:

#define SANDBOX //Change from sandbox to production to switch between both systems. 

#if SANDBOX 
    using NetSuite.com.netsuite.sandbox.webservices; 
#endif 

#if PRODUCTION 
    using NetSuite.com.netsuite.webservices; 
#endif 

確保兩個引用添加到您的項目的Web引用和改變你的SANDBOXPRODUCTION爲了使用生產web服務,沙盒的SANDBOX

這可能不是最優雅的解決方案,但它的快速和骯髒,正是我所需要的。