none
Problema Duplex & silverlight RRS feed

  • Pergunta

  • Olá, acho que esse post tem mais haver com WCF do que com silverlight (onde estava o post).

    Bom, lá vai:

    to usando o duplex com silverlight..mas ta dificil.. quando eu executo a aplicação e tento usar uma metodo do serviço o negoco não vai..ta muito devagar... cerca de quase 1 min pra chegar no metodo do serviço..e 2 minutos pro serviço retornar a resposta... 

     


    bom.. e depois de um tempo esperando a resposta ele retorna a seguinte exception:

    This request operation sent to http://localhost:26096/ServiceHost/Service.svc did not receive a reply within the configured timeout (00:01:00).  The time allotted to this operation may have been a portion of a longer timeout.  This may be because the service is still processing the operation or because the service was unable to send a reply message.  Please consider increasing the operation timeout (by casting the channel/proxy to IContextChannel and setting the OperationTimeout property) and ensure that the service is able to connect to the client.

     

     

    Vai ai todas as informações necessárias para a avaliação do problema:

     

     Serviço:

        [ServiceContract(Namespace = "IGame.Core.Business", CallbackContract = typeof(ICallbackGame))]

        [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]

        [ServiceKnownType(typeof(GameException))]

        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

        public class ServiceGame

        {

            [OperationContract]

            public GameConfig GenerateCustomConfig(...) {

              // *** PASSO 2: DEPOIS DO RETURN DEMORA CERCA DE 1 a 2 MINUTO PARA CAIR NO COMPLETE DO SILVELIGHT

               return new GameConfig(...);

            }

            ...

        }

     

        Interface de callback:

     

        [ServiceContract]

        public interface ICallbackGame

        {

            [OperationContract(IsOneWay = true)]

            void OnResponseMove(string msg);

        }

     

        SilverLight invoke:

     

        public MainPage()

        {    

           EndpointAddress ea = new EndpointAddress("http://localhost:3807/ServiceHost/ServiceGame.svc");            

           var duplex = new PollingDuplexBindingElement();

           var element = new TextMessageEncodingBindingElement();

           var transport = new HttpTransportBindingElement();

           CustomBinding cb = new CustomBinding(duplex, element, transport);

     

           // *** TESTE PARA TENTAR ALTERDAR A MSG DA EXCEPTION DE (00:01:00) 

           // *** para o valor indicado abaixo (NÂO FUNCIONOU!!!)

           //cb.CloseTimeout = new TimeSpan(0,2,20);

           //duplex.InactivityTimeout = new TimeSpan(0, 5, 50);

           //duplex.ClientPollTimeout = new TimeSpan(0, 0, 0, 1);

     

           this.client = new ServiceGameClient(cb, ea);

     

           // set metodo de complete

           this.client.GenerateCustomConfigCompleted += GenerateCustomConfig_Completed;

     

           // *** PASSO 1 - NESSE PONTO DEMORA CERCA DE 20 SEGUNDOS PARA CHEGAR NO SERVIÇO

           this.client.GenerateCustomConfigAsync(...);

        }

     

        public void GenerateCustomConfig_Completed(object sender, GenerateCustomConfigCompletedEventArgs e)

        { 

            // *** PASSO 3 - DEMORA PARA CHEGAR AKI

            this.gameConfiguration = e.Result;

        }

     

        Infraestrutura:

     

        - Estou usando o Factory do link do primeiro post.

        - Não existe configurações nos .config, esta tudo de forma imperativa.

        - O serviço esta como arquivo .svc no meu WebProject.

        - Utilizo o Windows Vista com o VS2008, Microsoft Silverlight Projects 2008 Version 9.0.30730.126, tenho tb o VS2010.

        - Note com Wireless

     

    Bom é isso ae pessoal.. acho que coloquei todas as informações ai... se vcs tiverem alguma ideia do q pode ser ficaria muito gratificado...

    ja não sei muito oq fazer..pensei q fosse algum problema com threads, mas sei lah.. ta td conforme manda os mandamentos na web... segui todos os artigos certinho...

     

    ha, uma ultima observação, no firefox as coisas são POUCA coisa mais rapida que no IE 8.

    []s


    Ozzyvegeta
    sexta-feira, 10 de setembro de 2010 13:29

Todas as Respostas

  • Boas Ozzyvegeta,

    Temos algumas configurações no polling duplex que podemos utilizar para ter um maior controle em alguns timeouts, e também na quantidade máxima de sessões e de mensagens que podem ser criadas. Para iniciar vamos falar sobre as propriedades fornecidas pela classe PollingDuplexBindingElement do serviço. As propriedades que gerenciam as quantidades máximas são: MaxPendingSessions e MaxPendingMessagesPerSession. A primeira determina a quantidade máxima de sessões suportadas, enquanto a segunda determina a quantidade máxima de mensagens para cada sessão criada. Com relação aos timeouts, temos as propriedades InactivityTimeout e ServerPollTimeout. A primeira propriedade determina um intervalo de tempo que o serviço pode passar sem nenhuma atividade antes do canal se tornar inválido. Já a segunda propriedade, especifica o tempo em que o serviço irá monitorar o cliente anter de retornar.

    Do lado do cliente apenas temos duas propriedades, também fornecidas pela classe PollingDuplexBindingElement: InactivityTimeout e ClientPollTimeout. A primeira propriedade tem a mesma finalidade da propriedade InactivityTimeout do lado do serviço, enquanto a propriedade ClientPollTimeout determina o intervalo de tempo que o cliente ficará interrogando o serviço, para verificar a existência de novas mensagens. Todas essas propriedades devem ser configuradas antes da conexão ser estabelecida entre o cliente e o serviço.


    http://www.israelaece.com
    sexta-feira, 10 de setembro de 2010 20:46
    Moderador
  • Fala Israel, mas uma vez obrigado pela resposta..

    Bom, lá vai minha configuração:

    Serviço (metodo de criação do serviço):
        
    protected override void InitializeRuntime() {
                var duplex = new PollingDuplexBindingElement();
                var msg = new TextMessageEncodingBindingElement();
                var transport = new HttpTransportBindingElement();
                var customBinding = new CustomBinding(duplex,msg,transport);

                duplex.InactivityTimeout = new TimeSpan(0,2,20);
                duplex.ServerPollTimeout = new TimeSpan(0,0,0,1);
                
                duplex.MaxPendingMessagesPerSession = 10000;
                duplex.MaxPendingSessions = 10000;
                
                var endpoint = this.AddServiceEndpoint(typeof(MyService), customBinding, "");

                this.AddServiceEndpoint(
                    typeof(IMetadataExchange),
                    MetadataExchangeBindings.CreateMexHttpBinding(),
                    "mex");
                base.InitializeRuntime();
    }

    Cliente:

                EndpointAddress ea = new EndpointAddress("http://localhost:3807/MyService.svc");
                
                var duplex = new PollingDuplexBindingElement();
                var element = new TextMessageEncodingBindingElement();
                var transport = new HttpTransportBindingElement();

                CustomBinding cb = new CustomBinding(duplex, element, transport);
                
                cb.CloseTimeout = new TimeSpan(0,2,20);
                cb.SendTimeout = new TimeSpan(0, 0, 20);
                cb.OpenTimeout = new TimeSpan(0, 0, 10);
                cb.ReceiveTimeout = new TimeSpan(0, 0, 50);

                duplex.InactivityTimeout = new TimeSpan(0, 5, 50);
                duplex.ClientPollTimeout = new TimeSpan(0, 0, 0, 1);

                this.client = new MyServiceClient(cb, ea);
                this.client.GenerateCustomConfigCompleted += GenerateCustomConfig_Completed;
                this.client.GenerateCustomConfigAsync(true);

    Bom, setei todas as configurações necessarios, como pode-se ver acima, mas ainda continua com a muitaaa lentidão... sera q tem haver com segurança, anti-virus, threads? sei lah, to arriscando ... 

    []s


    Ozzyvegeta
    quarta-feira, 15 de setembro de 2010 22:56