Я написал несколько служб извлечения данных, которые выбирают некоторые сущности с основного веб-сервера, веб-сервер доставляет элементы, а клиент обрабатывает элементы.
Веб-метод
[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..
}
Так почему же это происходит, если используется тот же клиент?