簡體   English   中英

從Silverlight循環調用WCF服務,異步處理程序中的返回值始終相同

[英]Calling a WCF service in loop from Silverlight, return value in asynch handler is always the same

我的同事有以下問題:

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

我們只是通過整體發送和接收集合來找到解決問題的方法,但對於引起原始問題的原因仍然感到好奇。

很可能是瀏覽器的緩存阻止了您的呼叫甚至無法訪問服務器。您需要在服務器上設置到期時間。

以下內容適用於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標頭,但是到期會更好,因為這將有助於防止客戶端濫用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM