我已經寫了一些數據獲取服務,它從主Web服務器獲取一些實體,Web服務器傳遞項目和客戶端處理項目。WCF客戶端接收緩存的響應
Web方法
[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。
UPDATE
更改客戶端代碼如下解決問題,
while(true){
var wcfClient = new WCFClient();
var items = wcfClient.GetPendingItems();
Utils.Log(DateTime.Now, items);
// do something with items..
}
因此,如果使用相同的客戶端爲什麼會發生這種情況?
請參閱我的更新,將代碼更改爲客戶端可解決此問題,但我想知道爲什麼它不起作用。 – 2012-02-23 16:22:14