Usuário com melhor resposta
Time out na conexão

Pergunta
-
Ola Mestres
Estou tentando conextar um cliente a um servidor mas esta me dando time out, veja como fiz:
Esta é a classe de servicos
using System;
using System.ServiceModel;
namespace ServerWCF
{
[ServiceContract]
interface ITeste
{
[OperationContract]
string HorasServidor();
}
public class Servico: ITeste
{
public string HorasServidor()
{
return DateTime.Now.ToString();
}
}
}
E este é o meu Host:
using System;
using System.Windows.Forms;
using System.ServiceModel;
namespace ServerWCF
{
public partial class FormServer : Form
{
ServiceHost hServidor;
public FormServer()
{
InitializeComponent();
}
private void FormServer_Load(object sender, EventArgs e)
{
hServidor = new ServiceHost(typeof(Servico), new Uri[] { new Uri("net.tcp://localhost:5050") });
hServidor.AddServiceEndpoint(typeof(ITeste), new NetTcpBinding(), "Teste");
hServidor.Open();
}
private void button1_Click(object sender, EventArgs e)
{
string strMsg;
ChannelFactory<ITeste> Servico = new ChannelFactory<ITeste>(new NetTcpBinding(),"net.tcp://localhost:5050/Teste");
ITeste teste = Servico.CreateChannel();
strMsg = teste.HorasServidor();
MessageBox.Show(strMsg);
}
}
}
Por que esta dando Time out?
Respostas
-
Boas Marcio,
Quando você define o ServiceHost na thread de UI do Windows Forms, todas as requisições são realizadas e processadas através do MessageLoop do Windows, o que gera problemas de concorrência. Para "resolver" o seu problema, você pode definir a propriedade UseSynchronizationContext para False do atributo ServiceBehavior:
[ServiceBehavior(UseSynchronizationContext = false)]
public class Servico: ITeste
{
....
}
Se você cria o ServiceHost fora do Form, como por exemplo, no método Main da sua aplicação Windows, tudo isso será executado na sua própria thread.
http://www.israelaece.com- Marcado como Resposta Israel AeceModerator sexta-feira, 4 de setembro de 2009 12:05
Todas as Respostas
-
-
Esta operação de solicitação enviada para net.tcp://localhost:5050/Teste não recebeu uma resposta no tempo limite configurado (00:01:00). O tempo alocado para esta operação pode ter sido uma parte de um tempo limite maior. Isso pode acontecer porque o serviço ainda está processando a operação ou porque o serviço não conseguiu enviar uma mensagem de resposta. Considere aumentar o tempo limite da operação (difundindo o canal/proxy para IContextChannel e definindo a propriedade OperationTimeout) e verificar se o serviço é capaz de conectar-se ao cliente.
Veja que tanto o servidor quanto o cliente estão na mesma máquina e no mesmo executavel. -
Boas Marcio,
Quando você define o ServiceHost na thread de UI do Windows Forms, todas as requisições são realizadas e processadas através do MessageLoop do Windows, o que gera problemas de concorrência. Para "resolver" o seu problema, você pode definir a propriedade UseSynchronizationContext para False do atributo ServiceBehavior:
[ServiceBehavior(UseSynchronizationContext = false)]
public class Servico: ITeste
{
....
}
Se você cria o ServiceHost fora do Form, como por exemplo, no método Main da sua aplicação Windows, tudo isso será executado na sua própria thread.
http://www.israelaece.com- Marcado como Resposta Israel AeceModerator sexta-feira, 4 de setembro de 2009 12:05