При вызове службы WCF в цикле из Silverlight возвращаемое значение в асинхронном обработчике всегда одинаково - PullRequest
0 голосов
/ 02 декабря 2011

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

Приложение Silverlight имеет список идентификаторов и выполняет вызов службы WCF для каждого из них, чтобы найти объект, соответствующий этому идентификатору.Соответствующий объект затем возвращается в приложение Silverlight через асинхронный обработчик «выполнено».Вызовы на стороне 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

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

1 Ответ

1 голос
/ 02 декабря 2011

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

Следующее относится к 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);

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

...