Вызов службы WCF в цикле из Silverlight, возвращаемое значение в асинхронном обработчике всегда одинаково

У моего коллеги следующая проблема:

Приложение Silverlight имеет список идентификаторов и выполняет вызов службы WCF для каждого из них, чтобы найти объект, соответствующий этому идентификатору. Затем соответствующий объект возвращается в приложение Silverlight с помощью асинхронного обработчика «completed». Вызовы на стороне Silverlight выполняются в цикле, и WCF выполняет некоторый доступ к базе данных, находит и обновляет объект и возвращает его. Затем завершенный обработчик Silverlight перехватывает возвраты и заполняет объекты обратно в коллекцию.

Проблема в том, что по какой-то причине список объектов, полученных обратно, является одним и тем же объектом. Используя точки останова, приложение Silverlight отправляет правильные объекты, WCF получает и возвращает правильные объекты, но при получении объектов обратно приложение Silverlight продолжает получать один и тот же объект снова и снова (но возвращается правильное количество объектов).

Пример ниже для иллюстрации проблемы (упрощенная версия, а не фактический код):

Private Sub sendObjects(Byval sales As List(Of Integer))
    For Each saleID As Integer in sales
        AddHandler hlxService.SaveBankTransactCompleted, _
                AddressOf SaveBankTransactCompleted

        hlxService.SaveBankTransactAsync(saleID)
    End For
End Sub

Private Sub SaveBankTransactCompleted(
        sender As Object, 
        e As SaveBankTransactCompletedEventArgs)
    RemoveHandler hlxService.SaveBankTransactCompleted, _
                AddressOf SaveBankTransactCompleted

    saleCollection.add(e.Result)

    ' Check if all objects have been returned.
    CheckPaymentStatus()
End Sub

и, наконец, (упрощенная) сервисная функция WCF:

<OperationContract()>
Public Function SaveBankTransact(
        ByVal saleID as Integer) As hlxSale
    Dim newSale as hlxSale
    newSale = findSaleById(saleID)
    ' Process some data from database, put values into newSale

    Return newSale
End Function

Мы нашли способ обойти проблему, просто отправив и получив коллекцию целиком, но нам все равно было любопытно, что было причиной исходной проблемы.


person Miika L.    schedule 02.12.2011    source источник
comment
Какую привязку вы используете для WCF?   -  person Arnon Rotem-Gal-Oz    schedule 02.12.2011
comment
@ArnonRotem-Gal-Oz basicHttpBinding — это то, что находится в ServiceReferences.ClientConfig, если вы это имели в виду?   -  person Miika L.    schedule 02.12.2011


Ответы (1)


Скорее всего это кеш браузера мешает вашему звонку даже выйти на сервер. Вам нужно установить срок действия на сервере.

Ниже приведено описание для C#, но оно должно быть довольно похоже на VB.NET.

var nextCycle = DateTime.Now.AddSeconds(pollingInterval).ToUniversalTime();
var expires = nextCycle.ToString("ddd, dd MMM yyyy HH:mm:ss 'GMT'");
var headers = WebOperationContext.Current.OutgoingResponse.Headers;
headers.Add(HttpResponseHeader.Expires, expires);

Другой вариант — установить заголовок без кеша, но истечение срока действия лучше, так как это поможет предотвратить злоупотребления со стороны клиентов.

person Arnon Rotem-Gal-Oz    schedule 02.12.2011
comment
Но при использовании точек останова в службе кажется, что каждый вызов получает отдельно, поэтому он не должен попасть в кеш? - person Miika L.; 02.12.2011
comment
загрузите fiddler (fiddler2.com/fiddler2) и посмотрите, не связана ли проблема с тем, что отправляется с сервер или что клиент не звонит - person Arnon Rotem-Gal-Oz; 02.12.2011
comment
Спасибо за предложение, я проверю. К сожалению, его придется подождать до следующей недели, но я постараюсь вернуться к вам о том, что он показывает. - person Miika L.; 02.12.2011