2011-12-02 4 views
0

Mon collègue a le problème suivant:Appeler un service WCF dans la boucle de Silverlight, la valeur de retour dans le gestionnaire asynch est toujours le même

L'application Silverlight a une liste d'ID et fait un appel de service WCF pour chacun d'eux pour trouver l'objet correspondant à cet identifiant. L'objet correspondant est ensuite renvoyé à l'application Silverlight via un gestionnaire "completed" asynchrone. Les appels sur le côté Silverlight sont faits dans une boucle, et le WCF effectue un accès à la base de données, trouve et met à jour l'objet et le renvoie. Le gestionnaire Silverlight terminé saisit ensuite les retours et replace les objets dans une collection.

Le problème est que, pour une raison quelconque, la liste des objets reçus en retour sont tous le même objet. À l'aide des points d'arrêt, l'application Silverlight envoie les objets corrects, la WCF reçoit et renvoie les objets corrects, mais lors de la réception des objets, l'application Silverlight continue d'obtenir le même objet encore et encore (mais le nombre correct d'objets est renvoyé).

exemple ci-dessous pour illustrer le problème (une version simplifiée, pas le code réel):

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 

et enfin la (simplifiée) fonction de service 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 

Nous avons trouvé un moyen de contourner le problème en envoyant et recevant la collection dans son ensemble, mais serait encore curieux de savoir quelle était la cause du problème original.

+0

Quelle liaison utilisez-vous pour WCF? –

+0

@ ArnonRotem-Gal-Oz basicHttpBinding est ce qui est dans le ServiceReferences.ClientConfig, si c'est ce que vous vouliez dire? –

Répondre

1

Il est très probable que le cache du navigateur empêche votre appel de sortir sur le serveur. Vous devez définir l'expiration sur le serveur.

Ce qui suit est pour C#, mais il devrait être assez similaire dans 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); 

Une autre option consiste à définir l'en-tête no-cache, mais l'expiration est préférable, car il aidera à prévenir l'abus par les clients

+0

Toutefois, lorsque vous utilisez des points d'arrêt dans le service, il semble que chaque appel est traité séparément, de sorte qu'il ne doit pas être intercepté dans le cache. –

+0

télécharger fiddler (http://www.fiddler2.com/fiddler2/) et voir si le problème est avec ce qui est envoyé par le serveur ou que le client ne fait pas d'appels –

+0

Merci pour la suggestion, je vais le vérifier en dehors. Malheureusement, il faudra attendre la semaine prochaine, mais je vais essayer de vous revenir sur ce qu'il montre. –

Questions connexes