gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:53:19 27 4
gpt4 key购买 nike

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

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

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

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com