Клиент WCF получает кэшированный ответ - PullRequest
1 голос
/ 23 февраля 2012

Я написал несколько служб извлечения данных, которые выбирают некоторые сущности с основного веб-сервера, веб-сервер доставляет элементы, а клиент обрабатывает элементы.

Веб-метод

[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..
}

Так почему же это происходит, если используется тот же клиент?

Ответы [ 2 ]

0 голосов
/ 15 марта 2012

Изменение кода на следующий решает проблему,

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

Повторное использование WCFClient (конечная точка клиента Soap) заставляет его отправлять кэшированные данные, даже если это не нужно.

0 голосов
/ 23 февраля 2012

На мой взгляд, эта проблема может быть связана с Linq, а не с WCF.

...