我正在开发一个代码,每隔30秒轮询一次Bitstamp交换代码.这是我的代码:
public IObservableStream(Uri way, WebClient wc) { Func , Task> Fun = async Observer => { var res = await wc.DownloadStringTaskAsync(way); Observer.OnNext(value: res); }; return Observable.Create (Fun); } public IObservable GetDelay(int secs) { var exe = TimeSpan.FromSeconds(secs); return Observable.Empty ("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));
问题是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
也不起作用.
我该如何解决这种奇怪的缓存行为?
对于使用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");
这将确保日期时间格式为"星期六,2014年7月5日13:38:28 GMT",并且HTTP标题中不会有任何中文字符.
通过wc.Headers[HttpRequestHeader.IfModifiedSince] = DateTime.UtcNow.ToString();
在每个后续呼叫之前设置来解决.