c# - HttpWebRequest 队列库,保证请求传递

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

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

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

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

打算实现相同的功能,想知道它是否已经实现。

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

EDIT2:示例案例:

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

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

  3. 用户按下 Button3。第三个请求将被发送,但由于队列不为空,它只是存储到队列中。 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,否则返回服务器应答的字符串。我现在需要的是一种模式,它可以保证调用成功(结果不为空),否则,将其保持在队列中(以保持顺序)并尝试再次调用,直到它被传递。

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

最佳答案

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

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

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

关于c# - HttpWebRequest 队列库,保证请求传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16878108/

相关文章:

c# - IIS 7.x,添加启用 HTTPS 的站点 : SiteCollection. Add(string, string, string, byte[]) 重载

c# - 获取实现某个抽象类的所有类

c# - INotifyPropertyChanged 实现,绑定(bind)不起作用

C++ 套接字编程 - 查找客户端机器 IP、TrueIP 和绑定(bind)端口

c++ - 编辑 QTreeWidgetItem 时捕获 ESC 键按下事件

java - tcp服务器和客户端的问题

C# 如何通过社会安全号码查找某人出生的州

c# - WPF Canvas 在绘制很多时卡住

c# - 如何在设置页面中设置List picker以及从IsolatedStorageSettings中存储和检索值?(内有说明)

linq-to-sql - 在 Windows Phone 7.1 上使用 LINQ To SQL 删除行非常慢