При вызове службы WCF в цикле из Silverlight возвращаемое значение в асинхронном обработчике всегда одинаково
У моего коллеги есть следующая проблема:
Приложение 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 ответ
Скорее всего, кеш браузера не позволяет вашему вызову даже выйти на сервер. Вы должны установить срок действия на сервере.
Следующее для 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);
Другой вариант - установить заголовок no-cache, но срок действия лучше, так как это поможет предотвратить злоупотребления со стороны клиентов.