Использование web-сервисов XML в клиентских приложениях
Клиентом web-сервиса XML может быть не только web-сайт, но и обычное приложение. Использование web-сервиса возможно при подключении ссылки на него через опцию проекта “Add Web Reference”. В результате выбора из доступных web-сервисов требуемого будут сгенерированы папки Web References\localhost внутри проекта, в которых окажутся файлы. wdsl, .disco и Reference. cs, описывающие работу с web-методами и типами данных, предоставляемыми web-сервисом. Файлы описания используют язык xml:

Файл Reference. cs вводит новое пространство имен имя_проекта. localhost, в котором определяет класс-оболочку для web-сервиса:
public partial class Service :
System. Web. Services. Protocols. SoapHttpClientProtocol
в котором задаются методы синхронного и асинхронного вызова web-методов web-сервиса.
Например, для метода HelloWorld методы его вызова будут такими:
[System. Web. Services. Protocols. SoapDocumentMethodAttribute("http://tempuri. org/HelloWorld", RequestNamespace="http://tempuri. org/", ResponseNamespace="http://tempuri. org/", Use=System. Web. Services. Description. SoapBindingUse. Literal, ParameterStyle=System. Web. Services. Protocols. SoapParameterStyle. Wrapped)]
public string HelloWorld()
{
object[] results = this. Invoke("HelloWorld", new object[0]);
return ((string)(results[0]));
}
Вызов метода web-сервиса осуществляется с помощью метода Invoke, в котором первым параметром указывается имя метода, а вторым параметром – массив типа object параметров, передаваемых web-методу. Функции асинхронного вызова работают по принципам технологии Ajax и называются как web-метод с добавлением суффикса Async, например, HelloWorldAsync.
При передаче параметров web-методу функция вызова также будет получать параметры, например, при регистрации нового пользователя:
[System. Web. Services. Protocols. SoapDocumentMethodAttribute("http://tempuri. org/Registration", RequestNamespace="http://tempuri. org/", ResponseNamespace="http://tempuri. org/", Use=System. Web. Services. Description. SoapBindingUse. Literal, ParameterStyle=System. Web. Services. Protocols. SoapParameterStyle. Wrapped)]
public bool Registration(string fam, string im, string address, string email, string login, string pass, string birth)
{
object[] results = this. Invoke("Registration", new object[] {
fam, im, address, email, login, pass, birth});
return ((bool)(results[0]));
}
Для каждого пользовательского типа данных, определенного в web-сервисе, генерируется класс с свойствами, через которые осуществлется доступ к полям класса. Например, для хранения информации о товаре будет сгенерирован класс:
public partial class InfoTovar {
private string name_catField;
private int id_bookField;
private string name_bookField;
private string authorField;
private double priceField;
public string name_cat {
get {
return this. name_catField;
}
set {
this. name_catField = value;
}
}
public int id_book {
get {
return this. id_bookField;
}
set {
this. id_bookField = value;
}
}
public string name_book {
get {
return this. name_bookField;
}
set {
this. name_bookField = value;
}
}
public string author {
get {
return this. authorField;
}
set {
this. authorField = value;
}
}
public double price {
get {
return this. priceField;
}
set {
this. priceField = value;
}
}
}
В результате для применения web-методов, предоставляемых web-сервисом, в приложении достаточно подключить новое пространство имен, которое определяется файлом Reference. cs, создать объект класса-оболочки web-сервиса и вызывать по необходимости его методы:
using System;
using System. Collections. Generic;
using ponentModel;
using System. Data;
using System. Drawing;
using System. Text;
using System. Windows. Forms;
// подключение пространства имен web-сервиса
using WindowsApplication1.localhost;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
// создание объекта web-сервиса
private Service serv = new Service();
int isAuto = 0;
// метод выбора пункта меню авторизации
private void авторизоватьсяToolStripMenuItem_Click
(object sender, EventArgs e)
{
// вызов диалога авторизации
Autorization dlg = new Autorization();
if (dlg. ShowDialog() == DialogResult. OK)
{
// чтение введенных логина и пароля
string login = dlg. Login;
string passw = dlg. Password;
// вызов web-метода авторизации с введенными даннми
if ((isAuto = serv. Autorization(login, passw))>0)
{
// сообщение об успешной авторизации
menuStrip1.Items[0].Enabled = false;
MessageBox. Show("Поздравляю! Вы авторизованы!");
}
else
{
// сообщение об ошибке при авторизации
MessageBox. Show("Вы ошиблись при авторизации");
}
}
}
. . .
}


