Кроме вышеперечисленных ограничений общего характера, использование cookie- файлов при работе с Web-службами характеризуется еще одним недостатком — сложностью. Сеанс связи с Web-службой можно рассматривать как последовательность определенных запросов, передаваемых между клиентом и сервером. Часто эти запросы можно рассматривать как вызовы методов с передачей параметров и последующим получением возвращаемых результатов. Использование cookie-файлов при вызове Web-служб представляет собой второй скрытый канал связи между клиентом и сервером, и это может приводить к некоторой путанице. В листинге 15.7 продемонстрирован вызов Web-службы без использования cookie-файлов, тогда как листинг 15.8 соответствует тому же примеру, в котором вместо передачи некоторых параметров используются cookie-файлы.
Листинг 15.7. Вызовы Web-служб с передачей параметров только явным образом//0. Установить связь
int sessionID = someWebService.LogOn(userCredentials);
//
//...Выполнение другого многострочного кода...
//
//1. Вызвать Web-службу и создать новый заказ
int orderID = someWebService.CreateNewOrder(sessionID, userInfo, productInfo);
//
//...Выполнение другого многострочного кода...
//
//2. Подтвердить заказ серверу
someWebService.ConfirmPayment(sessionID, orderID, paymentInfo);
//
//...Выполнение другого многострочного кода...
//
//3. Подтвердить адрес доставки
someWebService.ConfirmShipping(sessionID, orderID, shippingAddress);
//
//...Выполнение другого многострочного кода...
//
//4. Завершить оформление заказа someWebService.FinalizeOrder(sessionID, orderID);
Анализ этого кода не должен вызвать у вас особых затруднений. На шаге 1 создается новый заказ и возвращается новый идентификатор заказа (orderID), который будет использоваться в последующих вызовах. Этот номер заказа передается в каждый последующий запрос, поэтому вам должно быть ясно, что каждый из вызовов Web-служб может идентифицировать обрабатываемый заказ при помощи переданного ему параметра orderID.
Вместо использования явного параметра orderID эту информацию можно передавать Web-службе при помощи cookie-файла, хранящегося на стороне клиента. В этом случае клиентский код должен выглядеть примерно так, как показано в листинге 15.8.
Листинг 15.8. Вызов Web-служб путем неявной передачи параметров посредством cookie-файлов//0. Установить связь
//Хотя этого и не видно, с сервера будет передан клиентский cookie-файл!
int sessionID = someWebService.LogOn(userCredentials);
//1. Вызвать Web-службу и создать новый заказ
//Хотя этого и не видно, на сервер будет передан клиентский cookie-файл!
//Хотя этого и не видно, с сервера будет передан клиентский cookie-файл!
someWebService.CreateNewOrder(userInfo, productInfo);
//
//...Выполнение другого многострочного кода...
//
//2. Подтвердить заказ серверу
//Хотя этого и не видно, на сервер передается клиентский
//cookie-файл, содержащий "orderID". Лихо!
someWebService.ConfirmPayment(paymentInfo);
//
//...Выполнение другого многострочного кода...
//
//3. Подтвердить адрес доставки
//Хотя этого и не видно, на сервер передается клиентский
//cookie-файл, содержащий "orderID". Лихо!
someWebService.ConfirmShipping(shippingAddress);
//
//...Выполнение другого многострочного кода...
//
//4. Завершить оформление заказа
//Хотя этого и не видно, на сервер передается клиентский
//cookie-файл, содержащий "orderID". Лихо!
someWebService.FinalizeOrder();
Приведенный выше код довольно прост, однако, о чем говорится в комментариях, имеется и второй канал связи, скрытый от программиста. Скрытые параметры передаются в обоих направлениях между клиентом и сервером посредством cookie-файлов. Этот факт является убедительным аргументом в пользу того, чтобы не использовать cookie-файлы на стороне клиента при проектировании Web-служб. Гораздо лучше передавать все параметры, требуемые для запроса Web-службы, явным образом, чем использовать для хранения этой информации непрозрачный второй канал.
Многие платформы мобильных устройств либо вообще не поддерживают клиентские cookie-файлы, либо эта поддержка существенно отличается от той, которая предлагается программными каркасами на настольных компьютерах. В частности, в .NET Compact Framework, выполняющейся на устройствах Smartphone, Pocket PC и Windows СЕ, автоматическая передача cookie-файлов вместе с запросами Web-служб не поддерживается. Если вы хотите, чтобы некоторые cookie-файлы были переданы сервером на устройство и возвращены на сервер вместе с последующим запросом, то вы должны написать код для чтения содержимого cookie-файлов из заголовков одного из ответов HTTPWebResponse и записи содержимого cookie-файлов в заголовки последующего запроса HTTPWebRequest. Для этого в случае вызова Web-служб вы должны просмотреть и изменить прокси-код Web службы на стороне клиента, автоматически сгенерированный для вас Visual Studio .NET. Эта задача ни в коей мере не является неразрешимой, но потребует от вас выполнения дополнительной работы, к чему вы должны быть готовы. В этом и состоит важное отличие в поддержке Web-служб программными каркасами на устройствах и настольных компьютерах.