Книга: Программирование мобильных устройств на платформе .NET Compact Framework
Листинг 15.11. Код для загрузки файла с Web-сервера
Листинг 15.11. Код для загрузки файла с Web-сервера
//-----------------------------------------------------------
//Осуществляет синхронную загрузку файла с Web-сервера
//и сохраняет его в локальной файловой системе
// [in] httpWhereFrom: URL-адрес файла
// (например, "http://someserver/somefile.jpg")
// [in] filenameWhereTo: Место, куда необходимо записать файл
// (например, "localfile.jpg")
//-----------------------------------------------------------
public void downloadFileToLocalStore(string httpWhereFrom, string filenameWhereTo) {
System.IO.FileStream myFileStream = null;
System.IO.Stream myHTTPResponseStream = null;
System.Net.WebRequest myWebRequest = null;
System.Net.WebResponse myWebResponse = null;
//Если файл, который мы хотим записать, уже существует, удалить его
if (System.IO.File.Exists(filenameWhereTo) == true) {
System.IO.File.Delete(filenameWhereTo);
}
try {
//Создать Web-запрос
myWebRequest = System.Net.HttpWebRequest.Create(httpWhereFrom);
//Получить ответ
myWebResponse = myWebRequest.GetResponse();
//Получить поток для ответа
myHTTPResponseStream = myWebResponse.GetResponseStream();
//Создать локальный файл, в который необходимо направить поток ответа
myFileStream = System.IO.File.OpenWrite(filenameWhereTo);
//Этот размер буфера является настраиваемым
const int buffer_length = 4000;
byte [] byteBuffer = new byte[buffer_length];
int bytesIn;
//Считать файл и направить поток данных в локальный файл
do {
//Считать данные
bytesIn = myHTTPResponseStream.Read(byteBuffer, 0, buffer_length);
//Записать данные
if (bytesIn != 0) {
myFileStream.Write(byteBuffer, 0, bytesIn);
}
} while (bytesIn != 0);
} catch (Exception myException) //Сбой при загрузке!
{
//Что-то случилось. Освободить ресурс
attemptCleanup_ThrowNoExceptions(myFileStream, myHTTPResponseStream, myWebResponse);
//Теперь, когда ресурс освобожден, повторно сгенерируем исключение,
//чтобы сообщить приложению о том, что произошел сбой!
throw myException;
}
//Загрузка прошла успешно!
//Закрыть все ресурсы
try {
//Стандартная процедура закрытия ресурсов
myFileStream.Close();
myFileStream = null;
myHTTPResponseStream.Close();
myHTTPResponseStream = null;
myWebResponse.Close();
myWebResponse = null;
} catch (Exception myException) //Сбой в процессе закрытия ресурса!
{
//Что-то случилось. Освободить ресурс
attemptCleanup_ThrowNoExceptions(myFileStream, myHTTPResponseStream, myWebResponse);
//Теперь, когда ресурс освобожден, повторно сгенерируем исключение,
//чтобы сообщить приложению о том, что произошел сбой!
throw myException;
}
//Успешное выполнение!
}
//----------------------------------------------
//Пытается закрыть и освободить все объекты
//Перехватывает любое вырабатываемое исключение.
//----------------------------------------------
void attemptCleanup_ThrowNoExceptions(
System.IO.FileStream myFileStream,
System.IO.Stream myHTTPResponseStream,
System.Net.WebResponse myWebResponse) {
if (myFileStream != null) {
try {
myFileStream.Close();
} catch {} //He выполнять никаких действий.
}
if (myHTTPResponseStream != null) {
try {
myHTTPResponseStream.Close();
} catch {} //He выполнять никаких действий.
}
if (myWebResponse != null) {
try {
myWebResponse.Close();
} catch {} //He выполнять никаких действий.
}
} //конец функции
- Требуются различные варианты поддержки cookie-файлов
- Листинг 15.7. Вызовы Web-служб с передачей параметров только явным образом
- Листинг 15.8. Вызов Web-служб путем неявной передачи параметров посредством cookie-файлов
- Первый вызов Web-службы часто характеризуется увеличенным временем задержки
- Передача больших объемов данных посредством запросов Web-служб неэффективна
- "Болтливость" в мобильных сетях обходится весьма недешево
- Листинг 15.9. Неэффективная организация диалога с Web-службой, в которой используется множество вызовов
- Листинг 15.10. Группирование запросов в одном вызове Web-службы
- Листинг 15.11. Код для загрузки файла с Web-сервера
- При работе с неоднородными сетевыми топологиями могут возникать трудности
- Программный код агента
- Листинг 15.7. Вызовы Web-служб с передачей параметров только явным образом
- 1.2 Вкладка «Код счетчика»
- Запуск InterBase-сервера
- Расширенная установка InterBase-сервера
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Тестирование Web-сервиса XML с помощью WebDev.WebServer.exe
- Статистика InterBase-сервера
- Минимальный состав сервера InterBase SuperServer
- Отличительные особенности сервера Yaffil
- Эффективная работа с временными файлами сортировки
- Дополнительные национальные кодовые страницы и порядки сортировки