Иллюстрированный самоучитель по Architecture .NET

Клиент web-службы, использующий необработанные данные SOAP и протокол передачи гипертекстовых файлов HTTP

Чтобы проиллюстрировать возможности класса SoapHttpClientProtocol, окончательный вариант клиентской программы использует сокеты. Сокеты позволяют отсылать как заголовки протокола передачи гипертекстовых файлов HTTP, так и сами данные в формате SOAP, а также получать ответ от Web-служб. Клиентская программа расположена в подкаталоге RawAddClient каталога SimpleWebService.

Сначала главная (main) функция программы читает файл SoapAdd.txt. Этот файл содержит SOAP-заголовки вызываемой Web-службы. Данная функция возвращает длину содержимого, которое фигурирует в соответствующем заголовке запроса, формируемого методом POST протокола передачи гипертекстовых файлов HTTP.

long contentLength = 0;
StringBuilder *contentData =
BuildContent(
"SoapAdd.txt", ScontentLength);
StringBuilder *requestHeader =
BuildHeader(contentLength);

Затем клиентская программа устанавливает связь с сервером, отсылает ему данные и получает от сервера ответ, который выводится на консоль.

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");; // Добавить в конец
…
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.