メイン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..
}
、なぜこれが起こるのでしょうか?
クライアント側のコードを変更すると、この問題は解決しますが、それ以外の理由で動作しない理由を知りたいのですが、私のアップデートをご覧ください。 –