Чтение онлайн

ЖАНРЫ

Программирование мобильных устройств на платформе .NET Compact Framework
Шрифт:

Кроме вышеперечисленных ограничений общего характера, использование 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-служб программными каркасами на устройствах и настольных компьютерах.

Несмотря на тот факт, что использовать cookie-файлы на стороне клиента при создании Web-служб не рекомендуется, они могут использоваться некоторыми службами, например для хранения информации о входе пользователя в систему. Если Web- служба работает нормально, если вызывается на настольном компьютере, но ее вызовы с мобильного устройства заканчиваются непонятными сбоями, то не исключено, что виновником этих сбоев являются cookie-файлы. Если есть такая возможность, уточните у автора Web-службы, используются ли в ней cookie-файлы; это всегда проще, чем пытаться самостоятельно восстановить причину происходящего. Если получить эту информацию от автора Web-службы не удается, вы можете попытаться исследовать ситуацию эмпирически путем изменения политики обработки cookie-файлов на настольном компьютере; соответствующие изменения можно задать в обозревателе Internet Explorer, выбрав в меню Tools (Сервис) пункт Options (Свойства обозревателя) и перейдя в открывшемся диалоговом окне на вкладку Privacy (Конфиденциальность). Кроме того, если у вас есть желание окунуться в разработку низкоуровневого кода клиентов Web-служб, вы можете изучить набор клиентских cookie-файлов, возвращенный вместе с ответом HTTPWebResponse на Web-запрос. Если в зависимостях клиентских cookie-файлов имеются ошибки, то вы можете действовать трояким образом: 1) обеспечить поддержку Web-службой модели доступа, не требующей использования cookie-файлов, что неплохо сделать в любом случае, 2) создать Web-службу в виде оболочки на стороне сервера, которая играет роль посредника между мобильными устройствами и проблематичной Web-службой, или 3) написать для устройства собственный код, который явным образом осуществляет сборку cookie-файлов, возвращенных вместе с ответами любой Web-службы, и упаковывает их в последующие Web-запросы.

Первый вызов Web-службы часто характеризуется увеличенным временем задержки

Во время первого обращения мобильного приложения к Web-службе часто выполняется значительный объем дополнительной работы, что проявляется в увеличении времени задержки. При первом вызове Web-службы должна быть выполнена следующая работа:

1. Может потребоваться загрузка кода. Если XML, Web-служба, сеть и другие классы на стороне клиента еще не были загружены в память, то не исключено, что их необходимо будет загрузить и компилировать, прежде чем они смогут быть использованы для вызова Web-служб. Для этого потребуется определенное время которое может исчисляться несколькими секундами.

Поделиться с друзьями: