HttpWebRequest排队库,保证请求传递

时间:2013-06-01 23:01:49

标签: c# windows-phone-7 networking network-programming httpwebrequest

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

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

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

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

EDIT1:我正在使用HttpWebRequest发送/获取服务器的json数据。

EDIT2:示例案例:

  1. 用户按下Button1。发送第一个请求,添加到队列,(互联网可用),应用程序得到答案,请求从队列中删除。

  2. 用户按下Button2。发送第二个请求,添加到队列,没有互联网连接 - >请求存储在队列中。

  3. 用户按下Button3。第三个请求将被发送,但由于队列不为空,它只是存储到队列中。 Request2尝试传递,但仍然没有连接。

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

  5. 重要的是 - 它应该能够抵抗墓碑。如果电话在呼叫请求之前进入休眠状态,则应将其存储。请求正在进行中,应该取消(或者不应该存储此消息)。

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

    EDIT4:现在,我正在考虑在信号量中排队,并在我需要强制推送时调用它。有什么想法,如果它能正常工作吗?

4 个答案:

答案 0 :(得分:3)

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

此外,还有墓碑支持。基本上,当调用Application_Deactivated或Application_Closing回调时,它会将队列保存到独立存储。如果app从逻辑删除阶段返回,则将其加载到app构造函数/ Application_Activated函数中。我希望这能让你开始。

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

答案 1 :(得分:2)

很抱歉,我没有时间做出完整的答案,但System.Threading.Tasks.Dataflow命名空间可能会为您提供一些非常有用的功能。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

其他选择: Messagebus for jQuery

一个完整的服务总线可能有点矫枉过正,但借用一些想法它可以给一个先发制人:

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

MassTransit的JS-client:MassTransit-JS