На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> web services, soap , как работать с прокси классом
    Добрый день...
    Начну пожалуй с примеров запроса и ответа веб-сервиса:

    Request:
    ExpandedWrap disabled
      <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cm="http://company.ru/cm">
         <soapenv:Header/>
         <soapenv:Body>
            <cm:SimpleSearchQuery>
               <cm:searchExpression>
              /Bank[@docNumber="555"]
          </cm:searchExpression>
            </cm:SimpleSearchQuery>
         </soapenv:Body>
      </soapenv:Envelope>


    Response:
    ExpandedWrap disabled
      <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
         <soapenv:Header>
            <wsa:MessageID soapenv:mustUnderstand="0">uuid:123456789-0c222-1234-a123-bddbbddbbbbb</wsa:MessageID>
            <wsa:To soapenv:mustUnderstand="0">http://www.sonicsw.com/esb/replyto-destination-required</wsa:To>
            <wsa:Action soapenv:mustUnderstand="0">http://company.ru/webservice/BPMPortType/SimpleSearchResponse</wsa:Action>
            <wsa:From soapenv:mustUnderstand="0" xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">
               <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
            </wsa:From>
         </soapenv:Header>
         <soapenv:Body>
            <cm:SimpleSearchResult xmlns:cm="http://company.ru/cm">
              
                <ArrayOfItems>
                  <ns1:Item URI="http://117.17.117.7/CMBSpecificWebService/CMBGetPIDUrl?pid=55 1 ICM8 icmnlsdb9 Bank59 26 A100... A11... 14 1234&server=icmnlsdb&dsType=ICM" xmlns="http://www.ibm.com/xmlns/db2/cm/beans/1.0/schema" xmlns:ns1="http://www.ibm.com/xmlns/db2/cm/beans/1.0/schema">
                     <ns1:ItemXML>
                        <ns1:Financial DM_Class="Банковские документы" DM_State="Введен" FileName="Квитанция 5.pdf" Filial="Головной офис" Title="Квитанция к запросу" cm:PID="55 3 ICM8 icmnlsdb9 Bank59 26 A100... A11... 14 1234" docCategory="Касса" docDate="2010-08-02" docLocation="Центральный офис" docNumber="555" docNumber="555" docSum="100.00" docType="Квитанция 5" orderSum="100.00" xmlns:cm="http://www.ibm.com/xmlns/db2/cm/api/1.0/schema">
                           <cm:properties type="document">
                              <cm:lastChangeUserid value="PUPKIN"/>
                              <cm:lastChangeTime value="2011-03-16T13:39:09.451"/>
                              <cm:createUserid value="PUPKIN"/>
                              <cm:createTime value="2011-03-16T13:39:09.451"/>
                              <cm:semanticType value="1"/>
                              <cm:ACL name="PublicReadACL"/>
                              <cm:lastOperation name="RETRIEVE" value="SUCCESS"/>
                           </cm:properties>
                           <ns1:ICMBASE cm:PID="55 3 ICM8 icmnlsdb7 ICMBASE58 26 A100... A11C16B63909E388691 13 300" cm:partNumber="1">
                              <cm:properties type="item" xsi:type="cm:partPropertyType">
                                 <cm:lastChangeUserid value="PUPKIN"/>
                                 <cm:lastChangeTime value="2011-03-16T13:39:09.451"/>
                                 <cm:createUserid value="PUPKIN"/>
                                 <cm:createTime value="2011-03-16T13:39:09.451"/>
                                 <cm:semanticType value="128"/>
                                 <cm:ACL name="PublicReadACL"/>
                                 <cm:lastOperation name="RETRIEVE" value="SUCCESS"/>
       
                              </cm:properties>
                              <cm:resourceObject MIMEType="application/pdf" RMName="rmdb" SMSCollName="CBR.CLLCT001" externalObjectName="" originalFileName="Квитанция 5.pdf" resourceFlag="2" resourceName="" size="28900">
                                 <cm:URL value="http://testhq.ru:9080/icmrm/ICMResourceManager/Квитанция 5.pdf?order=retrieve&item-id=A1001001A1155555555555501111&version=1&collection=CBR.CLLCT001&libname=icmnlsdb&update-date=2011-03-16+13%3A39%3A09.451764&token=A4E6.HP86XE6_f0_gZuQv6yU;&content-length=0"/>
                              </cm:resourceObject>
       
                              
       
      </cm:resourceObject>
                           </ns1:ICMBASE>
                        </ns1:Bank>
                     </ns1:ItemXML>
                  </ns1:Item>
               </ArrayOfItems>
            
           </cm:SimpleSearchResult>
         </soapenv:Body>
      </soapenv:Envelope>

    * 117.17.117.7 = http://testhq.ru


    В общем, добавляю в проекте VS ссылку на веб-сервис:
    http://externalserver.ru:2584/wsdl/integration/services/CMInt_1-0 (в браузере, возвращает xml)

    Создается класс (судя по нагугленному, он называется прокси классом) test в Service References.

    Далее пробую так:
    ExpandedWrap disabled
      String testService = "http://externalserver.ru:2584/wsdl/integration/services/CMInt_1-0";
                  String prodService = null;
       
                  // создаем объект-клиент рокси сервера
                  test.BPMPortTypeClient client = new test.BPMPortTypeClient();
                  client.Open();
       
                  
       
                  // запрос
                  test.SimpleSearchQuery q = new test.SimpleSearchQuery();
                  q.searchExpression = "/Bank[@docNumber = 555]";
       
                  // для хранения результата
                  test.SimpleSearchResult res = null;
                  
                  // Выполняем метод SimpleSearch
                  res = client.SimpleSearch(q);
       
       
                  if (res != null) {
       
                      //parseResult(res);
                      System.Xml.XmlElement[] fields = res.Any;
       
                      foreach (XmlElement field in fields)
                      Console.WriteLine(field.Value);
       
                  }
       
                  else Console.WriteLine("res is null");
       
                  client.Close();


    foreach не отрабатывает, т.к. не задана ссылка на объект NullReferenceException

    Я так понял, что собрать данные ответа ( все что между <ArrayOfItems>...</ArrayOfItems> ), нужно через сгенерированный вижл студией прокси-класс.



    У меня такое предчувствие, что я, в корне, не верно делаю???
    Подскажите с решением...


    p.s.: в приведенном xml-ответе возможны не состыковки значений, изза того что на скорую руку замеянл значения для соблюдения конфиденциальности - не обращайте внимания!

    Добавлено
    йцукен
    Блин я совсем запутался, никогда с распределенными приложениями и веб-сервисами не работал...
    листал:
    Разработка XML Web-сервисов средствами Microsoft.NET.pdf
    Шорт

    Нортрап Т., Вилдермьюс Ш., Райан Б. - Основы разработки приложений на платформе Microsoft .NET Framework.
    Учебный курс Microsoft экзамен 70-536

    Но там в основном описание протокола SOAP, тэгов XML (WSDL, UDDI) с соответствующей теорией...
    практических примеров мало и не то что нужно, может еще что-то посмотреть?!
    Сообщение отредактировано: SectoRz -
      В приложении скрин со структурой прокси класса. Может еще какие - то данные привести.
      Прошу помочь разобраться или подсказать в какую сторону копать и какие примеры посмотреть...

      Прикреплённый файлПрикреплённый файлvv.PNG (26,05 Кбайт, скачиваний: 620)
        Цитата SectoRz @
        NullReferenceException

        в каком месте кода возникает?

        Добавлено
        Обычно прокси-объекты получают от какой то фабрики, а вы создаёте с помощью new. чтото не чисто тут.
          Цитата Alexus @
          Цитата SectoRz @
          NullReferenceException

          в каком месте кода возникает?

          Добавлено
          Обычно прокси-объекты получают от какой то фабрики, а вы создаёте с помощью new. чтото не чисто тут.

          На самом деле ошибка была в том, что я использовал Service Reference, а не Web Reference.
          После того как это обнаружилось было очень обидно((((

          Затем, почитав посты на stackowerflow выяснилось, что:

          Цитата
          При использовании Web Reference генерируется клиентский прокси класс, который позволяет обращаться к WEV-службе, описанной через WSDL (связь посредством SOAP и HTTP GET). Другими словами, Web-ссылка позволяет клиенту обращаться с web-службам на основе любой технологии, которая описана на WSDL.

          Service Reference осуществляет связь только к ASMX-сервисам. Service Reference создает класс прокси-клиента, который обращается к WCF-службам (независимо от того является ли WCF-сервис, WEB-сервисом или нет).


          Надеюсь кому то поможет не накосячить.
          Сообщение отредактировано: SectoRz -
            Цитата SectoRz @
            Service Reference осуществляет связь только к ASMX-сервисам.

            Перечитайте еще раз.

            Лично мне понравилось следующее определение из той же ссылки:
            Цитата
            A Web Reference allows you to communicate with any service based on any technology that implements the WS-I Basic Profile 1.1, and exposes the relevant metadata as WSDL. Internally, it uses the ASMX communication stack on the client side.

            A Service Reference allows you to communicate with any service based on any technology that implements any of the many protocols supported by WCF (including but not limited to WS-I Basic Profile). Internally, it uses the WCF communication stack on the client side.

            А по факту отличие очень простое: при создании Web Reference студия вызывает wsdl.exe, а при Service Reference - svcutil.exe
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,2125 ]   [ 18 queries used ]   [ Generated: 19.04.24, 06:12 GMT ]