Ive got a Host/Client WCF Service and client que está usando netTcpBinding y un método de devolución de llamada.WCF, Duplex callback, 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 ejemplo
[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);
}
cliente con devolución de llamada
public MainForm()
{
InitializeComponent();
InstanceContext context = new InstanceContext(new AlarmCallback());
client = new AlarmServerClient(context);
}
El problema que tengo es que después de la recieveTimeout unión desencadena, el cliente entra en un estado de fallo y cierra los clientes escuchar llamar de vuelta.
Puedo ver la caída del puerto de escucha usando TCPVIEW desde sysinternals.
Si mantengo el canal ocupado, el tiempo de espera no se dispara, por lo que no es un error en el mensaje WCF al Servidor/Cliente, ya que varios mensajes fluirán a través de Aceptar.
Pensé que el receiveTimeout fue diseñado para proporcionar una manera de detectar si una respuesta del mensaje WCF sobre TCP falló? ¿Por qué está fallando la conexión? Casi parece que si no hay ningún objeto de devolución de llamada creado para el período de tiempo de espera, entonces el canal se cierra?
¿Qué estoy haciendo mal?
¿ha encontrado alguna solución a esto? –