WebClient/HttpClient缓存问题

 蓝色调调2502937087 发布于 2023-02-08 16:48

我正在开发一个代码,每隔30秒轮询一次Bitstamp交换代码.这是我的代码:

public IObservable Stream(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也不起作用.

我该如何解决这种奇怪的缓存行为?

2 个回答
  • 对于使用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标题中不会有任何中文字符.

    2023-02-08 16:51 回答
  • 通过wc.Headers[HttpRequestHeader.IfModifiedSince] = DateTime.UtcNow.ToString();在每个后续呼叫之前设置来解决.

    2023-02-08 16:51 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有