[英]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.