прокси-класс c # для тестовой и производственной веб-службы

Я использую сгенерированные классы прокси веб-службы из Visual Studio 2010 для доступа к веб-службе из моего клиента .net 2.0.

Все работает нормально, но моя проблема в том, что у веб-сервиса есть wsdl для тестовой системы и wsdl для производственной системы.

Хотя веб-сервисы структурно полностью идентичны, их пространства имен xml - нет.

В моем коде я могу установить URL-адрес веб-службы, и связь будет работать (я использую TraceExtension для сброса сообщений SOAP в файлы журнала), но когда дело доходит до десериализации, я получаю исключение.

Я думаю, это связано с тем, что я сгенерировал прокси-классы с помощью файла WSDL из тестовой системы и добавил несколько таких атрибутов, как этот: [System.Xml.Serialization.SoapTypeAttribute (Namespace = "testservice url here")]

Конечно, я мог бы скопировать свой проект и добавить веб-ссылку на производственную службу, но это приведет к дублированию моего кода, и мне придется вносить дальнейшие изменения в будущем в два проекта, что, конечно, подвержено ошибкам.

Вот рабочий ответ на вызов метода 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 тестовой системы). Код входа - это всего лишь токен аутентификации и всегда будет другим, так что ничего страшного.

Есть ли другое решение этой проблемы?


person Robert Pordes    schedule 02.08.2012    source источник


Ответы (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 для песочницы.

Это, вероятно, не самое элегантное решение, но оно быстрое, грязное и делает именно то, что мне нужно.

person Robert H    schedule 19.12.2013