【问题标题】:HttpWebRequest queueing library, which guarantees request deliveryHttpWebRequest 队列库,保证请求传递
【发布时间】:2013-06-01 23:01:48
【问题描述】:

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

发送请求时,应将其添加到队列中。如果出现问题(无法上网),应存储请求,稍后再尝试发送。

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

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

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

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

【问题讨论】:

  • 为什么要投反对票?我不认为它是不必要或无用的功能,是吗?
  • 保证请求交付是什么意思?对请求的响应肯定是重要的吗? Http 请求不只是一劳永逸。
  • @DaveHillier 嗯,这意味着如果有一些互联网问题,请求将被存储并稍后发送。是的,我应该知道,如果我的请求成功发送到服务器。
  • HTTP 请求通常类似于获取网页。您想对该请求的响应做什么?
  • 我正在使用 HttpWebRequest 向/从服务器发布/获取 json 数据。

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


【解决方案1】:

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

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

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

【讨论】:

  • 激活后不会删除队列文件,但总体来说还是可以的。
【解决方案2】:

抱歉,我没有时间做出非常完整的回答,但 System.Threading.Tasks.Dataflow 命名空间可能对您有一些非常有用的帮助。

【讨论】:

  • 嗯.. 是的,看起来很有希望。
  • 有时间看一下Dataflow。看起来它不适用于 wp7。
  • 其实我找到了wp7-compatible Dataflow: Nito.AsyncEx.Dataflow
【解决方案3】:

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

【讨论】:

  • JavaScript 不是问题 :) 问题是修改服务器,我真的不想做。将来要考虑的好消息,但现在我应该找到一个解决方案,它可以保证消息传递到服务器/从服务器传递。
【解决方案4】:

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

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

其他选项: Messagebus for jQuery

完整的服务总线可能有点矫枉过正,但借用一些想法,它可以提供先机:

pServicebus用C#实现服务端,自带JS-client

MassTransit 的 JS 客户端:MassTransit-JS

【讨论】:

  • 问题是关于 Windows Phone 7。没有浏览器,只有 JSON 查询。无论如何,谢谢你的链接,我会看一眼。
  • 忽略了电话标签。我自己忙于一个网络项目,忘记切换回“现实世界”:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多