Библиотека очередей HttpWebRequest, которая гарантирует доставку запроса
Просто интересно, существует ли класс фреймворка, который бы занимался организацией очередей запросов.
Когда запрос отправлен, его следует добавить в очередь. Если что-то не так (нет интернета), запрос должен быть сохранен, и попытаться отправить его позже.
Между тем, больше запросов может быть создано. Если сети по-прежнему нет, все новые запросы должны храниться в очереди и отправляться снова, пока сеть не вернется.
Собираюсь сделать такой же функционал, интересуясь, реализован ли он уже.
EDIT1: я использую HttpWebRequest для публикации / получения данных JSON на / с сервера.
EDIT2: пример дела:
Пользователь нажимает кнопку1. Первый запрос отправлен, добавлен в очередь, (интернет доступен), приложение получило ответ, запрос удален из очереди.
Пользователь нажимает кнопку2. Второй запрос отправлен, добавлен в очередь, нет подключения к интернету -> запрос сохраняется в очереди.
Пользователь нажимает кнопку3. Третий запрос будет отправлен, но поскольку очередь не пуста, она просто сохраняется в очереди. Request2 пытается быть доставлен, но все еще не подключен.
Некоторое время спустя соединение снова устанавливается, поэтому Request2 успешно выполнен, удален из очереди, затем Request3 также успешно выполнен и удален из очереди.
Что важно - оно должно быть устойчивым к надгробию. Если телефон переходит в режим ожидания до вызова, его следует сохранить. Если запрос выполняется, он должен быть отменен (или именно это сообщение не должно храниться).
EDIT3: чтобы избежать исключений доставки, я использую эту обертку:
public async Task<string> GetAsync(string url)
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.Method = HttpMethod.Get;
httpWebRequest.Accept = "application/json";
try
{
var response = (HttpWebResponse)await httpWebRequest.GetResponseAsync();
if (response == null || response.StatusCode != HttpStatusCode.OK)
return String.Empty;
string data;
using (var responseStream = response.GetResponseStream())
{
using (var postStreamReader = new StreamReader(responseStream))
{
data = await postStreamReader.ReadToEndAsync();
postStreamReader.Close();
}
responseStream.Close();
}
return data ?? String.Empty;
}
catch (Exception ex)
{
return String.Empty;
}
}
Он возвращает String.Empty, если есть какие-либо исключения, в противном случае он возвращает строку ответа сервера. Теперь мне нужен шаблон, который бы гарантировал, что вызов был успешным (результат не пустой), в противном случае оставил бы его в очереди (чтобы сохранить порядок) и попытался бы снова вызвать вызов, пока он не будет доставлен.
РЕДАКТИРОВАТЬ 4: на данный момент, я рассматриваю возможность иметь очередь в семафор, и вызываю ее, когда мне нужно принудительно нажать. Есть мысли, если это будет работать нормально?
4 ответа
Я сделал простой пример, который использует объект Queue для хранения списка запрошенных URL. В основном это только делает запросы один за другим. И всегда отправляет событие Completed, когда запрос завершен. Затем обработчик события Completed обрабатывает возвращаемую страницу или возвращаемые условия ошибки.
Также есть надгробная поддержка. По существу, он сохраняет очередь в изолированном хранилище при вызове обратных вызовов Application_Deactivation или Application_Closing. И загружает его в конструктор приложения / функцию Application_Activation, если приложение возвращается из стадии захоронения. Я надеюсь, это поможет вам начать.
http://www.mediafire.com/download/cncuwx1kttehv8y/PhoneApp15.zip
Извините, у меня нет времени, чтобы сделать полный ответ, но пространство имен System.Threading.Tasks.Dataflow может иметь некоторые очень полезные для вас вещи.
Посмотрите на SPA (одностраничные приложения), которые выполняются на стороне клиента с использованием запросов AJAX. Логика вашего сервера переключится с обработки всей бизнес-логики на простую передачу клиентских данных с помощью бизнес-логики, выполненной на клиенте в JavaScript. Это позволяет приложению функционировать без поступления данных с сервера. Затем вы можете обработать то, что вы хотите, чтобы оно делало в случае 404 ошибок, включая повторную попытку позже. Познакомьтесь с JavaScript.
Это всплыло из памяти. Но не уверен насчет того, реализуется ли и как это происходит. Если сообщения необходимо доставлять даже после перезапуска браузера, вы можете реализовать эту часть в локальном хранилище.
Stomp в качестве протокола может служить вашим потребностям. Хороший тут: http://blog.mayflower.de/2011-Message-Queues-for-web-applications-with-STOMP.html
Другие варианты: Messagebus для jQuery
Полный сервисный автобус, возможно, немного излишним, но заимствовать некоторые идеи он может дать старт:
pServicebus Реализован на стороне сервера в C# и поставляется с JS-клиентом
JS-клиент для МассТранзит: MassTransit-JS