none
El endpoint de mi servicio deja de responder RRS feed

  • Pregunta

  • Hola a todos,

     

    Tengo un inconveniente con el funcionamiento de mi servidor WCF.

    Estoy utilizando  NetTCPBinding y los servicios los levanto mediante ServiceHost como servicio de Windows.

    El problema que tengo es el siguiente, a mi aplicacion acceden 50 usuarios y al comienzo no existe ningun problema, pero al pasar del tiempo empieza responder cada vez mas lento el servicio y llega a un punto que simplemente no responde a ninguna peticion, no me da error solo se queda paralizado y la unica forma en la que vuelve a responder es reiniciando el servicio. 

    Detallo el codigo que utilizo en servidor y en cliente:

     

    --Servidor--

     

    Uri tcpBaseAddress = new Uri("net.tcp://localhost:8523/FBSWebService/PruebaWS");

     

    ServiceHost serviceHost = new ServiceHost(typeof(PruebaWS), tcpBaseAddress);

     

     

    serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true;

     

     

    ServiceThrottlingBehavior serviceThrottlingBehavior = new ServiceThrottlingBehavior();

    serviceThrottlingBehavior.MaxConcurrentCalls = 200;

    serviceThrottlingBehavior.MaxConcurrentInstances = int.MaxValue;

    serviceThrottlingBehavior.MaxConcurrentSessions = 200;

    serviceHost.Description.Behaviors.Add(serviceThrottlingBehavior);

     

    NetTcpBinding tcpBinding = new NetTcpBinding(SecurityMode.Transport, false);

    tcpBinding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None;

    tcpBinding.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign;

    tcpBinding.MaxReceivedMessageSize = 900000000;

    tcpBinding.ReaderQuotas.MaxArrayLength = 900000000;

    tcpBinding.ReaderQuotas.MaxStringContentLength = 900000000;

    tcpBinding.OpenTimeout = new TimeSpan(5, 30, 0);

    tcpBinding.CloseTimeout = new TimeSpan(5, 30, 0);

    tcpBinding.SendTimeout = new TimeSpan(5, 30, 0);

    tcpBinding.ReceiveTimeout = new TimeSpan(5, 30, 0);

    tcpBinding.MaxConnections = 200;

    tcpBinding.MaxBufferSize = 900000000;

    tcpBinding.MaxBufferPoolSize = 900000000;

    tcpBinding.MaxReceivedMessageSize = 900000000;

    tcpBinding.ListenBacklog = 200;

     

    serviceHost.AddServiceEndpoint(typeof(IPruebaWS), tcpBinding, "");

     

    foreach (ServiceEndpoint item in serviceHost.Description.Endpoints)

    item.Behaviors.Add(new CustomBehavior());

     

    serviceHost.Authorization.PrincipalPermissionMode = PrincipalPermissionMode.Custom;

    List<IAuthorizationPolicy> policies = new List<IAuthorizationPolicy>();

    policies.Add(new AuthorizationPolicy());

    serviceHost.Authorization.ExternalAuthorizationPolicies = policies.AsReadOnly();

     

    foreach (OperationDescription operation in serviceHost.Description.Endpoints[0].Contract.Operations)

    operation.Behaviors.Find<DataContractSerializerOperationBehavior>().MaxItemsInObjectGraph = 900000000;

     

     

    serviceHost.Credentials.ServiceCertificate.SetCertificate(

    StoreLocation.LocalMachine, StoreName.Root,

    X509FindType.FindBySubjectName, "localhost");

     

    serviceHost.Open();

     

     

     

    --Cliente --

     

    EndpointAddress endpointAddress = new EndpointAddress("net.tcp://localhost:8523/FBSWebService/PruebaWS");

     

    NetTcpBinding tcpBinding = new NetTcpBinding(SecurityMode.Transport, false);

    tcpBinding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None;

    tcpBinding.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign;

    tcpBinding.MaxReceivedMessageSize = 900000000;

    tcpBinding.ReaderQuotas.MaxArrayLength = 900000000;

    tcpBinding.ReaderQuotas.MaxStringContentLength = 900000000;

    tcpBinding.OpenTimeout = new TimeSpan(5, 30, 0);

    tcpBinding.CloseTimeout = new TimeSpan(5, 30, 0);

    tcpBinding.SendTimeout = new TimeSpan(5, 30, 0);

    tcpBinding.ReceiveTimeout = new TimeSpan(5, 30, 0);

    tcpBinding.MaxConnections = 200;

    tcpBinding.MaxBufferSize = 900000000;

    tcpBinding.MaxBufferPoolSize = 900000000;

    tcpBinding.MaxReceivedMessageSize = 900000000;

    tcpBinding.ListenBacklog = 200;

     

    PruebaWSClient ws = new PruebaWSClient(tcpBinding, endpointAddress);

    foreach (System.ServiceModel.Description.OperationDescription operation in ws.Endpoint.Contract.Operations)                operation.Behaviors.Find<System.ServiceModel.Description.DataContractSerializerOperationBehavior>().MaxItemsInObjectGraph = 900000000; 


    ws.Endpoint.Behaviors.Add(new CustomBehavior());

     MessageSettings settings = new MessageSettings();

    settings.EquipoCliente = System.Net.Dns.GetHostName();

    settings.FechaSistemaCliente = VariablesGenerales.FechaSistema;

    settings.Empresa = VariablesGenerales.SecuencialEmpresa;

    settings.UserName = System.Threading.Thread.CurrentPrincipal.Identity.Name;

    settings.Password = FBSProxies.ClientUsernameTokenManager.Pwd;

    settings.FechaCliente = DateTime.Now;

    settings.RolesCliente = VariablesGenerales.NombresRol;

    ws.InnerChannel.SetHeader("settings", settings);

    int a = 3;

    int b = 4;

    int resultado = ws.Sumar(a,b);

     

     

    Gracias por su ayuda...

     


     

     

     

    jueves, 29 de julio de 2010 20:32

Todas las respuestas

  • Hola Santiagpxp:

     

    Puede ser un tema de recursos de tu servidor adicionalmente, deberias manejar los errores del servicio.

     

    Saludos,


    mzegarra
    viernes, 30 de julio de 2010 17:21
  • Hola, Santiagpxp!

     

    ¿Lograste resolver tu problema?

     

    Si es así sería muy bueno que pudieras compartir con la comunidad cómo lo lograste.

     

    Bendiciones!

    martes, 28 de septiembre de 2010 20:22
  • Hey,

    Revisa la configuración del pool de aplicaciones asociado al sitio web donde tienes desplegado el servicio WCF.

    Si toda la comunicación se realiza a través del canal del callback, el pool puede entrar en estado inactivo, ya que no se registra actividad.

    Revisa la configuración del apartado "Reciclaje", "Intervalo de tiempo regular". Por defecto está a 20 minutos. Si el problema es este, cuando pasen 20 minutos el pool se detiene, por lo que deja de enviar datos a los clientes conectados vía net.tcp. Este evento queda registrado en los eventos del sistema, así que puedes consultarlo. Yo también activaría el log del IIS para obtener más información.

    Saludos.

     

    miércoles, 17 de noviembre de 2010 11:01
  • Tal vez el problema resida en alguna limitación de establecimiento de conexiones al equipo donde reside el servicio.

    Quizá este articulo pueda ayudar:

    http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/1c1ba207-113b-4417-a6a4-a685b2c3881b/

     


    Un Saludo
    jueves, 27 de enero de 2011 14:56