Ich habe einen Host/Client-WCF-Dienst und einen Client, der netTcpBinding und eine Callback-Methode verwendet.WCF, Duplex-Rückruf, recieveTimeout netTcpBinding
<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);
}
Client-Instanz mit Rückruf
public MainForm()
{
InitializeComponent();
InstanceContext context = new InstanceContext(new AlarmCallback());
client = new AlarmServerClient(context);
}
Das Problem, das ich habe, ist, dass nach der Bindung recieveTimeout auslöst, geht der Client in einen Fehlerzustand und schließt die Kunden hören Rückrufen.
Ich kann den Listening-Port Drop mit TCPVIEW von Sysinternals sehen.
Wenn ich den Kanal besetzt halte, wird die Zeitüberschreitung nicht ausgelöst, also ist es kein Fehler in der WCF-Nachricht an den Server/Client, da mehrere Nachrichten in Ordnung fließen.
Ich dachte, die receiveTimeout wurde entwickelt, um eine Möglichkeit zu erkennen, ob eine Antwort von der WCF-Nachricht über TCP fehlgeschlagen ist? Warum ist die Verbindung fehlerhaft? Es scheint fast, dass, wenn kein Callback-Objekt für die Timeout-Zeit erstellt wird, der Kanal geschlossen wird?
Was mache ich falsch?
Haben Sie eine Lösung gefunden? –