HttpWebRequest队列库,它保证请求的传递

本文关键字:请求 队列 HttpWebRequest | 更新日期: 2023-09-27 18:16:20

只是想知道,是否存在一类框架,可以处理请求队列。

发送请求时,应将其添加到队列中。如果有问题(没有网络),请求应该被存储,并尝试稍后再次发送。

同时,可以创建更多的请求。如果仍然没有网络,所有新请求都应该存储在队列中,并在网络返回时再次发送。

要做同样的功能,想知道它是否已经实现了。

EDIT1:我使用HttpWebRequest发布/获取json数据到/从服务器。

EDIT2:示例示例:

  1. 用户按下Button1。

  2. 第一个请求被发送,添加到队列中,(网络可用),应用程序得到应答,请求从队列中删除。
  3. 用户按下按钮2。第二个请求被发送,添加到队列中,没有internet连接->请求被存储在队列中

  4. 用户按下Button3。第三个请求将被发送,但由于队列不是空的,它只是存储到队列中。

  5. 一段时间后,连接再次建立,因此Request2成功,从队列中删除,然后Request3也成功并从队列中删除。

  6. 重要的是-它应该抵抗墓碑。如果手机在调用请求前进入睡眠状态,则应将其存储。如果请求正在进行中,它应该被取消(或者确切地说,这个消息不应该被存储)。

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。如果有异常则为空,否则返回服务器应答的字符串。我现在需要的是一个模式,它可以保证调用成功(结果不为空),否则,将其保持在队列中(以保持顺序)并尝试再次引发调用,直到它被交付。

EDIT4:现在,我正在考虑在一个信号量中有一个队列,当我需要强制推送时调用它。有什么想法,如果它会工作好吗?

HttpWebRequest队列库,它保证请求的传递

我做了一个简单的例子,它使用Queue对象来保存请求的url列表。基本上它只是一个接一个地发出请求。并且总是在请求完成时发送一个Completed事件。然后由Completed事件的处理程序来处理返回的页面或返回的错误条件。

还有墓碑支持。基本上,当调用Application_Deactivated或Application_Closing回调时,它将队列保存到隔离的存储中。如果应用从tombstone阶段返回,就把它加载到应用构造函数/Application_Activated函数中。我希望这能让你开始。

http://www.mediafire.com/download/cncuwx1kttehv8y/PhoneApp15.zip

对不起,我没有时间给出一个非常完整的答案,但是System.Threading.Tasks.Dataflow名称空间可能对您有一些非常有用的东西

看看使用AJAX请求在客户端运行的SPA(单页应用程序)。您的服务器逻辑将从处理所有业务逻辑转变为使用JavaScript在客户端完成的业务逻辑简单地向客户端提供数据。这允许应用程序在没有服务器数据的情况下运行。然后,您可以在404错误的情况下处理您希望它做的事情,包括稍后再试一次。熟悉JavaScript

这是从记忆中突然出现的。但不确定是否以及如何实现持久性。如果消息需要在浏览器重新启动后传递,您可以使用本地存储来实现这部分。

Stomp作为协议可以满足您的需求。不错的tut: http://blog.mayflower.de/2011-Message-Queues-for-web-applications-with-STOMP.html

其他选项:jQuery的Messagebus

一个完整的服务总线可能有点过分,但借鉴一些想法,它可以提供一个良好的开端:

pServicebus在c#中实现服务器端,并附带JS-client

MassTransit- js