:: Visual Foxpro, Foxpro for DOS
И все же SOAP - хелп, гуру WEB-сервисов...
Longinov
Автор

Сообщений: 208
Откуда: Днепропетровск
Дата регистрации: 31.10.2005
Начитавшись примеров и обсуждений по разработке трехуровневых приложений, решил погрузиться в реализацию собственного творения и столкнулся с проблемами, которые сам разгрести не смог.

Использую связку VFP9.0+MSSQL2000.
Все свои начинания делаю на примере статьи, предоставленным любезно Sergey Chavlytko, где все очень красиво и понятно описано. Ну а теперь о проблемах. Речь будет идти о серверной части проекта – вернее реализации Web Services.

Код самой программы с одной процедурой передачи данных из таблицы us:

Define Class INFO_SERVER As Session OlePublic
Procedure Init
Set Deleted On
Set Date Dmy
Set Exclusive Off
Set Multilocks On
Set Reprocess To 1000
Set StrictDate To 0
Set Century On
Public gcWebSDat
gcWebSDat='C:\info_server\'
Endproc
**********процедура, которая не работает!***********
Procedure users_read() As String
gn_ConnHandle= SQLConnect('info', 'long', '999') && connect to us
If gn_ConnHandle > -1
SQLSetprop(gn_ConnHandle, 'asynchronous', .F.)
SQLExec(gn_ConnHandle, 'SELECT cod, fio FROM us', 'mYusers')&&selec from us
If Reccount()>0
Cursortoxml("mYusers","lcXML",1,1+32,0,"1")&& to XML
Use In mYusers&& close alias
Else
lcXML=-1
Endif
SQLDisconnect(gn_ConnHandle)
Else
lcXML=-1
Endif

Return (lcXML)

Endproc
*******************************************************************
Enddefine

Компилирую в dll, сам веб-сервис зарегистрирован нормально и запущен.

Запускаю проверку передачи данных:
o=CREATEOBJECT("MSSoap.SoapClient30")
o.MSSoapInit("http://KV/info_server/info_server.WSDL")
? o.users_read
release o

На команде - ? o.users_read выдает ошибку на строку в коде dll:
gn_ConnHandle= SQLConnect('info', 'long', '999')
следующего содержания: «Недопустимый дескриптор подключения. 1466.»

Предприняв все попытки, произвел проверку не через сервис (dll), а в простом prg:
Store SQLConnect('info', 'long', '999') To gn_ConnHandle && connect to us
If gn_ConnHandle > 0
SQLSetprop(gn_ConnHandle, 'asynchronous', .F.)
SQLExec(gn_ConnHandle, 'SELECT cod, fio FROM us', 'mYusers')&&selec from us
If Reccount()>0
Cursortoxml("mYusers","lcXML",1,1+32,0,"1")&& to XML
brow
Use In mYusers&& close alias
Else
lcXML=-1
Endif
SQLDisconnect(gn_ConnHandle)
Else
lcXML=-1
Endif
?lcXML

Все работает как часы. Коннектится к БД, выбирает из таблицы данные, кидает их в XML.

Что не нравиться сервису? Хелп!
Ratings: 0 negative/0 positive
Re: И все же SOAP - хелп, гуру WEB-сервисов...
MichaelD

Сообщений: 7578
Дата регистрации: 14.05.2005
Longinov,

Цитата:
- Запускаю проверку передачи данных:
выдает ошибку на строку в коде dll:
gn_ConnHandle= SQLConnect('info', 'long', '999')
следующего содержания: «Недопустимый дескриптор подключения. 1466.»

- Предприняв все попытки, произвел проверку не через сервис (dll), а в простом prg
... Все работает как часы. Коннектится к БД, выбирает из таблицы данные, кидает их в XML.


Может быть это весьма общие соображения, то тем не менее... Не имея опыта/интуиции писать правильно нужно двигаться по-шагово:

1) пишим код (куски кода) - проверяем их работу... после того, как остаёмсы довольными, переходим к следующему шагу...
2) из кода (кусков кода) создаём VFP-классы (Session но без OLEPUBLIC!), добиваемся безупречной работы (в т.ч. помещая код типа abra=cadabra в произвольные места в любых методах), как остаёмсы довольными, переходим к следующему шагу...
3) утанавливаем где это было задумано OLEPUBLIC, регистрим компоненты... и на локальном компе проверяем работу не из-под VFP, а скажем из-под Excel, Word, VB или т.п., добиваемся безупречной работы... как остаёмсы довольными, переходим к следующему шагу...
4) регистрим уже "сносно работающие" компоненты в "Службу компонент" (COM+), пробуем обращения с этой же машины... как остаёмсы довольными, переходим к следующему шагу...
5) здесь возможны варианты (однако в этой точке, мы должны быть достаточно уверенными в работе самих компонент):
- делаем экспорт приложения, если предполагается работа со сторны клиентов через DCOM, устанавливаем полученные MyAppProxy на удалённого клиента... дёргая за COM-интерфейсы со стороны клиента... и как правило, наталкиваемся на проблемы безопасности...
- делаем генерацию/публикацию Web services из полученных VFP-COM компонент. Пробуем дёрнуть с той же машины... и как правило, наталкиваемся на проблемы безопасности...
6) решаем проблемы разрешения доступа к нашим VFP-COM компонентам для внешних клиентов...

- Если из заданного вопроса, предположить, что шаги 1-5 успешно пройдены, то можно посоветовать взглянуть в системный лог на сервере,... и там всё должно быть написано, т.е. такому-то клиенту отказано в доступе по таким-то причинам... Другими словами, можно предположить, что в твоей SQL базе данных нужно завести именно того юзера, которому было отказано в доступе... если такое ещё не был заведён..., а если такой юзер всё-таки был, то дать ему соотвествующие права, возможно подрулив права и самого SQL сервера, точнее службы, которая рулит SQL сервером...
- Если же проблемы в недобросовесном выполнении пунктов 1-5... хм, то они решаются т.с. обычным порядком...


------------------
С уважением,
Михаил Дроздов, Пермь, Россия
Ratings: 0 negative/0 positive
Re: И все же SOAP - хелп, гуру WEB-сервисов...
Longinov
Автор

Сообщений: 208
Откуда: Днепропетровск
Дата регистрации: 31.10.2005
Спасибо за столь подробный ответ, буду разбираться...

С Уважением
Евгений.
Ratings: 0 negative/0 positive
Re: И все же SOAP - хелп, гуру WEB-сервисов...
OlegA

Сообщений: 536
Откуда: Иркутск
Дата регистрации: 22.06.2001
Всем добрый день, попытался также настроить приложение через веб службы. У меня есть СОМ сервер, который работает в связке с IIS, решил его зарегистрировать как WEB сервис, как в статье у Sergey Chavlytko. При следующих командах
o=CREATEOBJECT("ws_server.myClass")
o.karta_zl("044711831","15")
все работает прекрасно
при командах
osoap = CREATEOBJECT("MSSOAP.SOAPCLIENT30")
osoap.MSSoapInit("http://U-0810/Webpub/ws_server/myClass.WSDL")
osoap.karta_zl("044711831","15")
на последней команде следующая ошибка
"Client:Incorrect number of parameters supplied for SOAP request HRESULT=0x80070057: Параметр задан неверно. - Client:Unspecified client error. HRESULT=0x80070057: Параметр задан неверно"
Включил в свой объект процедуру из статьи
PROCEDURE test() AS INTEGER
RETURN (1)
ENDPROC
при команде
osoap.test()
ошибка "OLE error code:0x80020006: Неизвестное имя"

Первый вопрос: При наборе команды osoap. должны быть видны мои методы, которые я определил в com-объекте? Я их не вижу, заметил следующее если вызвать команду без параметров
o.karta_zl(), то выходит следующее сообщение
"OLE IDispatch exception code 0 from ws_server.myClass ws_server.myClass: .karta_zl c:\my_applications\ws_region\main.prg Ошибка в строке 875 Недопустимое значение, тип или число аргументов функции. 11.."
в строке 875 идет обработка входных параметров.
Не могу понять в чем причина, если не работают оба метода test() и karta_zl(), один без параметров , второй с параметрами. Операционка W2K SP4 и VFP9SP1
Ratings: 0 negative/0 positive
Re: И все же SOAP - хелп, гуру WEB-сервисов...
schavlytko

Сообщений: 67
Дата регистрации: 01.01.2005
To: OlegA

Скорее всего проблемы с доступом.

Наберите просто в Browser: U-0810
Если страница "не видна", нет доступа к ресурсу.

Если "видна", то сморите есть ли FireWall и что Вам разрешено видеть из под нее...

P.S. К сожалению я тут редкий гость, если надо что-то срочно спросить на что я могу ответить - то SQL.RU или форум на сайте, где опубликована статья - там есть специальный раздел, посвященный статье, где есть очень интересные вопросы и надеюсь, ищерпывающие ответы...

Good luck!
Ratings: 0 negative/0 positive
Re: И все же SOAP - хелп, гуру WEB-сервисов...
MichaelD

Сообщений: 7578
Дата регистрации: 14.05.2005
OlegA
Первый вопрос: При наборе команды osoap. должны быть видны мои методы, которые я определил в com-объекте? Я их не вижу,

Только перерегистрация обновлённой COM-компоненты как Web Service изменит содержимое wsdl-файла, являющегося описателем COM-интерфейса для SOAP-вызовов...


------------------
С уважением,
Михаил Дроздов, Пермь, Россия




Исправлено 1 раз(а). Последнее : MichaelD, 29.04.06 20:56
Ratings: 0 negative/0 positive
Re: И все же SOAP - хелп, гуру WEB-сервисов...
OlegA67

Сообщений: 74
Откуда: Иркутск
Дата регистрации: 08.12.2005
MichaelD
Только перерегистрация обновлённой COM-компоненты как Web Service изменит содержимое wsdl-файла, являющегося описателем COM-интерфейса для SOAP-вызовов...[/quote


внутри wsdl-файла все мои методы присутсвуют, я имел ввиду должны ли они появляться в подсказке при наборе команды
osoap.
Ну и заодно еще пару вопросов, то что мои методы выглядят так в wsdl-файле
<message name="myClass.karta_zl" />
- <message name="myClass.karta_zlResponse">
<part name="Result" type="xsd:anyType" />
</message>
это нормально ?
Второе то что следующая команда
? osa.MSSoapInit("http://10.48.224.2/Webpub/ws_server/myClass.WSDL")
возращает NULL, это нормальное явление ?
И последнее, при изменение СОМ объекта, достаточно только его перекомпилить без повторной публикации веб сервиса ?
Ratings: 0 negative/0 positive
Re: И все же SOAP - хелп, гуру WEB-сервисов...
MichaelD

Сообщений: 7578
Дата регистрации: 14.05.2005
OlegA67,

Цитата:
внутри wsdl-файла все мои методы присутсвуют, я имел ввиду должны ли они появляться в подсказке при наборе команды osoap.

Я могу и ошибаться, но с какого перепугу "средства разаработки" плезет в интеренет (после команды типа osoap.MSSoapInit("http://U-0810/Webpub/ws_server/myClass.WSDL")), чтобы подсмотреть интерфейс в wsdl-файле, раде того чтобы организовать IntelliSense для программиста... Во свяком случае, это вопрос к разработчикам "конкретной среды программирования"...

Цитата:
что мои методы выглядят так в wsdl-файле
<message name="myClass.karta_zl" />
- <message name="myClass.karta_zlResponse">
<part name="Result" type="xsd:anyType" />
</message>
это нормально ?

А как насчёт полистать документацию, C:\Program Files\MSSOAP\Documentation\soap3.chm, например, раздел "Using the Generic Type Mapper"

Цитата:
следующая команда
? osa.MSSoapInit("http://10.48.224.2/Webpub/ws_server/myClass.WSDL")
возращает NULL, это нормальное явление?

Хм... это ес-но нормально для случая, когда не удалось по каким-то причинам создать экземпляр объекта... а в чём причина, как всегда, можно получить через средства обработки ошибок выполнения...


------------------
С уважением,
Михаил Дроздов, Пермь, Россия
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 23 (Гостей: 23)

© 2000-2024 Fox Club 
Яндекс.Метрика