Конференция ".Net" » Вопрос по работе c soap. [WinXP]
 
  • Дмитрий Белькевич © (30.06.06 17:04) [0]
    Что нужно: удалённо вызвать процедуру, написанную на 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.
  • Ломброзо © (30.06.06 18:07) [1]
    1) Поставить какой-нибудь soap-снифер (я пользуюсь утилиткой из пакета Apache Axis) и посмотреть, что уходит на сервер.
    2) Пристально изучить код прокси, который сгенерировала из wsdl Delphi
  • Дмитрий Белькевич © (30.06.06 21:54) [2]
    Спасибо за ответ.

    Смотрел с помощью 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".

    Может какая-нибудь особенность реализации протокола - не понятно, кто прав, а кто лев.
  • Дмитрий Белькевич © (30.06.06 23:43) [3]
    Новые результаты.
    Скорее всего, сервер настроен на приём 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 (как говорит Подгорецкий, не трогайте генофонд ;)), но чувствую, придёться править.
  • vlad_ri (27.07.06 17:07) [4]
    Если вопрос ещё актуален, то в юнит созданый WSDLImporter-ом в раздел Initialization добавьте следующую строчку:

     InvRegistry.RegisterInvokeOptions(TypeInfo(YourServiceInterfaceType),ioDocume nt);

    дело в том что по умолчанию используется ioLiteral...
  • 1 (14.03.12 11:32) [5]
    -1'
  • -1' (14.03.12 11:32) [6]
    1
  • 1 (14.03.12 11:32) [7]
    1
  • 1 (14.03.12 11:32) [8]
    1
  • 1 (14.03.12 15:35) [9]
    -1'
  • -1' (14.03.12 15:35) [10]
    1
  • 1 (14.03.12 15:35) [11]
    1
  • 1 (14.03.12 15:35) [12]
    1
  • 1 (14.03.12 22:09) [13]
    -1'
  • -1' (14.03.12 22:09) [14]
    1
  • 1 (14.03.12 22:09) [15]
    1
  • 1 (14.03.12 22:09) [16]
    1
  • 1 (14.03.12 22:17) [17]
    -1'
  • -1' (14.03.12 22:17) [18]
    1
  • 1 (14.03.12 22:17) [19]
    1
  • 1 (14.03.12 22:17) [20]
    1
  • icelex © (28.04.12 13:17) [21]
    вот таким нехитрым способом хакеры пытались взломать сайт...
 
Конференция ".Net" » Вопрос по работе c soap. [WinXP]
Есть новые Нет новых   [118476   +38][b:0.001][p:0.001]