src*_*091 1 caching webclient httprequest system.reactive windows-phone-8
我正在开发一个代码,每隔30秒轮询一次Bitstamp交换代码.这是我的代码:
public IObservable<string> Stream(Uri way, WebClient wc)
{
Func<IObserver<string>, Task> Fun = async Observer =>
{
var res = await wc.DownloadStringTaskAsync(way);
Observer.OnNext(value: res);
};
return Observable.Create<string>(Fun);
}
public IObservable<string> GetDelay(int secs)
{
var exe = TimeSpan.FromSeconds(secs);
return Observable.Empty<string>("x").Delay(exe);
}
Stream(new Uri("https://bitstamp.net/api/ticker"), new WebClient { }).Concat(GetDelay(30))
.Repeat(5).Subscribe(res => Debug.WriteLine("got result: {0}", res));
Run Code Online (Sandbox Code Playgroud)
问题是WebClient(并且HttpClient)也会在第一次调用后返回缓存的结果,可以通过相同的时间戳看到:
got result: {"high": "690.00", "last": "645.10", "timestamp": "1387715532" ... }
got result: {"high": "690.00", "last": "645.10", "timestamp": "1387715532" ... }
...
即使在关闭网络后,它们也会正常返回结果,所以很明显它们会将其缓存到某处.添加类似"?cache = random"的内容不起作用,因为Bitstamp上的ticker不允许使用请求参数.设置Headers[HttpRequestHeader.CacheControl] = "no-cache"了WebRequest也不起作用.
我该如何解决这种奇怪的缓存行为?
通过wc.Headers[HttpRequestHeader.IfModifiedSince] = DateTime.UtcNow.ToString();在每个后续呼叫之前设置来解决.
对于使用Language = Chinese且"date + time"不是"24小时制"的Windows Phone设置,代码wc.Headers[HttpRequestHeader.IfModifiedSince] = DateTime.UtcNow.ToString()会导致异常抛出,因为DateTime.ToString()在标题中生成中文字符"下午".
更安全的解决方案是将日期时间格式输出为RFC1123模式:
req.Headers[HttpRequestHeader.IfModifiedSince] = DateTime.UtcNow.ToString("R");
Run Code Online (Sandbox Code Playgroud)
这将确保日期时间格式为"星期六,2014年7月5日13:38:28 GMT",并且HTTP标题中不会有任何中文字符.
| 归档时间: |
|
| 查看次数: |
2303 次 |
| 最近记录: |