Службы Web создают, либо помещая код прямо в файлы .asmx
, либо, ссылаясь на классы службы Web из этих файлов. Как и со страницами ASP.NET, создание службы Web в VS.NET применяет последний подход, и он также будет использоваться для целей демонстрации.

Создание проекта службы Web, называемой PCSWebSrv1
, как показано выше, приводит, как и для проекта приложения Web, к аналогичному множеству созданных файлов. Фактически, единственное различие состоит в том, что вместо создания файла с именем WebForm1.aspx
создается файл с именем Service1.asmx
. Созданный файл .vsdisco
отвечает за идентификацию службы Web, чтобы система Visual Studio .NET, как мы вскоре увидим, могла добавить на него ссылку Web.
Код в Service1.asmx
не доступен непосредственно через VS.NET, но просмотр с помощью Notepad показывает следующую строку кода:
<%@ WebService Language='c#' Codebehind='Service1.asmx.cs' Class='PCSWebSrv1.Service1' %>
Этот код ссылается на файл кода, который можно увидеть в VS.NET, — Service1.asmx.cs
, доступный при щелчке правой кнопкой мыши на Service1.asmx
в Solution Explorer и выборе View Code. Созданный код с удаленными для краткости комментариями показан ниже:
namespace PCSWebSrv1 {
using system;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
public class Service1 : System.Web.Services.WebService {
public Service1() {
InitializeComponent();
}
private void InitializeComponent() {
}
public override void Dispose() {
}
}
}
Этот код определяет пространство имен PCSWebSrv1
с несколькими ссылками на стандартные пространства имен и класс службы Web с именем Service1
(ссылку на который мы видели выше в файле Service1.asmx
), производный от System.Web.Services.WebService
. Мы должны предоставить методы для этого класса службы Web.
Добавление метода, доступного через службу Web, требует простого определения метода как public
и задание для него атрибута WebMethod
. Этот атрибут помечает методы, которые мы хотим сделать доступными. Вскоре мы рассмотрим типы данных, которые можно использовать для возвращаемого типа и для параметров, но пока добавим следующий метод:
[WebMethod]
public String CanWeFixIt() {
return 'Yes we can!';
}
и откомпилируем метод.
Можно проверить, как это будет работать, направляя браузер Web на файл Service1.asmx
:

Щелчок на имени метода предоставляет нам информацию о запросе и ответе SOAP, а также примеры того, как запрос и ответ будут выглядеть с помощью методов HTTP GET и HTTP POST. Можно также протестировать метод, нажимая на предоставленную кнопку Invoke (если метод требует простых параметров, их также можно ввести в этой форме). Если сделать это, мы увидим код XML, возвращаемый вызовом метода:
<?xml version='1.0' ?>
<string xmlns='http://tempuri.org/'>Yes we can!</string>
Это показывает, что метод работает прекрасно.
Следование по ссылке Service Description, показанной на экране браузера выше, позволяет увидеть описание WSDL службы Web. Наиболее важной частью, имеющей к нам отношение, является описание типов элементов для запросов и ответов:
<types>
<s:schema attributeFormDefault='qualified' elementFormPefault='qualified'
targetNamespace='http://tempuri.org/'>
<s:element name='CanWeFixIt'>
<s:complexType />
</s:element>
<s:element name='CanWeFixItResponse'>
<s:complexType>
<s:sequence>
<s:element name='CanWeFixItResult' nullable='true' type='s:string' />
</s:sequence>
</s:complexType>
</s:element>
<s:element name='string' nullable='true' type='s:string' />
</s:schema>
</types>
Это описание содержит также описание типов данных, требуемых для запросов и ответов, а также различных соединений для службы, делая его достаточно длинным файлом.
Типы данных, доступные для служб Web
Службы Web могут использоваться для обмена любыми из следующих типов данных:
String Char Byte
Boolean Int16 Int32
Int64 UInt16 UInt32
UInt64 Single Double
Guid Decimal DateTime
XmlQualifiedName class struct
XmlNode DataSet