c#用于测试和生产Web服务的代理类

时间:2012-08-02 13:36:53

标签: c# visual-studio-2010 web-services wsdl proxy-classes

我使用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只是一个身份验证令牌,并且总是不同的,所以没关系。

这个问题还有其他解决办法吗?

1 个答案:

答案 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更改为沙箱。

这可能不是最优雅的解决方案,但它快速而肮脏,完全符合我的需要。