【发布时间】:2013-06-01 23:01:48
【问题描述】:
只是想知道,是否存在处理请求队列的框架类。
发送请求时,应将其添加到队列中。如果出现问题(无法上网),应存储请求,稍后再尝试发送。
同时,可以创建更多请求。如果仍然没有网络,则所有新请求都应存储在队列中,并在网络返回时再次发送。
打算做同样的功能,想知道它是否已经实现了。
EDIT1:我正在使用 HttpWebRequest 向/从服务器发布/获取 json 数据。
EDIT2:示例案例:
用户按下按钮 1。发送第一个请求,添加到队列,(互联网可用),应用程序得到答案,请求从队列中删除。
用户按下按钮 2。发送第二个请求,添加到队列中,没有互联网连接 -> 请求存储在队列中。
用户按下按钮 3。第三个请求将被发送,但由于队列不是空的,它只是存储到队列中。 Request2 尝试发送,但仍然没有连接。
一段时间后,再次建立连接,所以Request2成功,从队列中移除,然后Request3也成功,从队列中移除。
重要的是 - 它应该能够抵抗墓碑。如果电话在呼叫请求之前进入睡眠状态,则应将其存储。请求是否正在进行中,是否应该取消(或者不应该存储此消息)。
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