我使用visual studio 2010中生成的webservice代理类从我的.net 2.0客户端访问Web服务。
这很好用,但我的问题是,webservice有一个用于测试系统的wsdl和一个用于生产系统的wsdl。
虽然webservices在结构上完全相同,但它们的xml命名空间不是。
在我的代码中,我可以设置webservice的服务URL和通信工作(我使用TraceExtension将SOAP消息转储到日志文件),但是当涉及反序列化时,我得到一个例外。
我认为这是因为我使用测试系统中的WSDL文件生成了代理类,并添加了以下几个属性: [System.Xml.Serialization.SoapTypeAttribute(Namespace =“testservice url here”)]
我当然可以复制我的项目并向生产服务添加一个webreference,但这会复制我的代码,我将来必须在两个项目中进行任何进一步的更改,当然这很容易出错。
以下是针对测试系统服务调用Login方法的工作响应:
<?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>
这是来自生产网络服务的相同响应:
<?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 :(得分: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引用添加到您的项目中,并将SANDBOX
更改为PRODUCTION
以使用生产Web服务,并将SANDBOX
更改为沙箱。
这可能不是最优雅的解决方案,但它快速而肮脏,完全符合我的需要。