Опубликован: 14.11.2006 | Доступ: свободный | Студентов: 5898 / 532 | Оценка: 4.18 / 3.74 | Длительность: 16:37:00
ISBN: 978-5-9556-0085-7
Лекция 16:

Web-сервисы

< Лекция 15 || Лекция 16: 1234 || Лекция 17 >

Итак, перейдем к странице описания web-метода SayHello (просто кликните по ссылке SayHello на странице описания web-сервиса).

Как видите, на ней также присутствует название web-сервиса, ссылка на первую страницу web-сервиса, название web-метода. Кроме этого, на странице расположена кнопка Invoke, предназначенная для вызова web-метода через GET-запрос (данное правило не выполняется, если web-метод не может быть вызван таким образом), и примеры запросов для вызова данного web-метода с помощью SOAP, HTTP POST (если такой вызов возможен) и HTTP GET (если такой вызов возможен). Также представлены примеры ответов вызова 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. Посмотрим, как он помещается в SOAP:

<?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>

Это почти готовая схема xsd. Из нее можно, например, сгенерировать класс бизнес-логики.

Использовать наш сервис можно и удаленно, и из приложения, в котором он находится.

Создадим форму, которая будет отображать полученный DataSet в элементе управления GridView:

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

< Лекция 15 || Лекция 16: 1234 || Лекция 17 >
Алексей Савельев
Алексей Савельев

https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx

Денис Прокофьев
Денис Прокофьев

Везде написано, что это самый независимый и простой в использовании навигационный элемент управления, что он работает сразу с web.sitemap и не требует определения SiteMapDataSource.

Моя карта сайта состоит из двух страниц, вложенных друг в друга. asp:Menu, asp:TreeView отбображаются как ожидалось, а вот asp:SiteMapPath - нет. Он не виден нигде. Однако на его месте формируется разметка: <span id="SiteMapPath1"><a href="#SiteMapPath1_SkipLink" style="position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden;">Проход по ссылкам навигации</a><a id="SiteMapPath1_SkipLink"></a></span> - т.е. элемент отрабатывает.

В словах xHTML это выглядит так: <asp:SiteMapPath ID="SiteMapPath1" runat="server" />. Причем не важно - внутри тега form или снаружи - всегда одинаково.

Т.к. другие нав. ЭУ работают через простой источник данных без ошибок, делаю вывод - карта составлена правильно. ИД: <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

Карта: <?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/L11_1_simplePage.aspx" title="Страница 1"  description="Простая страница 1." >
    <siteMapNode url="~/L11_1SimplePage2.aspx" title="Страница 2"  description="Простая страница 2" />
  </siteMapNode>
</siteMap>

Почему так происходит? Вроде делаю все по примерам. VS Community 2015. NetFramework в проекте: v4.0.30319