Использование 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.
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 как глобальная сеть, через которую пользователь легко получает доступ к любым необходимым данным.