Кроме вышеперечисленных ограничений общего характера, использование cookie- файлов при работе с Web-службами характеризуется еще одним недостатком — сложностью. Сеанс связи с Web-службой можно рассматривать как последовательность определенных запросов, передаваемых между клиентом и сервером. Часто эти запросы можно рассматривать как вызовы методов с передачей параметров и последующим получением возвращаемых результатов. Использование cookie-файлов при вызове Web-служб представляет собой второй скрытый канал связи между клиентом и сервером, и это может приводить к некоторой путанице. В листинге 15.7 продемонстрирован вызов Web-службы без использования cookie-файлов, тогда как листинг 15.8 соответствует тому же примеру, в котором вместо передачи некоторых параметров используются cookie-файлы.
//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.
//0. Установить связь
//Хотя этого и не видно, с сервера будет передан клиентский cookie-файл!
int sessionID = someWebService.LogOn(userCredentials);
//1. Вызвать Web-службу и создать новый заказ