2012-02-23 198 views
1

我已經寫了一些數據獲取服務,它從主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.. 
} 

因此,如果使用相同的客戶端爲什麼會發生這種情況?

回答

0

代碼修改成以下解決問題,

while(true){ 
    var wcfClient = new WCFClient(); 
    var items = wcfClient.GetPendingItems(); 
    Utils.Log(DateTime.Now, items); 
    // do something with items.. 
} 

重用WCFClient(SOAP客戶端終點)導致其發送緩存數據,即使它不應該。

0

根據我的猜測,這個問題可能與Linq而不是WCF有關。

+0

請參閱我的更新,將代碼更改爲客戶端可解決此問題,但我想知道爲什麼它不起作用。 – 2012-02-23 16:22:14