По поводу проблемы, когда веб-сервис, написанный на C#, вызывается из Delphi.
Прежде всего, я думаю, необходимо дать относительно подробное объяснение разработки веб-сервисов на платформе .net. Первоначальное поколение веб-сервисов появилось в среде электронной коммерции. Некоторые проблемы уже нелегко решить традиционными средствами. , например, в приложениях. Для делового общения и обмена данными больше невозможно использовать двоичные механизмы, такие как dcom и corba. Не говоря уже о том, что они ограничены соответствующими платформами. Например, dcom (модель распространения общих объектов). может выполняться только на платформе Windows, тогда как corba (брокер запросов общих объектов) архитектура) — это всего лишь продукт платформы Java. Им сложно обеспечить передачу данных между приложениями.
В этом контексте веб-сервисы появились как того требует время. Это хорошее решение для кросс-языкового, кросс-платформенного, а также хорошего и безопасного проникновения в корпоративные межсетевые экраны. Его архитектура обычно делится на пять уровней:
Передача данных по каналу http (протокол передачи гипертекста).
Форма выражения данных xml (расширяемый язык разметки)
Инкапсуляция данных мыла (протокол доступа к простым объектам)
Формат языка описания wsdl (язык описания веб-сервисов)
uddi (универсальное описание и интеграция обнаружения) унифицированное описание, открытие и интеграция
Быть кросс-языковым, кросс-платформенным, а также хорошо и безопасно проникать через корпоративные брандмауэры — этого достаточно, чтобы нас воодушевить. Однако есть и области, требующие улучшения, например:
Передача данных HTTP происходит медленно, особенно первое соединение.
Требуются дополнительные накладные расходы веб-сервера.
Поговорив об архитектуре веб-сервисов, ее преимуществах и недостатках, давайте перейдем к сути, которая на этот раз является темой нашего обсуждения:
Проблемы при вызове службы веб-сервиса из Delphi
Без лишних слов, давайте проиллюстрируем простым примером тестирования атрибута webmethod: это простой бизнес-процесс выполнения передачи от клиента a к клиенту b.
Сначала мы создаем веб-сервис в .net framework1.1. В это время .net автоматически создаст для нас веб-приложение.
Нам нужно создать класс Attributetest, который находится в пространстве имен Attributetesting. Тогда этот класс автоматически унаследует свой базовый класс system.web.services.webservice. При необходимости мы можем установить для класса веб-приложения его атрибут webservice, основные атрибуты включают описание. и пространство имен
[webserviceattribute(namespace=http://www.isdoo.com/services,
описание=привет, Ансель, это тестовый веб-сервис!)]
Тест атрибутов публичного класса: system.web.services.webservice
{
[webmethodattribute(description=Информация об описании: Наследует метод count и перегружает имя. Выполнение заключается в переводе денег от пользователя a пользователю b...,
//messagename=изменение имени сообщения,
буферный ответ = правда,
продолжительность кэширования = 1000,
активация = истина,
транзакцияoption=transactionoption.requiresnew)]
публичная строка Transmoney (двойные деньги)
{
пытаться
{
contextutil.enablecommit();//транзакция используется только для работы с базой данных!
деньгивтоа(деньги);
деньгиoutfromb(деньги);
contextutil.setcomplete();
возврат транзакции успешен, всего +money.tostring();
}
улов (исключение е)
{
contextutil.setabort();
транзакция возврата не удалась! /n/r +e.message;
}
}
Private void MoneyIntoa(двойные деньги)
{
sqlcommand sqlcom = new sqlcommand(обновление набора бюджета деньги=деньги++деньги.tostring()+ где name='a');
доступ к базе данных mydatabase = новый доступ к базе данных ();
sqlcom.connection=mydatabase.getconnection();
sqlcom.connection.open();
sqlcom.executenonquery();
sqlcom.connection.close();
//генерируем новое исключение(операция не удалась при переводе денег в систему!);
}
Private void Moneyoutfromb(двойные деньги)
{
sqlcommand sqlcom = new sqlcommand(обновление набора бюджета деньги=деньги-+деньги.tostring()+ где имя='b');
доступ к базе данных mydatabase = новый доступ к базе данных ();
sqlcom.connection=mydatabase.getconnection();
sqlcom.connection.open();
sqlcom.executenonquery();
sqlcom.connection.close();
//генерируем новое исключение(операция не удалась при переводе денег из b!);
}
}
На что нам нужно обратить особое внимание, так это на webmethodattribute, о котором мы также поговорим в этот раз. Пока вы добавляете [webmethodattribute] в метод, даже если в нем нет атрибутов, то веб-сервис. предоставит этот метод вызывающему сегменту клиента. Давайте поговорим о его 6 атрибутах ниже, включая 2 атрибута описательной информации и 4 функциональных атрибута.
Атрибуты описательной информации:
описание
имя сообщения
4 функциональных свойства:
ответ буфера
продолжительность кэширования
сессия включения
вариант транзакции
Среди них нам необходимо обратить внимание на атрибут messagename. Когда Delphi вызывает веб-сервис, разработанный на платформе .net, если вы установите атрибут messagename, при вызове клиента будет сообщено об ошибке. Возможно это ошибка, возможно в более поздней версии эту проблему решат. Что касается конкретных функций этих атрибутов, то они здесь подробно описываться не будут. Вы можете прочитать соответствующие книги.
Ниже я перечислю шаги, необходимые Delphi для вызова веб-сервиса:
Прежде всего, если вы просто разрабатываете и вызываете клиент, вам нужно всего лишь создать обычное приложение. Затем вам нужно найти элемент управления Soaphttpclient под веб-сервисами панели инструментов, а затем поместить его в тело окна клиентского приложения. ;
Во-вторых, вам необходимо установить URL-адрес атрибута или wsdl этого мылаhttpclient. Это содержимое является адресом службы вашего веб-сервиса.
Например, адрес службы в нашем текущем примере: http://localhost/attributetesting/attributetesting.asmx.
Если вы хотите ввести wsdl, то это http://localhost/attributetesting/attributetesting.asmx?wsdl.
На этом настройка управления завершена;
Затем нам нужно импортировать wsdl на стороне сервера. Вы можете сделать это вручную или использовать функцию импорта веб-сервисов, предоставляемую Delphi.
Наконец, вам нужно только вызвать импортированный интерфейс wsdl. Наш соответствующий код здесь:
процедура tform1.bitbtn1click(отправитель: объект);
вар
aa:attributetestsoap;//Это объект интерфейса класса в wsdl
сообщение: широкая строка;
бб: двойной;
начинать
//httprio2 на самом деле является так называемым прокси-классом, который отвечает за передачу данных, отправку запросов и прием ответов.
аа:=httprio2 как атрибутtestsoap;
бб:=100,00;
msg:=aa.transmoney(bb);//Это метод веб-службы, доступ к которому мы получаем при вызове веб-службы.
показать сообщение (сообщение);
конец;
ок! это все!
Популярные загрузки коммерческого исходного кода www.html.org.cn