Чтобы проиллюстрировать возможности класса SoapHttpClientProtocol, окончательный вариант клиентской программы использует сокеты. Сокеты позволяют отсылать как заголовки протокола передачи гипертекстовых файлов HTTP, так и сами данные в формате SOAP, а также получать ответ от Web-служб. Клиентская программа расположена в подкаталоге RawAddClient каталога SimpleWebService.
Сначала главная (main) функция программы читает файл SoapAdd.txt. Этот файл
содержит SOAP-заголовки вызываемой Web-службы. Данная функция возвращает длину
содержимого, которое фигурирует в соответствующем заголовке запроса, формируемого
методом POST протокола передачи гипертекстовых файлов HTTP.
long contentLength = 0;
StringBuilder *contentData =
BuildContent(
"SoapAdd.txt", ScontentLength);
StringBuilder *requestHeader =
Затем клиентская программа устанавливает связь с сервером, отсылает ему данные и получает от сервера ответ, который выводится на консоль.
IPEndPoint *endPoint =
new IPEndPoint(
dynamic_cast<IPAddress *>
(Dns::Resolve(httpServer)->AddressList->
get_Item(0)),
httpPort);
Socket *sock =
new Socket(
AddressFamily::Internetwork,
SocketType::Stream,
ProtocolType::Tcp);
sock->Connect(endPoint);
...
sock->Send(
header, header->Length, SocketFlags::None);
// заголовок, заголовок-> Длина
sock->Send( // Посылает
content, content->Length, SocketFlags::None);
// содержание, содержание-> Длина
...
bytes = sock->Receive( // Получить
receivedData,
receivedData->Length, // Длина
SocketFlags::None);
Console::WriteLine(
ASCII->GetString(receivedData, 0, bytes));
sock->Close();
...
Функция BuildHeader с помощью метода POST протокола передачи гипертекстовых файлов HTTP формирует стандартный запрос, дополненный заголовком SOAPAction.
StringBuilder *sb = new StringBuilder(1024);
sb->Append( // Добавить в конец
"POST /SimpleWebService/Add.asmx HTTP/1.l\r\n")
;
sb->Append("Host: localhost\r\n"); // Добавить
в конец
sb->Append( // Добавить в конец
"Content-Type: text/xml; charset=utf-8\r\n");
String *line = // Строка
String::Format("Content-Length: {0}\r\n", // Строка::
Формат
contentLength.ToString());
sb->Append(line); // Добавить в конец (строка)
sb->Append( // Добавить в конец
"SOAPAction: \"http://tempuri.org/Add\"\r\n")
;
sb->Append("\r\n");; // Добавить в конец
...
Функция BuildContent считывает в буфер содержимое файла и вычисляет размер буфера в байтах.
*contentLength = 0;
String *line; // Строка
while ((line = fileStream->ReadLine()) != 0)
{
sb->Append(line); // Добавляет в конец (строка)
sb->Append("\r\n"); // Добавляет в конец ("\r\n")
*contentLength += line->Length + 2;
// *contentLength + = строка-> Длина + 2;
}
fileStream->Close();
Данные в файле SoapAdd. txt представлены в SOAP-формате. Как и следовало ожидать, этот файл имеет вид, описанный выше. Входные параметры 9 и 3 представляются в соответствии со спецификацией WSDL.
<?xml version="l.О" 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>
<Add xmlns="http://tempuri.org/">
<x>9</x>
<y>3</y>
</Add>
</soap:Body>
</soap:Envelope>
Сначала программа формирует запрос. Для этого используется метод POST протокола передачи гипертекстовых файлов HTTP. Запрос содержит стандартные заголовки протокола передачи гипертекстовых файлов HTTP и дополнительный заголовок SOAPAction. Затем запрос кодируется согласно спецификации SOAP. Вывод программы приведен ниже:
POST /SimpleWebService/Add.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: 355
SOAPAction: "http://tempuri.org/Add"
<?xml version="l.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>
<Add xmlns="http://tempuri.org/">
<x>9</x>
<y>3</y>
</Add>
</soap:Body>
</soap:Envelope>
Затем программа записывает ответ. Ответ, снова-таки, начинается с заголовков протокола передачи гипертекстовых файлов HTTP. За ними следует возвращаемый результат, 12, закодированный в соответствии со спецификацией SOAP.
НТТР/1.1 200 ОК
Server: Microsoft-IIS/5 . О
Date: Tue, 30 Oct 2001 16:49:42 GMT
Cache-Control: private, max-age=0
Content-Type: text/xml; charset=utf-8
Content-Length: 358
<?xml version="l.0" encoding="utf-8"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XM LSchema">
<soap:Body>
<AddResponse xmlns="http://tempuri.org/">
<AddResult>12</AddResult>
</AddResponse>
</soap:Body>
</soap:Envelope>