|
|||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||
|
Проста
web-служба
Як згадувалося
в розділі 9, безпосереднє
витягання інформації з web-страниц
— процес повільний (із-за
необхідності аналізувати всю
сторінку) і ненадійний, оскільки
структура сторінки може
змінитися. Зручним засобом
отримання таких даних з web-сайта
є web-служба (Web service). Інакше
кажучи, сайт надає
свою функціональність засобами,
з якими можна працювати
в програмах (з погляду
програміста VB сайт, на якому
працює web-служба, нагадує
компонент, який надає
свою функціональність програмі).
У .NET створення web-служб,
використовуваних в клієнтських
програмах, стає справою майже
елементарною. По суті, для цього
досить визначити клас .NET і
помітити його члени, доступні через
web-службу, атрибутом <Webmethod( )>.
Розглянемо простий приклад —
допустимий, ми створюємо web-службу для
повернення інформації про погоду.
Створіть новий
проект web-службы, для чого слід
вибрати значок ASP .NET Web Service в
діалоговому вікні New Project. Результат
показаний на мал. 12.3.
Мал. 12.3. Проект
web-службы в IDE Двічі клацніть на
дизайнерові і звернете увагу на код,
що автоматично згенерував: Public
Class Servicel Inherits System.Web.Services.WebService Клас System. Web.
Services. Webservi це є базовим для
всіх web-служб .NET. Завдяки
спадкоємству у вашому розпорядженні
опиняються всі можливості цього
класу, у тому числі і властивість Context
для отримання запиту HTTP,
використаного для звернення до
сторінки через Web. Включите
наступний фрагмент перед командою
End Class: <Webmethod()>Public Function Getweather(Byval City As String) As
String Select Case City ' Отримати інформацію про погоду в Сиеттле Case
"Seattle" Return "The
current temperature is 64 degrees. " & _ "and raining of course." Case
Else Return "Can't find data for " & City & "." End Select End
Function При натисненні клавіші
F5 VS .NET IDE автоматично генерує
web-страницу на зразок
показаної на мал. 12.4. На цій
сторінці приводиться загальна
інформація про web-службе.
Мал. 12.4. Сторінка, що
автоматично згенерувала, з описом web-службы
Використання
web-службы на стороні клієнта
Якщо клацнути
на посиланні Getweather на мал. 12.4, в
броузере завантажується сторінка,
показана на мал. 12.5. На сторінці
приведений код, який може
використовуватися для звернення до web-службе.
У розділі «SOAP» описується доступ до
служби через протокол SOAP,
заснований на XML. Цей протокол
відрізняється найбільшою гнучкістю,
але простим його не назвеш. У
простому варіанті звернення до web-службе
використовується запит HTTP GET. Прототип
виглядає таким чином: /Webservicel/servicel.asmx/ Getweather?city=string Нttр/1.1 Host:local Host
Мал. 12.5. Простий варіант
використання web-службы Введіть в
текстовому полі рядок Seattle і
натисніть кнопку Invoke. Зразковий вид
сторінки показаний на мал. 12.6.
Мал. 12.6. Результати
звернення до web-службе Результат представлений у
форматі XML, що дозволяє легко
проаналізувати дані в
програмі. Також звернете увагу на
те, що в коді, що автоматично
згенерував, показане, як звертатися
до web-службе за межами IDE.
Для цього необхідно лише згенерувати
правильний запит HTTP GET
або SOAP. Нижче приведений приклад побудови
запиту GET в консольному застосуванні,
що використовує для
відправки запиту GET класи Webrequest і
Webresponse простору імен System.Net: 1 Imports System.Net 2 Imports System.I0 3 Module
Module1 4 Sub Main() 5 Dim
myresponse As Webresponse 6
Try 7 Dim
mywebservicerequest As Webrequest 8
mywebservicerequest - Webrequest.Create _ 9 ("http://localhost/webservicel/servicel. asmx/getweather?dty=SeattIe") 10
myresponse = _ 11
mywebservicerequest.GetResponse() 12 Dim
theanswer As String 13 Dim astream As New Streamreader (myresponse.GetResponseStream) 14
theanswer =
astream.ReadToEnd 15 Msgbox(theanswer) 16 Catch
e As Exception 17 Console.WriteLine(e.Message) 18
Finally 19 myresponse. Close() 20 End
Try 21 End
Sub 22 End Module Ключова роль в цьому
лістингу належить рядку 8 (що продовжується
в рядку 9), в якій серверу
передається запит GET. Як було
показано в розділі 9, результатом
є потік даних, використовуваний
для побудови Streamreader (рядок
13). Рядок 14 читає в строкову
змінну весь текст потоку.
Рядок 19 закриває об'єкт запиту
HTTP і звільняє всі пов'язані з
ним ресурси. До речі, змінна
myresponse була оголошена в рядку 5
саме тому, що при оголошенні
її в блоці Try (рядки 6-15) змінна
виявилася б недоступною для
секції Fi nal ly. Результат виконання
програми показаний на мал. 12.7.
Мал. 12.7. Результат
звернення до web-службе з використанням запиту GET Із запитами SOAP справа
йде дещо складніше. Навряд
чи кому-небудь захочеться генерувати
їх уручну. Замість цього
можна скористатися командою
Project > Add Web Reference або утилітою
командного рядка wsdl.exe, що
входить в постачання .NET Framework. Обидва
варіанти приводять до одного
результату — генерується
допоміжний клас-посередник,
який використовується в програмі. Мабуть,
вирішення з утилітою командного
рядка відрізняється більшою
гнучкістю. Нижче показано, як
виглядав командний рядок в нашому
випадку. Хоча приведений приклад
розбитий на два рядки, його слід
ввести в одному рядку: "С:\program Fi1es\microsoft.NET\FrameworkSDK\Bin\wsdl"/language:VB" http://localhost/webservicel/servicel.asmx?wsdl При запуску з ключем /language:
VB утиліта створює файл з кодом
допоміжного класу Servicel.vb, що
за умовчанням знаходиться в одному
каталозі з wsdl.exe (вихідний каталог
задається ключем out). Основний
код класу, що
згенерував, виглядає так (ключові
рядки виділені жирним шрифтом): Option
Strict Off Option
Explicit On Imports
System Imports System.Diagnostics Imports System.Web.Services Imports System.Web.Servi
ces.Protocols Imports System.Xml.Serialization 'This source code was auto-generated by wsdl,version=l.0.2914.16. <System.Web.Servi ces.WebServi cebi ndi ngattri bute(Name:="servicelsoap". [Namespace ]:="http://tempuri,org/")> _ Public
Class Servicel Inherits System.Web.Services.Protocols.SoapHttpClientProtocol <System.Diagnostics.DebuggerStepThroughAttri
bute()> _ Public Sub New()
Mybase.New Me.Url ="http://localhost/WebServicel/Servicel.asmx" End
Sub <System.Diagnostics.DebuggerStepThroughAttri
bute(). System.Web.Services.Protocols. Soapdocumentmethodattri bute _ ("http://tempuri.org/GetWeather". Use:=system.Web.Services.Description. Soapbindinguse.Literal. Parameterstyle:=system.Web.Services. Protocols.SoapParameterStyle.Wrapped)>
_ Public Function Getweather(Byval city As String)As String Dimresults() As Object=me.Invoke ("Getweather". New Object 0 {city}) Return Ctype(results(0).
String) End
Function <System.Diagnostics. Debuggerstepthroughattribute()>
_ Public Function
Begingetweather(Byval city As String._ Byval callback As System.AsyncCallback. Byval asyncstate As Object) As System.IAsyncResult Return Me.Beginlnvoke("Getweather",
New Object() {city}.call back.asyncState) End
Function <System.Diagnostics.DebuggerStepThroughAttributet)> _ Public Function
Endgetweather(Byval asyncresult As System.IAsyncResult) As String Dim results()As Object = Me.EndInvoke(asyncresult) Return Ctype(results(0), String) End Function End Class Потім в проект
включається код класу (або посилання
на нього) і посилання на складки System. Web,
System. XML і System. Web.Services. Залишається лише
створити екземпляр
допоміжного класу і викликати
функцію Getweather! Тепер, коли ви
знаєте, як отримати результати
звернення до web-службе, неважко
уявити собі наступні
можливі кроки:
Перед
нами один з проявів тієї
концепції, яку зараз активно
упроваджує Microsoft, — Web як глобальна
мережа, через яку користувач
легко дістає доступ до будь-яким
необхідним даним.
|
|
|||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||