Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.2.15] |
|
Сообщ.
#1
,
|
|
|
Добрый день...
Начну пожалуй с примеров запроса и ответа веб-сервиса: Request: <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: <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. Далее пробую так: 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) с соответствующей теорией... практических примеров мало и не то что нужно, может еще что-то посмотреть?! |
Сообщ.
#2
,
|
|
|
В приложении скрин со структурой прокси класса. Может еще какие - то данные привести.
Прошу помочь разобраться или подсказать в какую сторону копать и какие примеры посмотреть... Прикреплённый файлvv.PNG (26,05 Кбайт, скачиваний: 620) |
Сообщ.
#3
,
|
|
|
Цитата SectoRz @ NullReferenceException в каком месте кода возникает? Добавлено Обычно прокси-объекты получают от какой то фабрики, а вы создаёте с помощью new. чтото не чисто тут. |
Сообщ.
#4
,
|
|
|
Цитата 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-сервисом или нет). Надеюсь кому то поможет не накосячить. |
Сообщ.
#5
,
|
|
|
Цитата 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 |