-
Что нужно: удалённо вызвать процедуру, написанную на asp.net, передать ей некоторые параметры и забрать массив строчек. Что сделал: забрал у них wsdl файл, с помомщью ide сделал интерфейсный класс. Соединяюсь через THTTPRIO. Вызываю функцию: X := HTTPRIO1 as WorklistSoap; Res := X.GetDicomWorklist(10, 'ASD', 'myaddr.com/beta', 'fdsa', ''); Что получается: на сервер не приходят паоаметры. Приходит: 0,'','',''. XML, который предаётся: <?xml version="1.0"?> <SOAP-ENV:Envelope 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"> <SOAP-ENV:Body> <GetDicomWorklist xmlns="https://myaddr.com/fx"> <clinicid>10</clinicid> <aetitle>ASD</aetitle> <webExtension>myaddr.com/beta</webExtension> <pwd>fdsa</pwd> <parameters></parameters> </GetDicomWorklist> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Заранее благодарен за любые мысли. Среда, в которой я работаю - delphi 7.
-
1) Поставить какой-нибудь soap-снифер (я пользуюсь утилиткой из пакета Apache Axis) и посмотреть, что уходит на сервер. 2) Пристально изучить код прокси, который сгенерировала из wsdl Delphi
-
Спасибо за ответ.
Смотрел с помощью ms soapsdk. Вот именно то, что можно сохранить в onbeforeexecute и уходит. Изучил, вроде всё прозрачно:
function GetDicomWorklist(const clinicid: Integer; const aetitle: WideString; const webExtension: WideString; const pwd: WideString; const parameters: WideString): ArrayOfAnyType; stdcall;
Передаю число и четыре строчки (последняя - пустая, хотя пробовал и чем-то заполнить).
Сделали мне еще одну функцию - заглушку для тестов:
function TestWorklist(const parameter: WideString): WideString; stdcall;
Возвращает то, что передали. Возвращает, соответственно, пустую строку.
Уточнил, на чём север реализован. Сказали: "Cделано в MS Visual Studio 2003 .NET, веб-сервер - IIS 6".
Может какая-нибудь особенность реализации протокола - не понятно, кто прав, а кто лев.
-
Новые результаты. Скорее всего, сервер настроен на приём rpc/Literal, а я передаю rpc/Document, как я понял. Переключаю InvRegistry.RegisterInvokeOptions(TypeInfo(WorklistSoap), ioLiteral); на InvRegistry.RegisterInvokeOptions(TypeInfo(WorklistSoap), ioDocument); возникает другая проблема - не шлётся method node, т.е название вызываемого метода (в xml видно наличие отсутсвия ;)).
Потрасил немного vcl и наткнулся на такой кусок:
{ If we're sending literal params, then skip the method node } if not (soLiteralParams in Options) then begin
Т.е. получается, что название вызываемой функции не передаётся серверу. Серверу, ессно плохеет от таких запросов - плюется ошибками.
Закомментил условие if not soLiteralParams, сервер наконец посланное всосал и отдал долгожданную мессагу взад. Которую, правда, HTTPRIO не смог переварить/корректно распарсить.
Вот сижу и думаю, что бы это всё значило. Крайне не люблю править vcl (как говорит Подгорецкий, не трогайте генофонд ;)), но чувствую, придёться править.
-
Если вопрос ещё актуален, то в юнит созданый WSDLImporter-ом в раздел Initialization добавьте следующую строчку:
InvRegistry.RegisterInvokeOptions(TypeInfo(YourServiceInterfaceType),ioDocume nt);
дело в том что по умолчанию используется ioLiteral...
-
-1'
-
1
-
1
-
1
-
-1'
-
1
-
1
-
1
-
-1'
-
1
-
1
-
1
-
-1'
-
1
-
1
-
1
-
вот таким нехитрым способом хакеры пытались взломать сайт...
|