Прокси-класс C# для тестового и производственного веб-сервиса
Я использую сгенерированные прокси-классы веб-сервисов из Visual Studio 2010 для доступа к веб-сервису из моего клиента.net 2.0.
Это прекрасно работает, но моя проблема в том, что веб-сервис имеет wsdl для тестовой системы и wsdl для производственной системы.
Хотя веб-сервисы структурно полностью идентичны, их пространства имен xml - нет.
В моем коде я могу установить URL-адрес службы веб-службы, и связь работает (я использую TraceExtension для вывода сообщений SOAP в файлы журналов), но когда дело доходит до десериализации, я получаю исключение.
Я думаю, это потому, что я сгенерировал прокси-классы с файлом WSDL из тестовой системы, и это добавило несколько атрибутов, таких как: [System.Xml.Serialization.SoapTypeAttribute(Namespace="URL-адрес testservice здесь")]
Конечно, я мог бы скопировать свой проект и добавить веб-ссылку на производственный сервис, но это дублировало бы мой код, и мне пришлось бы вносить любые дальнейшие изменения в будущем в двух проектах, что, конечно, подвержено ошибкам.
Вот рабочий ответ для вызова метода 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 тестовой системы). Код входа является только токеном аутентификации и всегда будет другим, так что все в порядке.
Есть ли другое решение этой проблемы?
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
Убедитесь, что обе ссылки добавлены в ваш проект как веб-ссылки, и измените свой SANDBOX
в PRODUCTION
для того, чтобы использовать производственный веб-сервис, и SANDBOX
для песочницы.
Это, вероятно, не самое элегантное решение, но оно быстрое и грязное и делает именно то, что мне нужно.