2012-02-23 14 views
1

メインWebサーバーから一部のエンティティを取得するデータフェッチサービスを作成しました.Webサーバーはアイテムを配信し、クライアントはアイテムを処理します。今、クライアント側で同様のコードは、このような方法で書かれていWCFクライアントがキャッシュされた応答を受け取る

ウェブメソッド

[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はサーバー上のメソッドを実行すべきではありません。

BasicHttpBindingを選択したので、すべてHTTP POST要求であると仮定します。以下に、クライアントコードを変更する

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(ソープクライアントエンドポイント)場合でも、それはいけない、それがキャッシュされたデータを送信するために発生します。

0

私の推測どおり、この問題はLinqではなくWCFに関連している可能性があります。以下にコードを変更しても問題が解決し

+0

クライアント側のコードを変更すると、この問題は解決しますが、それ以外の理由で動作しない理由を知りたいのですが、私のアップデートをご覧ください。 –

関連する問題