0

我的同事有以下问题:

Silverlight 应用程序有一个 ID 列表,并为每个 ID 调用 WCF 服务以查找与该 ID 匹配的对象。然后通过异步“已完成”处理程序将匹配对象返回给 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

我们通过发送和接收整个集合找到了解决问题的方法,但仍然对原始问题的原因感到好奇。

4

1 回答 1

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);

另一种选择是设置无缓存标头,但过期更好,因为它有助于防止客户端滥用

于 2011-12-02T09:09:01.910 回答