【发布时间】:2012-02-23 12:25:28
【问题描述】:
我编写了一些数据获取服务,它从主网络服务器获取一些实体,网络服务器交付项目,客户端处理项目。
网络方法
[OperationContract]
public DataItem[] GetPendingItems(){
using(DBContext c = new DBContext()){
var q = c.DataItems.Where(x=>x.Attempts<4)
.OrderBy(x=>x.Attempts)
.ThenBy(x=>x.ItemID);
foreach(var item in q){
item.Attempt ++; // making sure item was sent from server
// log what was sent..
}
Utils.Log(DateTime.Now, items);
c.SaveChanges();
return q.ToArray();
}
}
现在客户端的类似代码已经用这种方式编写了..
while(true){
var items = wcfClient.GetPendingItems();
Utils.Log(DateTime.Now, items);
// do something with items..
}
现在问题来了,
由服务器发送
10:10:10 1,2,3
10:10:11 4,5,6
10:10:11 7,8,9
客户收到
10:10:10 1,2,3
10:10:11 4,5,6
10:10:11 4,5,6 <-- this is the problem
wcfClient 是一个全局 WCF 服务实例 现在我知道这可能是问题所在,因此我们正在尝试创建新的 WCFClient 实例并尝试查看它是否有效,但如果您注意到,在我的 while 循环中,调用是完全独立且同步的。
但仔细观察,这种情况很少发生,但看起来 WCF 客户端返回和旧响应返回给我们,而不是它从服务器获取的内容。
现在有任何设置可以解释为什么会发生这种情况,或者为什么 WCF 会缓存响应。
我们在两端都使用最新的 .NET 4.0 框架。平均而言,这种方式会遗漏 2-5% 的项目。
我在 WCF 方面没有很好的经验,但知道 WCF 的性质,它根本不应该缓存任何东西。即使它正在发送缓存响应,WCF 也不应该在服务器上执行方法。
我假设所有都是 HTTP POST 请求,因为我们选择了 BasicHttpBinding。
更新
将客户端代码更改为以下代码可以解决问题,
while(true){
var wcfClient = new WCFClient();
var items = wcfClient.GetPendingItems();
Utils.Log(DateTime.Now, items);
// do something with items..
}
如果使用相同的客户端,为什么会出现这种情况?
【问题讨论】:
标签: wcf caching wcf-client