none
Time out na conexão RRS feed

  • 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?
    quinta-feira, 3 de setembro de 2009 18:57

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
    quinta-feira, 3 de setembro de 2009 19:55
    Moderador

Todas as Respostas

  • Boas Marcio,

    Qual exatamente a mensagem de erro?
    http://www.israelaece.com
    quinta-feira, 3 de setembro de 2009 19:02
    Moderador
  • 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.
    quinta-feira, 3 de setembro de 2009 19:08
  • 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
    quinta-feira, 3 de setembro de 2009 19:55
    Moderador