Dans un effort de perfectionner des exemples de services à utiliser comme référence pour nos scénarios internes, j'ai créé cet exemple de canal duplex WCF, tirant ensemble plusieurs exemples trouvés au cours des années.
La partie duplex ne fonctionne pas Et j'espère que nous pouvons tous comprendre ensemble. Je déteste la publication de cette autre code, mais je pense que cela a coupé cela aussi court que la WCF peut aller, tout en incorporant toutes les pièces que j'espère avoir vérifié par la communauté. Il y a peut-être des idées vraiment mauvaises ici, je ne dis pas que c'est vrai, c'est juste ce que j'ai jusqu'à présent. P>
Il y a trois parties. Le canal, le serveur et le client. Trois projets, et ici, trois fichiers de code. Aucune configuration XML, tout est codé dans. Suivi de la sortie de code. P>
canal.proj / canal.cs p> server.proj / serveur. CS, Channel de références, System.Runtime.Sériorialisation, System.ServiceModel P> >> Server Running ... Press any key to quit
Pings completed. Enrolling ... <<
Enrolled and waiting. Press any key to quit ... <<
>> Sending "HELLO? (#0)" synchronously ...
CallbackSyncProxy Faulted. <<
CallbackSyncProxy ConnectionRecovered. <<
>> Removed client
>> Sending "HELLO? (#2)" synchronously ...
8/2/2010 2:47:32 PM -07:00: HELLO? (#2) <<
>> Removed client
5 Réponses :
juste mon 0,02 $; Téléchargez le pack d'échantillons WCF & WF et utilisez plutôt l'échantillon duplex. http://www.microsoft. Com / Téléchargements / Détails.aspx? FamilyID = 35EC8682-D5FD-4BC3-A51A-D8AD115A8792 & DisplayLang = fr P>
J'ai vérifié cet échantillon mais spécifiquement [OperationContract (Isoneway = true)] et cela est inacceptable pour ce scénario.
Cela peut ne pas résoudre complètement votre problème, mais en regardant votre code, IdeUPLEXSYNCCallback est définitivement suspect. Une partie de sa mise en œuvre du service est en place mais elle devrait être décorée avec le Servicecontractattribute code> également. Lorsque vous faites un rappel, il doit être désigné aussi à sens unique. Vous trouverez ci-dessous un échantillon de ce que j'ai fait dans le passé pour un contrat de rappel et peut vous aider également.
[ServiceContract]
public interface IDuplexSyncCallback
{
[OperationContract(IsOneWay = true)
string CallbackSync(string message, DateTimeOffset timestamp);
}
Même dans les échantillons référencés par LARSSW, l'interface de rappel n'est pas marquée avec [Servicecontract]. J'ai lu ailleurs que ce n'est pas nécessaire non plus, mais je ne trouve plus cette URL à nouveau. En tout cas, je l'ai essayé juste de ne pas être têtu et que cela ne fait aucune différence. Le deuxième numéro d'Isoneway = TRUE n'est pas approprié pour ce scénario - j'ai besoin d'une réponse! Je n'ai pas lu que Isoneway = TRUE est requis sur les rappels (qu'ils ne peuvent pas retourner une valeur)
Owway n'est pas nécessaire, c'est correct. Les rappels sont généralement asynchronisés et c'est pourquoi vous pouvez trouver des exemples de cette façon. Désolé que cela n'a pas aidé.
sur un serveur dans Annoncesync Méthode Ajoutez la manutention de défaillance et vous serez informé qu'il n'y a aucune réponse du serveur (dans votre cas, un client) signifie qu'il n'y a pas de rappel reçu.
C'est comme vous l'avez suggéré en raison de temps libre.
Donc, changez p> Ça fonctionnerait comme prévu. P> try
{
Console.WriteLine("Client said '{0}'",callback.CallbackSync(message, now) );
}
catch (FaultException fex)
{
syncCallbacks.Remove(callback);
Console.WriteLine("Failed to call Client because" + fex.Reason);
Console.WriteLine(fex.Message);
}
Votre confiance est séduisante, mais je ne peux pas obtenir cela pour travailler. J'ai ajouté ce bloc de capture sur le serveur.cs et j'ai changé le délai d'attente de 2 secondes à 3. Il n'y a pas de changement de comportement. L'exception lancée est une exception temporelle, pas une erreur erronée.
Malheureusement, les opérations d'une voie sont une condition préalable aux canaux duplex. P>
C'est très idiot / aggravant, mais il semble que le Je ne dis pas que désactiver le niveau de protection est une bonne idée, mais au moins c'est un plomb significatif. Si vous avez besoin des avantages de la cryptandSign, vous pouvez expliquer davantage de là. P> protectionfervel.encrypttandsign code> est le problème. J'ai trouvé le message d'erreur sur Google rarement lié à la liaison et à Windows Auth. Conduis-moi à deviner que peut-être que la communication en amont ne fonctionnait pas en raison de quelque chose lié au cryptage contraignant ... ou quelque chose. Mais le réglage à protection de la nature.none à la place permettra soudainement le canal duplex de fonctionner pour des méthodes bidirectionnelles (méthodes qui renvoient des valeurs de retour sur le serveur) P>
Vous devriez dire comment la partie duplex "ne fonctionne pas". Sinon, il y a zéro motivation pour quiconque de lire le code.
Bon point. J'ai ajouté des commentaires en bas. Est-ce mieux?
Peut-être devriez-vous mettre un projet constructible et exécutable dans un fichier zip quelque part sur le filet afin que celui-ci puisse avoir le temps puisse construire, Xcopy Déployer et exécuter dans 5 min, puis regarder dans le débogueur ce qui se passe et avoir une astitution vs pour creuser dans le code. . BTW Stackoverfkow doit changer de CSS pour commencer à utiliser un espacement étroit pour le code :-)