2012-02-23 2 views
1

Я написал несколько служб извлечения данных, которые извлекают некоторые объекты с основного веб-сервера, веб-сервер доставляет элементы и клиент обрабатывает элементы.Клиент 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 Instance Теперь я знаю, что это может быть проблемой, так что мы пытаемся создать новый 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 клиент Endpoint) заставляет его отправлять данные в кэше, даже когда он не должен.

0

Как я полагаю, эта проблема может быть связана с Linq, а не с WCF.

+0

См. Мое обновление, изменение кода на стороне клиента устраняет проблему, но я хочу знать, почему она не работает в противном случае. –

 Смежные вопросы

  • Нет связанных вопросов^_^