WCF, Duplex de rappel, recieveTimeout netTcpBinding
Ive a obtenu un Hôte /Client WCF Service et le client qui utilise le netTcpBinding et une méthode de rappel.
<bindings>
<netTcpBinding>
<binding name="tcp_Unsecured" receiveTimeout="00:01:00" sendTimeout="00:01:00">
<security mode="None" />
<reliableSession enabled="true" ordered="true" inactivityTimeout="00:10:00"/>
</binding>
</netTcpBinding>
</bindings>
Proxy
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples", ConfigurationName="AlarmServer", CallbackContract=typeof(AlarmServerCallback), SessionMode=System.ServiceModel.SessionMode.Required)]
public interface AlarmServer
{
[System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/RegisterAlarm")]
void RegisterAlarm(System.DateTime alarmTime, string clientName, string reminderMessage);
[System.ServiceModel.OperationContractAttribute(IsOneWay = true, Action = "http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/unRegisterAlarm")]
void unRegisterAlarm(string clientName);
[System.ServiceModel.OperationContractAttribute(IsOneWay = true, Action = "http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/broadcastMessage")]
void broadcastMessage(string msg);
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface AlarmServerCallback
{
[System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/SignalAlarm")]
void SignalAlarm(string reminderMessage);
[System.ServiceModel.OperationContractAttribute(IsOneWay = true, Action = "http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/displayMessage")]
void displayMessage(string msg);
}
instance de client avec rappel
public MainForm()
{
InitializeComponent();
InstanceContext context = new InstanceContext(new AlarmCallback());
client = new AlarmServerClient(context);
}
Le problème que j'ai c'est que, après la liaison recieveTimeout déclenche, le client se rend dans un état faulted et ferme les clients à l'écoute de rappel.
Je peux voir le port d'écoute déposer à l'aide de TCPVIEW de sysinternals.
Si j'ai garder le canal occupé, le temps ne se déclenche pas, donc ce n'est pas une anomalie dans la WCF message au Serveur/Client, comme plusieurs messages flux par ok.
Je pensais que le receiveTimeout a été conçu pour fournir un moyen de détecter si une réponse de la WCF message sur TCP échoué?
Pourquoi est-il défaillant de la connexion.
Il semble presque que si il n'y a pas de rappel de l'objet créé pour la période de délai d'attente, le canal est alors fermé?
Ce que je fais mal?
- avez-vous trouvé une solution à cela?
Vous devez vous connecter pour publier un commentaire.
Semble que le Receivetime provoque le rappel de service d'accueil à la faute après avoir atteint son maximum à compter. Qui est 23.59 hrs ou la valeur par défaut est de 1 minute.
Je peux résolu le problème de timeout avec réglage receivetimeout à l'Infinité
Mais il me demande maintenant si je suis vraiment à l'aide de l'outil dans la CWF pour le Client/Serveur de communications. Je veux un Hôte/Serveur en cours d'exécution sur un serveur de fichiers, et plusieurs clients distants connectés. Le client sera de la commande ping sur le serveur avec un battement de coeur, et, parfois, le serveur peut envoyer une commande pour le client. Je faisais cela avec l'accès distant ou tcpsockets et à l'aide d'un client "mode de scrutin", où les commandes où quued dans une base de données et lorsque le client interrogé le serveur pour une commande toutes les 10 minutes, si il y avait une attente de la commande pour que le client unique, il l'a obtenu. Cela a fonctionné, et a l'avantage de ne PAS avoir 1000 socket tcp ouvert les connexions au serveur, en tant que client uniquement au hasard de connecter et de déconnecter.
MAIS j'ai décidé d'essayer de la WCF (après tout ce n'est pas la plus récente, en plus de remplacer Remoting?) et quand j'ai trouvé Duplex j'ai pensé, nom de l'utiliser....
MAINTENANT Im pensée Im manque le point sur ce que WCF Duplux est pour ???
Aider ai-je raté les concepts ici???
La valeur à laquelle les receiveTimeout est réglée dire le service combien de temps attendre avant défaillant le canal de communication, lorsque aucune demande de message est reçu. Vous pouvez toujours augmenter cette valeur de délai d'expiration à un plus grand nombre (la valeur par défaut est de 10 minutes), mais il convient également d'avoir à augmenter la session délai d'inactivité. Veuillez voir http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.binding.receivetimeout.aspx pour plus d'informations sur ces deux délais d'attente.
Lorsque la réception ou délai d'inactivité des incendies, le canal duplex est en défaut. Vous devrez créer un nouveau proxy côté client pour être en mesure de communiquer avec le serveur de nouveau.
Vous pouvez toujours vérifier le canal de statut de connexion sur le côté client avant d'essayer d'appeler le serveur. Si le CommunicationState de la chaîne n'est pas ouvert, alors vous pouvez créer un nouveau proxy avant d'appeler le serveur.
Avez-vous essayé d'utiliser un DuplexChannelFactory, dans la création de proxy (client)?
Voici comment il est utilisé (remplacez la création à l'aide de nouveau AlarmServerClient(contexte)):
EDIT: Permettant de log à analyser trace:
Il est possible d'analyser les canaux de communication, par activation de la journalisation de Messages et de Trace:
Dans ce cas, la Trace est capable de se connecter à "l'Information". Il est important de voir les voies de la création.
Pour analyser les svclog fichier, vous pouvez utiliser la Visionneuse de Trace de Service - kit de développement Microsoft Windows, généralement dans C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\SvcTraceViewer.exe