В процессе эволюции Интернета появилась необходимость в создании распределенных приложений. Приложения, установленные на компьютере, обычно используют библиотеки, размещенные на нем. Одну библиотеку могут использовать несколько программ. Можно ли размещать аналоги библиотек в Интернете, чтобы разные сайты могли их вызывать? Оказывается, да.
Предприятия на своих страницах предоставляют разнообразную информацию. Например, со своего сайта http://www.Ford.com компания "Форд" публикует информацию о моделях и ценах. Дилер этой компании хотел бы иметь эту информацию и на своем сайте.
Web-сервисы широко используются и в Desktop, и в Интернет-приложениях. Они сами по себе являются не приложениями, а источниками данных для приложений. У них отсутствует пользовательский интерфейс. Web-сервисами необязательно пользоваться через сеть — они могут быть частью проекта, в котором используются.
Web-сервисы — это функциональность и данные, предоставляемые для использования внешними приложениями, которые работают с сервисами посредством стандартных протоколов и форматов данных. Web-сервисы полностью независимы от языка и платформы реализации. Технология Web-сервисов является краеугольным камнем программной модели Microsoft .NET.
Это дальнейшее развитие
Было предпринято несколько попыток создания языка коммуникации между разнородными системами —
Для взаимодействия с web-сервисами применяется протокол
DataSet. В то же самое время его легко изучить. Текущая версия
), заголовка ( header ) и тела ( body ). Элементы body и должны присутствовать всегда, а header необязателен. Элемент — корневой. Элемент header может содержать специфичную для данного приложения информацию. В документе, сгенерированном web-сервисом, может присутствовать элемент fault, который описывает ошибку работы.
POST /WebSite5/WebService.asmx HTTP/1.1
Host: localhost
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-
instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<HelloWorld xmlns="http://localhost/webservices" />
</soap12:Body>
</soap12:Envelope>
В ASP .NET можно легко как создать
В Интернете существует множество готовых
POST /globalweather.asmx HTTP/1.1
Host: www.webservicex.net
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.webserviceX.NET/GetWeather"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-
instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetWeather xmlns="http://www.webserviceX.NET">
<CityName>Moscow</CityName>
<CountryName>Russian</CountryName>
</GetWeather>
</soap:Body>
</soap:Envelope>
Заголовок запроса отличается от запросов, которые обычно посылают браузеры, прежде всего полем Content-Type — text/xml; а не text/html; В теле запроса находится
Сервис в ответ оправляет XML-документ:
<?xml version="1.0" encoding="utf-8" ?> <string xmlns="http://www.webserviceX.NET"> <?xml version="1.0" encoding="utf-16"?> <CurrentWeather> <Location>Moscow / Vnukovo , Russia (UUWW) 55-39N 037- 16E</Location> <Time>Aug 07, 2006 - 04:30 AM EDT / 2006.08.07 0830 UTC</Time> <Wind> from the E (080 degrees) at 11 MPH (10 KT):0</Wind> <Visibility> greater than 7 mile(s):0</Visibility> <SkyConditions> overcast</SkyConditions> <Temperature> 66 F (19 C)</Temperature> <DewPoint> 55 F (13 C)</DewPoint> <RelativeHumidity> 68%</RelativeHumidity> <Pressure> 29.85 in. Hg (1011 hPa)</Pressure> <Status>Success</Status> </CurrentWeather></string>
Чтобы сделать проект ASP .NET потребителем web-сервиса, первым делом в проекте надо создать web-ссылку на удаленный объект — web-сервис. Выберите в меню Website пункт Add Web Reference. Появится диалоговое окно.
(рис 16.1) Введите URL web-сервиса с параметром
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <appSettings> <add key="weather.webservicex.www.globalweather" value="http://www.webservicex.net/globalweather.asmx"/> </appSettings> <connectionStrings>
Чтобы определить доступные по этому адресу web-сервисы, используется алгоритм DISCO.
При этом создается файл globalweather.
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:tns="http://www.webserviceX.NET"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
targetNamespace="http://www.webserviceX.NET"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified"
targetNamespace="http://www.webserviceX.NET">
<s:element name="GetWeather">
Создание web-ссылки добавляет в конфигурационный файл еще одну запись:
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <appSettings> <add key="weather.webservicex.www.globalweather" value="http://www.webservicex.net/globalweather.asmx"/> </appSettings>
Чтобы облегчить работу с web-сервисами, используют прокси-классы. Они предоставляют разработчикам удобные функции и берут на себя преобразование их параметров в элементы XML, после чего посылают запрос web-сервису через Интернет.
Утилита поможет преобразовать его в прокси-класс:
wsdl globalweather.wsdl
Прокси-класс необходимо поместить в папку App_Code, после чего объекты этого класса можно создавать в коде любой страницы.
Программу можно запустить и удаленно:
wsdl http://www.webservicex.net/globalweather.asmx?wsdl
В созданном файле объявлен класс GlobalWeather, наследник System.Web.Services.Protocols.SoapHttpClientProtocol. Функции этого класса предназначены как для синхронного, так и для асинхронного вызова. Например, синхронная функция GetWeather запрашивает строковые параметры с названием города и страны и возвращает строку с XML-документом. В сервисе есть и другая функция, с помощью которой можно узнать доступные города для каждой страны:
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http:/
/www.webserviceX.NET/GetWeather",
RequestNamespace="http://www.webserviceX.NET",
ResponseNamespace="http://www.webserviceX.NET",
Use=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wr
apped)]
public string GetWeather(string CityName, string CountryName)
{
object[] results = this.Invoke("GetWeather", new object[]
{
CityName,
CountryName});
return ((string)(results[0]));
}
Это текст можно использовать на странице:
<form id="form1" runat="server">
<br />
<asp:Button ID="Button1" runat="server" Text="А теперь про-
гноз погоды" OnClick="Button1_Click" />
<br />
<br />
<asp:Label ID="lblTemp" runat="server" Text="Температура в
Москве "></asp:Label>
</form>
protected void Button1_Click(object sender, EventArgs e)
{
// создание экземпляра прокси-класса
GlobalWeather gw = new GlobalWeather();
// запрос функции web-сервиса
string xmlstring = gw.GetWeather("Moscow", "Russia");
XmlDocument doc = new XmlDocument();
// загрузка ответа в документ
doc.LoadXml(xmlstring);
// doc.ChildNodes.Item(0) — это XML-заголовок
// doc.ChildNodes.Item(1) — тело
XmlNode child = doc.ChildNodes.Item(1);
XmlElement el = child["Temperature"];
lblTemp.Text += el.InnerText;
}
Создание web-сервиса немногим отличается от создания обычной страницы. Есть два варианта: можно создать отдельный проект или вставить web-сервис в существующий проект. В первом случае другие проекты должны создавать web-ссылку, чтобы обращаться к сервисам этого проекта. Файл web-сервиса имеет расширение asmx. Файл web-сервиса должен начинаться с директивы WebService. Класс web-сервиса может быть потомком класса System.Web.Services.WebService.
Если при объявлении web-сервиса вы породили его от класса System.Web.Services.WebService, то вы автоматически получаете доступ к глобальным объектам приложения ASP .NET Application, Context, Session, Server и User. Если же вы создавали класс web-сервиса как-то иначе — ничего страшного. Вы все равно можете получить доступ к вышеперечисленным свойствам с помощью соответствующих свойств статического HttpContext.Current.
Методы, которые сервис предоставляет для вызова с помощью WebMethod. У атрибута WebMethod существует 6 свойств, влияющих на работу метода.
Создадим новое приложение в VS .NET и добавим к нему файл web-сервиса Customers.asmx.
Файл nw.asmx содержит единственную строку — директиву WebService, которая утверждает, что этот файл — web-сервис. Этот файл меняться не будет:
<%@ WebService Language="C#" CodeBehind="~/App_Code/Customers.cs" Class=" Customers " %>
У директивы WebService всего 4 возможных атрибута. CodeBehind, который раньше был атрибутом у директивы Page, определяет физический путь к файлу отделенного кода. Атрибут Class обязателен и определяет класс, который реализует функциональность web-сервиса. Debug и Language аналогичны тем же атрибутам директивы Page:
Файл с расширением .asmx — точка входа создаваемого web-сервиса.
Класс System.Web.Services.WebService, который обычно наследует класс сервиса, предоставляет доступ к глобальным объектам Application и .
Весь код web-сервиса будет располагаться в codebehind-файле Service.asmx.cs. Изначально этот файл (созданный в Visual Studio .NET) имеет следующий вид:
<%Class="WebService" %>
using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
/// <summary>
/// Summary description for WebService
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class MyWebService : System.Web.Services.WebService {
public WebService () {
//Uncomment the following line if using designed compo-
nents
//InitializeComponent();
}
[WebMethod]
public string HelloWorld() {
return "Hello World";
}
}
Атрибут WebServiceBinding удостоверяет соответствие откликов web-сервиса WS-I Basic Profile 1.0 release требованиям организации WS-I (Web Services
Метод HelloWorld создан Visual Studio в качестве примера начинающим разработчикам.
Web-сервис может состоять из множества классов. Однако только один класс в web-сервисе может иметь методы, помеченные атрибутом WebMethod (которые можно вызывать через
Когда страница web-сервиса запрашивается в браузере, он возвращает автоматически генерируемую страницу помощи по данному сервису. Откроем в браузере страницу WebService.asmx. В браузере появится страница:
(рис 16.2) ASP .NET для отображения web-сервиса использует файл шаблона DefaultWsdlHelpGenerator.aspx, расположенный в папке <%SYSTEM_ROOT%\Microsoft.NET\Framework\<version>\CONFIG. На выводимой странице web-сервиса есть название web-сервиса, ссылка на описание сервиса и список web-методов, объявленных в web-сервисе. Остальная часть страницы посвящена тому, что необходимо изменить пространство имен по умолчанию для web-сервиса http://tempuri.org/ на собственное. Поступим как рекомендуют — изменим параметр Namespace атрибута WebService класса web- сервиса:
[WebService(Namespace = "http://Lection-16.asp2.intuit.org/")]
Кроме того, в атрибуте WebService можно задать свойства Name и Description, и они появятся на странице помощи по web-сервису.
Итак, перейдем к странице описания web-метода SayHello (просто кликните по ссылке SayHello на странице описания web-сервиса).
Как видите, на ней также присутствует название web-сервиса, ссылка на первую страницу web-сервиса, название web-метода. Кроме этого, на странице расположена кнопка Invoke, предназначенная для вызова web-метода через GET-запрос (данное правило не выполняется, если web-метод не может быть вызван таким образом), и примеры запросов для вызова данного web-метода с помощью
Протестируем нашу работу с помощью страницы web-сервиса:
<?xml version="1.0" encoding="utf-8" ?> <string xmlns="http://localhost/webservices">Hello World</string>
От такого web-сервиса нет особенной пользы, поэтому создадим новый сервис nw и вместо метода HelloWorld напишем метод, который обращается к базе данных Northwind и возвращает DataSet:
[WebService(Name="Northwind web service", Description = "Web-сер-
вис для работы с клиентами",
Namespace = "http://intuit.asp2.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class nw : System.Web.Services.WebService
{
public nw()
{
}
string strConn = @"Data Source=.\SQLExpress;Initial
Catalog=Northwind;Integrated Security=True";
[WebMethod(MessageName = "Get Orders of Customers", Description
= "Web-метод для работы с заказами", CacheDuration = 600)]
public DataSet GetCustOrders(string CustomerID)
{
SqlConnection myConn = new SqlConnection(strConn);
SqlDataAdapter myData = new
SqlDataAdapter("CustOrdersOrdersDetails", myConn);
myData.SelectCommand.CommandType =
CommandType.StoredProcedure;
myData.SelectCommand.Parameters.Add(new
SqlParameter("@CustomerID", SqlDbType.Char, 5));
myData.SelectCommand.Parameters["@CustomerID"].Value =
CustomerID;
DataSet ds = new DataSet();
myData.Fill(ds);
ds.Tables[0].TableName = "Orders";
ds.Tables[1].TableName = "OrderDetails";
ds.Relations.Add(ds.Tables[0].Columns["OrderID"],
ds.Tables[1].Columns["OrderID"]);
return ds;
}
Другие аргументы атрибуты WebMethod:
1. CacheDuration определяет промежуток времени в секундах, на которое кэшируется web-сервис. По умолчанию равно 0, что значит, что кэширование отключено.
В этом объявлении значение, возвращаемое методом GetCustOrders, кэшируется на 10 минут.
2. Description — описание метода, которое выводится на странице сервиса под ссылкой на страницу метода.
3. EnableSession позволяет включить поддержку сессий. По умолчанию поддержка сессий в web-сервисах отключена. Чтобы включить ее, определите web-метод следующим образом:
[WebMethod(EnableSession=true)]
4. MessageName определяет уникальное имя метода. Позволяет использовать
5. TransactionOption управляет поддержкой транзакций. По умолчанию она отключена. Web-сервисы ограниченно поддерживают транзакции, то есть веб-сервис может порождать транзакцию, но при этом не может быть участником другой транзакции. Возможные значения аргумента — Disabled, NotSupported, Supported, Required, и RequiresNew. Если вызывается web-метод с TransactionOption, установленным в Required или RequiresNew, а в нем вызывается другой web-метод с такими же установками, каждый из этих методов инициирует свою транзакцию.
Метод GetCustOrders возвращает тип DataSet. Посмотрим, как он помещается в
<?xml version="1.0" encoding="utf-8" ?> - <DataSet xmlns="http://intuit.asp2.org/"> - <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> - <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> - <xs:complexType> - <xs:choice minOccurs="0" maxOccurs="unbounded"> - <xs:element name="Orders"> - <xs:complexType> - <xs:sequence> <xs:element name="OrderID" type="xs:int" minOccurs="0" /> <xs:element name="OrderDate" type="xs:dateTime" minOccurs="0" /> <xs:element name="RequiredDate" type="xs:dateTime" minOccurs="0" /> <xs:element name="ShippedDate" type="xs:dateTime" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> ... <xs:selector xpath=".//OrderDetails" /> <xs:field xpath="OrderID" /> </xs:keyref> </xs:element> </xs:schema> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msda- ta" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" /> </DataSet>
Это почти готовая схема
Использовать наш сервис можно и удаленно, и из приложения, в котором он находится.
Создадим форму, которая будет отображать полученный DataSet в элементе управления :
<form id="form1" runat="server">
<div>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString
%>"
SelectCommand="SELECT CustomerID, CompanyName FROM
Customers Order by CompanyName"
ProviderName="<%$
ConnectionStrings:NorthwindConnectionString.ProviderName
%>"></asp:SqlDataSource>
<asp:DropDownList ID="DropDownList1" runat="server"
DataSourceID="SqlDataSource1"
DataTextField="CompanyName" DataValueField="CustomerID">
</asp:DropDownList></div>
<asp:Button ID="Button1" runat="server" Text="Get Orders" />
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
</form>
Имя компании выбирается из выпадающего списка. После нажатия на кнопку вызывается обработчик:
protected void Button1_Click(object sender, EventArgs e)
{
localhost.Northwindwebservice orders = new
localhost.Northwindwebservice();
GridView1.DataSource =
orders.GetCustOrders(DropDownList1.SelectedValue);
GridView1.DataBind();
}
Стать потребителем этого сервиса могло бы и обычное Windows-приложение, написанное на C++, C# или Visual Basic. Web-сервисы тоже могут пользоваться услугами других web-сервисов.
Эта лекция затронула основы создания и потребления web-сервисов ASP .NET. Web-сервисы помогают обмену данными между фирмами и в локальных сетях, независимо от операционной системы.
В процессе эволюции Интернета появилась необходимость в создании распределенных приложений. Приложения, установленные на компьютере, обычно используют библиотеки, размещенные на нем. Одну библиотеку могут использовать несколько программ. Можно ли размещать аналоги библиотек в Интернете, чтобы разные сайты могли их вызывать? Оказывается, да.
Предприятия на своих страницах предоставляют разнообразную информацию. Например, со своего сайта http://www.Ford.com компания "Форд" публикует информацию о моделях и ценах. Дилер этой компании хотел бы иметь эту информацию и на своем сайте.
Web-сервисы широко используются и в Desktop, и в Интернет-приложениях. Они сами по себе являются не приложениями, а источниками данных для приложений. У них отсутствует пользовательский интерфейс. Web-сервисами необязательно пользоваться через сеть — они могут быть частью проекта, в котором используются.
Web-сервисы — это функциональность и данные, предоставляемые для использования внешними приложениями, которые работают с сервисами посредством стандартных протоколов и форматов данных. Web-сервисы полностью независимы от языка и платформы реализации. Технология Web-сервисов является краеугольным камнем программной модели Microsoft .NET.
Это дальнейшее развитие
Было предпринято несколько попыток создания языка коммуникации между разнородными системами —
Для взаимодействия с web-сервисами применяется протокол
DataSet. В то же самое время его легко изучить. Текущая версия
), заголовка ( header ) и тела ( body ). Элементы body и должны присутствовать всегда, а header необязателен. Элемент — корневой. Элемент header может содержать специфичную для данного приложения информацию. В документе, сгенерированном web-сервисом, может присутствовать элемент fault, который описывает ошибку работы.
POST /WebSite5/WebService.asmx HTTP/1.1
Host: localhost
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-
instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<HelloWorld xmlns="http://localhost/webservices" />
</soap12:Body>
</soap12:Envelope>
В ASP .NET можно легко как создать
В Интернете существует множество готовых
POST /globalweather.asmx HTTP/1.1
Host: www.webservicex.net
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.webserviceX.NET/GetWeather"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-
instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetWeather xmlns="http://www.webserviceX.NET">
<CityName>Moscow</CityName>
<CountryName>Russian</CountryName>
</GetWeather>
</soap:Body>
</soap:Envelope>
Заголовок запроса отличается от запросов, которые обычно посылают браузеры, прежде всего полем Content-Type — text/xml; а не text/html; В теле запроса находится
Сервис в ответ оправляет XML-документ:
<?xml version="1.0" encoding="utf-8" ?> <string xmlns="http://www.webserviceX.NET"> <?xml version="1.0" encoding="utf-16"?> <CurrentWeather> <Location>Moscow / Vnukovo , Russia (UUWW) 55-39N 037- 16E</Location> <Time>Aug 07, 2006 - 04:30 AM EDT / 2006.08.07 0830 UTC</Time> <Wind> from the E (080 degrees) at 11 MPH (10 KT):0</Wind> <Visibility> greater than 7 mile(s):0</Visibility> <SkyConditions> overcast</SkyConditions> <Temperature> 66 F (19 C)</Temperature> <DewPoint> 55 F (13 C)</DewPoint> <RelativeHumidity> 68%</RelativeHumidity> <Pressure> 29.85 in. Hg (1011 hPa)</Pressure> <Status>Success</Status> </CurrentWeather></string>
Чтобы сделать проект ASP .NET потребителем web-сервиса, первым делом в проекте надо создать web-ссылку на удаленный объект — web-сервис. Выберите в меню Website пункт Add Web Reference. Появится диалоговое окно.
(рис 16.1) Введите URL web-сервиса с параметром
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <appSettings> <add key="weather.webservicex.www.globalweather" value="http://www.webservicex.net/globalweather.asmx"/> </appSettings> <connectionStrings>
Чтобы определить доступные по этому адресу web-сервисы, используется алгоритм DISCO.
При этом создается файл globalweather.
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:tns="http://www.webserviceX.NET"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
targetNamespace="http://www.webserviceX.NET"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified"
targetNamespace="http://www.webserviceX.NET">
<s:element name="GetWeather">
Создание web-ссылки добавляет в конфигурационный файл еще одну запись:
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <appSettings> <add key="weather.webservicex.www.globalweather" value="http://www.webservicex.net/globalweather.asmx"/> </appSettings>
Чтобы облегчить работу с web-сервисами, используют прокси-классы. Они предоставляют разработчикам удобные функции и берут на себя преобразование их параметров в элементы XML, после чего посылают запрос web-сервису через Интернет.
Утилита поможет преобразовать его в прокси-класс:
wsdl globalweather.wsdl
Прокси-класс необходимо поместить в папку App_Code, после чего объекты этого класса можно создавать в коде любой страницы.
Программу можно запустить и удаленно:
wsdl http://www.webservicex.net/globalweather.asmx?wsdl
В созданном файле объявлен класс GlobalWeather, наследник System.Web.Services.Protocols.SoapHttpClientProtocol. Функции этого класса предназначены как для синхронного, так и для асинхронного вызова. Например, синхронная функция GetWeather запрашивает строковые параметры с названием города и страны и возвращает строку с XML-документом. В сервисе есть и другая функция, с помощью которой можно узнать доступные города для каждой страны:
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http:/
/www.webserviceX.NET/GetWeather",
RequestNamespace="http://www.webserviceX.NET",
ResponseNamespace="http://www.webserviceX.NET",
Use=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wr
apped)]
public string GetWeather(string CityName, string CountryName)
{
object[] results = this.Invoke("GetWeather", new object[]
{
CityName,
CountryName});
return ((string)(results[0]));
}
Это текст можно использовать на странице:
<form id="form1" runat="server">
<br />
<asp:Button ID="Button1" runat="server" Text="А теперь про-
гноз погоды" OnClick="Button1_Click" />
<br />
<br />
<asp:Label ID="lblTemp" runat="server" Text="Температура в
Москве "></asp:Label>
</form>
protected void Button1_Click(object sender, EventArgs e)
{
// создание экземпляра прокси-класса
GlobalWeather gw = new GlobalWeather();
// запрос функции web-сервиса
string xmlstring = gw.GetWeather("Moscow", "Russia");
XmlDocument doc = new XmlDocument();
// загрузка ответа в документ
doc.LoadXml(xmlstring);
// doc.ChildNodes.Item(0) — это XML-заголовок
// doc.ChildNodes.Item(1) — тело
XmlNode child = doc.ChildNodes.Item(1);
XmlElement el = child["Temperature"];
lblTemp.Text += el.InnerText;
}
Создание web-сервиса немногим отличается от создания обычной страницы. Есть два варианта: можно создать отдельный проект или вставить web-сервис в существующий проект. В первом случае другие проекты должны создавать web-ссылку, чтобы обращаться к сервисам этого проекта. Файл web-сервиса имеет расширение asmx. Файл web-сервиса должен начинаться с директивы WebService. Класс web-сервиса может быть потомком класса System.Web.Services.WebService.
Если при объявлении web-сервиса вы породили его от класса System.Web.Services.WebService, то вы автоматически получаете доступ к глобальным объектам приложения ASP .NET Application, Context, Session, Server и User. Если же вы создавали класс web-сервиса как-то иначе — ничего страшного. Вы все равно можете получить доступ к вышеперечисленным свойствам с помощью соответствующих свойств статического HttpContext.Current.
Методы, которые сервис предоставляет для вызова с помощью WebMethod. У атрибута WebMethod существует 6 свойств, влияющих на работу метода.
Создадим новое приложение в VS .NET и добавим к нему файл web-сервиса Customers.asmx.
Файл nw.asmx содержит единственную строку — директиву WebService, которая утверждает, что этот файл — web-сервис. Этот файл меняться не будет:
<%@ WebService Language="C#" CodeBehind="~/App_Code/Customers.cs" Class=" Customers " %>
У директивы WebService всего 4 возможных атрибута. CodeBehind, который раньше был атрибутом у директивы Page, определяет физический путь к файлу отделенного кода. Атрибут Class обязателен и определяет класс, который реализует функциональность web-сервиса. Debug и Language аналогичны тем же атрибутам директивы Page:
Файл с расширением .asmx — точка входа создаваемого web-сервиса.
Класс System.Web.Services.WebService, который обычно наследует класс сервиса, предоставляет доступ к глобальным объектам Application и .
Весь код web-сервиса будет располагаться в codebehind-файле Service.asmx.cs. Изначально этот файл (созданный в Visual Studio .NET) имеет следующий вид:
<%Class="WebService" %>
using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
/// <summary>
/// Summary description for WebService
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class MyWebService : System.Web.Services.WebService {
public WebService () {
//Uncomment the following line if using designed compo-
nents
//InitializeComponent();
}
[WebMethod]
public string HelloWorld() {
return "Hello World";
}
}
Атрибут WebServiceBinding удостоверяет соответствие откликов web-сервиса WS-I Basic Profile 1.0 release требованиям организации WS-I (Web Services
Метод HelloWorld создан Visual Studio в качестве примера начинающим разработчикам.
Web-сервис может состоять из множества классов. Однако только один класс в web-сервисе может иметь методы, помеченные атрибутом WebMethod (которые можно вызывать через
Когда страница web-сервиса запрашивается в браузере, он возвращает автоматически генерируемую страницу помощи по данному сервису. Откроем в браузере страницу WebService.asmx. В браузере появится страница:
(рис 16.2) ASP .NET для отображения web-сервиса использует файл шаблона DefaultWsdlHelpGenerator.aspx, расположенный в папке <%SYSTEM_ROOT%\Microsoft.NET\Framework\<version>\CONFIG. На выводимой странице web-сервиса есть название web-сервиса, ссылка на описание сервиса и список web-методов, объявленных в web-сервисе. Остальная часть страницы посвящена тому, что необходимо изменить пространство имен по умолчанию для web-сервиса http://tempuri.org/ на собственное. Поступим как рекомендуют — изменим параметр Namespace атрибута WebService класса web- сервиса:
[WebService(Namespace = "http://Lection-16.asp2.intuit.org/")]
Кроме того, в атрибуте WebService можно задать свойства Name и Description, и они появятся на странице помощи по web-сервису.
Итак, перейдем к странице описания web-метода SayHello (просто кликните по ссылке SayHello на странице описания web-сервиса).
Как видите, на ней также присутствует название web-сервиса, ссылка на первую страницу web-сервиса, название web-метода. Кроме этого, на странице расположена кнопка Invoke, предназначенная для вызова web-метода через GET-запрос (данное правило не выполняется, если web-метод не может быть вызван таким образом), и примеры запросов для вызова данного web-метода с помощью
Протестируем нашу работу с помощью страницы web-сервиса:
<?xml version="1.0" encoding="utf-8" ?> <string xmlns="http://localhost/webservices">Hello World</string>
От такого web-сервиса нет особенной пользы, поэтому создадим новый сервис nw и вместо метода HelloWorld напишем метод, который обращается к базе данных Northwind и возвращает DataSet:
[WebService(Name="Northwind web service", Description = "Web-сер-
вис для работы с клиентами",
Namespace = "http://intuit.asp2.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class nw : System.Web.Services.WebService
{
public nw()
{
}
string strConn = @"Data Source=.\SQLExpress;Initial
Catalog=Northwind;Integrated Security=True";
[WebMethod(MessageName = "Get Orders of Customers", Description
= "Web-метод для работы с заказами", CacheDuration = 600)]
public DataSet GetCustOrders(string CustomerID)
{
SqlConnection myConn = new SqlConnection(strConn);
SqlDataAdapter myData = new
SqlDataAdapter("CustOrdersOrdersDetails", myConn);
myData.SelectCommand.CommandType =
CommandType.StoredProcedure;
myData.SelectCommand.Parameters.Add(new
SqlParameter("@CustomerID", SqlDbType.Char, 5));
myData.SelectCommand.Parameters["@CustomerID"].Value =
CustomerID;
DataSet ds = new DataSet();
myData.Fill(ds);
ds.Tables[0].TableName = "Orders";
ds.Tables[1].TableName = "OrderDetails";
ds.Relations.Add(ds.Tables[0].Columns["OrderID"],
ds.Tables[1].Columns["OrderID"]);
return ds;
}
Другие аргументы атрибуты WebMethod:
1. CacheDuration определяет промежуток времени в секундах, на которое кэшируется web-сервис. По умолчанию равно 0, что значит, что кэширование отключено.
В этом объявлении значение, возвращаемое методом GetCustOrders, кэшируется на 10 минут.
2. Description — описание метода, которое выводится на странице сервиса под ссылкой на страницу метода.
3. EnableSession позволяет включить поддержку сессий. По умолчанию поддержка сессий в web-сервисах отключена. Чтобы включить ее, определите web-метод следующим образом:
[WebMethod(EnableSession=true)]
4. MessageName определяет уникальное имя метода. Позволяет использовать
5. TransactionOption управляет поддержкой транзакций. По умолчанию она отключена. Web-сервисы ограниченно поддерживают транзакции, то есть веб-сервис может порождать транзакцию, но при этом не может быть участником другой транзакции. Возможные значения аргумента — Disabled, NotSupported, Supported, Required, и RequiresNew. Если вызывается web-метод с TransactionOption, установленным в Required или RequiresNew, а в нем вызывается другой web-метод с такими же установками, каждый из этих методов инициирует свою транзакцию.
Метод GetCustOrders возвращает тип DataSet. Посмотрим, как он помещается в
<?xml version="1.0" encoding="utf-8" ?> - <DataSet xmlns="http://intuit.asp2.org/"> - <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> - <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> - <xs:complexType> - <xs:choice minOccurs="0" maxOccurs="unbounded"> - <xs:element name="Orders"> - <xs:complexType> - <xs:sequence> <xs:element name="OrderID" type="xs:int" minOccurs="0" /> <xs:element name="OrderDate" type="xs:dateTime" minOccurs="0" /> <xs:element name="RequiredDate" type="xs:dateTime" minOccurs="0" /> <xs:element name="ShippedDate" type="xs:dateTime" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> ... <xs:selector xpath=".//OrderDetails" /> <xs:field xpath="OrderID" /> </xs:keyref> </xs:element> </xs:schema> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msda- ta" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" /> </DataSet>
Это почти готовая схема
Использовать наш сервис можно и удаленно, и из приложения, в котором он находится.
Создадим форму, которая будет отображать полученный DataSet в элементе управления :
<form id="form1" runat="server">
<div>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString
%>"
SelectCommand="SELECT CustomerID, CompanyName FROM
Customers Order by CompanyName"
ProviderName="<%$
ConnectionStrings:NorthwindConnectionString.ProviderName
%>"></asp:SqlDataSource>
<asp:DropDownList ID="DropDownList1" runat="server"
DataSourceID="SqlDataSource1"
DataTextField="CompanyName" DataValueField="CustomerID">
</asp:DropDownList></div>
<asp:Button ID="Button1" runat="server" Text="Get Orders" />
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
</form>
Имя компании выбирается из выпадающего списка. После нажатия на кнопку вызывается обработчик:
protected void Button1_Click(object sender, EventArgs e)
{
localhost.Northwindwebservice orders = new
localhost.Northwindwebservice();
GridView1.DataSource =
orders.GetCustOrders(DropDownList1.SelectedValue);
GridView1.DataBind();
}
Стать потребителем этого сервиса могло бы и обычное Windows-приложение, написанное на C++, C# или Visual Basic. Web-сервисы тоже могут пользоваться услугами других web-сервисов.
Эта лекция затронула основы создания и потребления web-сервисов ASP .NET. Web-сервисы помогают обмену данными между фирмами и в локальных сетях, независимо от операционной системы.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.