Aujourd'hui, j'ai une question WCF, même si elle concerne probablement d'autres modèles de mise en réseau dans .NET.WCF: DuplexSessionChannel, opérations asynchrones et une exception
J'ai un service WCF qui expose un OperationContract Send (Message), qui est OneWay = true. Maintenant, ce service a un canal de rappel pour renvoyer des messages au client.
Quoi qu'il en soit, j'essaie (avec succès) d'appeler cette méthode Send de mon client de manière asynchrone. Sur un DuplexSessionChannel j'appelle BeginSend (Message, OnSendComplete, null) et j'ai une méthode OnSendComplete (IAsyncResult) qui appelle EndSend (asyncResult) sur le DuplexSessionChannel.
Le service a un CallbackContract et utilise le même modèle BeginSend()/EndSend() pour renvoyer au client, qui est appelé sur le canal callBack que j'obtiens avec OperationContext.Current.GetCallbackChannel.
Le client sur son DuplexSessionChannel appelle BeginReceive()/EndReceive() lors de la réception de messages à partir du canal de rappel Services.
Même si les choses fonctionnent, je ne comprends pas ce que font réellement les méthodes End <Operation>
() et c'est ce que j'ai besoin de m'expliquer. Je demande parce que je reçois une exception occasionnelle dans un appel à EndSend() sur le Service (renvoi au client) se plaindre qu'une collection a été modifiée (je sais ce que cette exception signifie, mais pas pourquoi il est passe ou où exactement ...). J'utilise PollingDuplexHttpBinding avec un client Silverlight. Je ne suis pas un expert WCF, mais ne vous retenez pas sur les détails, j'ai besoin de la connaissance. J'ai vu ce genre de modèles de début/fin avant d'autres opérations asynchrones au cours de ma carrière jusqu'à présent, mais je n'ai jamais vraiment compris ce qui se passait.
Merci d'avance.
Dans la WCF IDuplexSessionChannel.BeginSend et EndSend a la signature suivante: IAsyncResult BeginSend (message, AsyncCallback, objet) EndSend void (IAsyncResult); J'appelle EndSend depuis la méthode de rappel appelée par le délégué AsyncCallback transmis à BeginSend. Étant donné que EndSend() renvoie void, je ne comprends toujours pas à quoi cela sert. Le "résultat" que je vois provient de BeginSends AsyncCallback. Je ne comprends pas non plus pourquoi BeginSend retourne IAsyncResult, quand il est également retourné de manière asynchrone par le BeginSend AsyncCallback. – MrLane
Lecture Brians poster encore quelques mois après que j'ai posté cette question les choses sont beaucoup plus claires avec ce modèle. Le livre de programmation WCF par Juval Lowery explique aussi bien cela. Je ne sais toujours pas la cause de l'exception, mais il a été éliminé car je n'appelle plus EndSend(), car je réalise qu'il n'y a aucun résultat renvoyé de toute façon. Je ne sais pas si c'est une bonne pratique (peut-être que je pourrais manquer des détails d'exception), mais le livre semble suggérer qu'il peut être omis, et puisque le retrait a été bien meilleur. – MrLane