AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.03.2015, 13:16   #1  
kitty is offline
kitty
Участник
 
370 / 30 (2) +++
Регистрация: 24.05.2005
Знатоки 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();
}
а вот так - сразу установить alias:
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
PS: Проблема в том, что сейчас у нас одна компания live, а хотят еще 2 запустить. Для каждой компании сделать по отдельному wsdl(все с одинаковыми методами) и получается, что код(как он написан сейчас, т.е по проекту на det/test/prod) аж 9 раз будет дублироваться (3 environment * 3 legal entities). Посоветуйте, как переключаться между 9 wsdl но при этом избежать дублирования кода
Старый 12.03.2015, 13:35   #2  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от kitty Посмотреть сообщение
Вообщем, выглядит коряво, но я не знаю, может, оно так и правильно?
Посмотрите на 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  
kitty is offline
kitty
Участник
 
370 / 30 (2) +++
Регистрация: 24.05.2005
Прошу прощения, у нас ax2012 R2 CU7
Как в ней это сделать?
Старый 12.03.2015, 14:50   #4  
Omeo is offline
Omeo
Участник
 
129 / 50 (2) ++++
Регистрация: 18.03.2004
Адрес: Moscow
делал что то такое

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);
_endpoint (собственно сам адрес-строка веб сервиса - НЕ wsdl), _user, _password = внешние параметры

Последний раз редактировалось Omeo; 12.03.2015 в 15:05.
Старый 12.03.2015, 14:51   #5  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от kitty Посмотреть сообщение
Прошу прощения, у нас ax2012 R2 CU7
Как в ней это сделать?
Можно зайти на Lifecycle services и посмотреть на изменения в \Classes\AifUtil\createServiceClient. Возможно, придется обновить бинарные компоненты (АОS, клиент) до CU8
__________________
-ТСЯ или -ТЬСЯ ?
Старый 12.03.2015, 17:56   #6  
kitty is offline
kitty
Участник
 
370 / 30 (2) +++
Регистрация: 24.05.2005
Цитата:
_endpoint (собственно сам адрес-строка веб сервиса - НЕ wsdl),
В доках у меня док wsdl упомянут
Что мне нужно спросить у third-Party(как сформулировать вопрос), чтобы мне дали этот адрес, а не wsdl? или он всегда такой же как wsdl, ток без "?wsdl" в конце?
Старый 12.03.2015, 23:08   #7  
Omeo is offline
Omeo
Участник
 
129 / 50 (2) ++++
Регистрация: 18.03.2004
Адрес: Moscow
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>
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Знатоки AIF, помогите! arty DAX: Программирование 1 25.10.2012 18:36
daxmusings: Consuming External Webservices in AX 2012 Blog bot DAX Blogs 0 20.10.2011 10:11
daxdilip: Question - How to Scale out AIF WebServices via Load Balancer Blog bot DAX Blogs 0 23.02.2011 14:11
помогите с palletId.allowEdit() Varmen DAX: Программирование 1 26.03.2009 17:24
Курсовые разницы! Помогите! SSM DAX: Функционал 7 26.09.2005 11:10
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:11.