12.03.2015, 13:16 | #1 |
Участник
|
Знатоки C# , помогите с webservices
Есть внешний вебсервис, который надо вызывать из аксапты.
Для этого есть три разных wsdl: каждый соответствует соответствующей dev, test или prod инсталляции. Набор объектов/методов в них одинаковые Чтобы вызывать эти вебсервисы создано три c# проекта. У каждого свой namespace SomeClass.DEV, SomeClass.TEST, SomeClass.PROD , но каждый по сути имеет внутри одну и ту же логику(один и тот же набор методов) В AX соответственно пишется : Если текущий environment = TEST, то myObj = MyPrjNamespace.TEST. methodAbc() Если текущий environment = DEV, то myObj = MyPrjNamespace.DEV. methodAbc() etc Вообщем, выглядит коряво, но я не знаю, может, оно так и правильно? (( В теории , мне кажется, можно было бы добавить все три wsdl в один проект и передавать параметр - методы из какого serviceRef вызывать. Но тут у меня возникает вопрос: Если добавить в один проект три разных ServiceRef, то будет три namespace: MyPrjNamespace.ServiceRef1, MyPrjNamespace.ServiceRef2, MyPrjNamespace.ServiceRef3 Соответственно, если есть сейчас какой-то метод, создающий некий объект: createMyObj() { myObj = new MyPrjNamespace.ServiceRef1.objectToCreate(); } то как должен выглядеть этот метод, если надо создать этот объект из соответствующего ServiceRef (одного из трех)? То есть, можно ли, передав из аксапты имя текущего environment, присвоить некоторому alias выбранный namespace, и поэтому не писать вот так: X++: createMyObj() { if (environmentParam = 'DEV') myObj = new MyPrjNamespace.ServiceRef1.objectToCreate(); if (environmentParam = 'TEST') myObj = new MyPrjNamespace.ServiceRef2.objectToCreate(); if (environmentParam = 'UAT') myObj = new MyPrjNamespace.ServiceRef3.objectToCreate(); } createMyOtherObj() { if (environmentParam = 'DEV') myOtherObj = new MyPrjNamespace.ServiceRef1.someOtherObjectToCreate(); if (environmentParam = 'TEST') myOtherObj = new MyPrjNamespace.ServiceRef2.someOtherObjectToCreate(); if (environmentParam = 'UAT') myOtherObj = new MyPrjNamespace.ServiceRef3.someOtherObjectToCreate(); } X++: setNameSpaceAlias() { if (environmentParam = 'DEV') MyPrjNamespace.ServiceRefAlias = new MyPrjNamespace.ServiceRef1; if (environmentParam = 'TEST') MyPrjNamespace.ServiceRefAlias = new MyPrjNamespace.ServiceRef2; if (environmentParam = 'UAT') MyPrjNamespace.ServiceRefAlias = new MyPrjNamespace.ServiceRef3; } alias: createMyObj() { myObj = new MyPrjNamespace.ServiceRefAlias.objectToCreate(); } createMyOtherObj() { myOtherObj = new MyPrjNamespace.ServiceRefAlias.someOtherObjectToCreate(); } etc |
|
12.03.2015, 13:35 | #2 |
Модератор
|
Посмотрите на KB2998611 - No API is available for dynamically changing the target of a web service reference (включен в CU8)
Reference у Вас будет один, а target URI можно брать из БД (и хранить глобально один на инстанс или по компаниям). Опять же, меньше телодвижений во время обновления приложения \ переноса модификаций
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: Logger (5). |
12.03.2015, 14:17 | #3 |
Участник
|
Прошу прощения, у нас ax2012 R2 CU7
Как в ней это сделать? |
|
12.03.2015, 14:50 | #4 |
Участник
|
делал что то такое
dll одна, метод самого запроса к web-service просто принимает на вход параметры X++: System.ServiceModel.EndpointAddress ep = new System.ServiceModel.EndpointAddress(_endpoint); System.ServiceModel.BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding(); binding.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.TransportCredentialOnly; binding.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Basic; Namespace.OUTSYSTEMClient client = new Namespace.OUTSYSTEMClient(binding, ep); client.ClientCredentials.UserName.UserName = _user; client.ClientCredentials.UserName.Password = _password; OUTSYSTEMResponse response; response = client.OUTSYSTEMConfirm(confirm); Последний раз редактировалось Omeo; 12.03.2015 в 15:05. |
|
12.03.2015, 14:51 | #5 |
Модератор
|
Можно зайти на Lifecycle services и посмотреть на изменения в \Classes\AifUtil\createServiceClient. Возможно, придется обновить бинарные компоненты (АОS, клиент) до CU8
__________________
-ТСЯ или -ТЬСЯ ? |
|
12.03.2015, 17:56 | #6 |
Участник
|
Цитата:
_endpoint (собственно сам адрес-строка веб сервиса - НЕ wsdl),
Что мне нужно спросить у third-Party(как сформулировать вопрос), чтобы мне дали этот адрес, а не wsdl? или он всегда такой же как wsdl, ток без "?wsdl" в конце? |
|
12.03.2015, 23:08 | #7 |
Участник
|
wsdl - это описание в том числе всех точек (endpoint)
т.е в самом wsdl можно его найти например в wsdl, найденном на просторах инета это адрес из строки <soap12:address location="http://localhost/aspnet/WebServiceDemo/Service.asmx" /> X++: <?xml version="1.0" encoding="utf-8" ?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/"> <s:element name="ArrayOfIntegers"> <s:complexType /> </s:element> <s:element name="ArrayOfIntegersResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="ArrayOfIntegersResult" type="tns:ArrayOfInt" /> </s:sequence> </s:complexType> </s:element> <s:complexType name="ArrayOfInt"> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" name="int" type="s:int" /> </s:sequence> </s:complexType> </s:schema> </wsdl:types> <wsdl:message name="ArrayOfIntegersSoapIn"> <wsdl:part name="parameters" element="tns:ArrayOfIntegers" /> </wsdl:message> <wsdl:message name="ArrayOfIntegersSoapOut"> <wsdl:part name="parameters" element="tns:ArrayOfIntegersResponse" /> </wsdl:message> <wsdl:portType name="ServiceSoap"> <wsdl:operation name="ArrayOfIntegers"> <wsdl:input message="tns:ArrayOfIntegersSoapIn" /> <wsdl:output message="tns:ArrayOfIntegersSoapOut" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="ServiceSoap" type="tns:ServiceSoap"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="ArrayOfIntegers"> <soap:operation soapAction="http://tempuri.org/ArrayOfIntegers" style="document" /> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:binding name="ServiceSoap12" type="tns:ServiceSoap"> <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="ArrayOfIntegers"> <soap12:operation soapAction="http://tempuri.org/ArrayOfIntegers" style="document" /> <wsdl:input> <soap12:body use="literal" /> </wsdl:input> <wsdl:output> <soap12:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="Service"> <wsdl:port name="ServiceSoap" binding="tns:ServiceSoap"> <soap:address location="http://localhost/aspnet/WebServiceDemo/Service.asmx" /> </wsdl:port> <wsdl:port name="ServiceSoap12" binding="tns:ServiceSoap12"> <soap12:address location="http://localhost/aspnet/WebServiceDemo/Service.asmx" /> </wsdl:port> </wsdl:service> </wsdl:definitions> |
|