Библиотека очередей HttpWebRequest, которая гарантирует доставку запроса

Просто интересно, существует ли класс фреймворка, который бы занимался организацией очередей запросов.

Когда запрос отправлен, его следует добавить в очередь. Если что-то не так (нет интернета), запрос должен быть сохранен, и попытаться отправить его позже.

Между тем, больше запросов может быть создано. Если сети по-прежнему нет, все новые запросы должны храниться в очереди и отправляться снова, пока сеть не вернется.

Собираюсь сделать такой же функционал, интересуясь, реализован ли он уже.

EDIT1: я использую HttpWebRequest для публикации / получения данных JSON на / с сервера.

EDIT2: пример дела:

  1. Пользователь нажимает кнопку1. Первый запрос отправлен, добавлен в очередь, (интернет доступен), приложение получило ответ, запрос удален из очереди.

  2. Пользователь нажимает кнопку2. Второй запрос отправлен, добавлен в очередь, нет подключения к интернету -> запрос сохраняется в очереди.

  3. Пользователь нажимает кнопку3. Третий запрос будет отправлен, но поскольку очередь не пуста, она просто сохраняется в очереди. Request2 пытается быть доставлен, но все еще не подключен.

  4. Некоторое время спустя соединение снова устанавливается, поэтому Request2 успешно выполнен, удален из очереди, затем Request3 также успешно выполнен и удален из очереди.

  5. Что важно - оно должно быть устойчивым к надгробию. Если телефон переходит в режим ожидания до вызова, его следует сохранить. Если запрос выполняется, он должен быть отменен (или именно это сообщение не должно храниться).

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

Другие вопросы по тегам