Страница 1 из 1

VIP и Web-сервисы

Добавлено: 13 апр 2009, 17:53
Maverick
Господа, вопрос жизни и смерти.
У кого нибудь получилось толково запустить через точку расширения нормальный web-сервис?
Если да - поделитесь опыом. Очень интересная и злободневная тема.

ПыСы.
Ответы типа "а кто мешает зпустить оттуда exe или ф-ю из dll" не канают )))
нужно запустить из Галактики полноценый веб-сервис, который бы реагировал на изменение состояния некоей записи в БД Галки...

Добавлено: 13 апр 2009, 18:34
galover
Чего-то непонятно что нужно: обратиться из vip-а к внешнему web сервису или же написать интерфейс на vip-е, работающий как web сервис (т.е. заюзать конструкцию web vipInterface)???
Если 1-ый вариант то вроде работает, 2-й не юзал

Добавлено: 13 апр 2009, 18:44
Maverick
Поясняю на пальцах:
1. Есть точка расширения на триггер таблицы БД Первасива
2. На отрабатывание триггера необходимо запустить внешний web-сервис. Если точнее - то web-сервис Microsoft Dynamics CRM 4.0.

если есть примеры подобных кодов - буду чрезмерно признателен.

можно публиковать здесь - думаю всем будет интересно

Добавлено: 13 апр 2009, 19:45
galover
Ну тогда 2-й вариант. Я немного занимался этим вопросом. Не смотря на рекламные слоганы, Галактика не имеет встроенных средств для работы с web сервисами. Все что она может, это работать с COM объектами. Поэтому схема примерно такая (пример на .NET, но это неважно, в остальном тот же принцип):
1) получаем по wsdl описанию proxy web сервиса. Можно воспользоваться утилитой wsdl.exe. Например так:

Код: Выделить всё

"c:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\wsdl.exe" /n:MyNamespace /out:"webServiceProxy.cs"  /urlkey:WebServiceUrl http://localhost/MyWebService.asmx?wsdl
2) Полученный прокси класс нужно представить как COM объект. Навешиваем на класс дополнительные атрибуты:

Код: Выделить всё

    [Guid(здесь конкретный Guid)]
    [ComVisible(true)]
    public partial class MyWebService : System.Web.Services.Protocols.SoapHttpClientProtocol {
3) Компилируем, получаем сборку MyProxy.dll (сборка должна быть strong name). Теперь эту сборку нужно зарегить как COM объект:

Код: Выделить всё

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm.exe /codebase MyProxy.dll
4) Далее получаем обертку на vip:
- получаем tlb файл (можно с помощью OLE/COM object viewer) по нашей сборке
- гененрируем vih и vip файлы

Код: Выделить всё

atltlb.exe MyProxy.tlb
5) Пишем собственно на vip:

Код: Выделить всё

handler with replace ...
action
{
  var _proxy : com_MyWebService;
  _proxy := com_MyWebService(new(coMyWebService));

  _proxy.МетодWebСервиса(...);
}
Примерно так...

Добавлено: 24 июн 2009, 15:37
fedoroff
Попробовал предложенный galover-ом способ, столкнулся с такой проблемой: при создании vih-ов не создаются методы веб-сервиса, в созданном файле описание объектного интерфейса выглядит так:

Код: Выделить всё

(...)
ObjInterface com_GalWebServices( comIDispatch );
end;
(...)
Соответственно, при компиляции ресурсника атлантис ругается на несуществующие методы.

В созданном wsdl-ом классе методы видно:

Код: Выделить всё

        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://zzz/webservices/HelloWorld", RequestNamespace="http://zzz/webservices", ResponseNamespace="http://zzz/webservices", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
        public int HelloWorld() {
            object[] results = this.Invoke("HelloWorld", new object[0]);
            return ((int)(results[0]));
        }
ComVisible(true) стоит, в свойствах проекта тоже стоят галки "Register for COM Interop" и "Make assembly COM-Visible". Сборка успешно регистрируется.

Есть какие-то тонкости в этом процессе? Как заставить галактику увидеть веб-сервисы? Разработка .Net 2.0 (VS2008), atltlb версии 5.2.08.00.

Добавлено: 25 июн 2009, 13:53
Screw
Что насчет
2) Полученный прокси класс нужно представить как COM объект. Навешиваем на класс дополнительные атрибуты: Код:

[Guid(здесь конкретный Guid)]
[ComVisible(true)]
public partial class MyWebService : System.Web.Services.Protocols.SoapHttpClientProtocol {
?
Делали?