Pregunta

Tengo un servicio WCF y una aplicación con una referencia de servicio, y con la aplicación tengo un bucle y en cada iteración realiza una llamada a un método en este servicio web WCF.

El problema es que después de aproximadamente 9 llamadas, simplemente se detiene... y si presionas Pause botón de VS, verás que se queda atascado en la línea donde realiza la llamada.

Después de un tiempo esperándolo, este Excepción de tiempo de espera es aventado:

El canal de solicitud se agotó mientras esperaba una respuesta después de 00: 00: 59.9970000.Aumente el valor de tiempo de espera pasado a la llamada para solicitar o aumentar el valor de SendTimeOut en la vinculación.El tiempo asignado a esta operación puede haber sido una parte de un tiempo de espera más largo.


Investigué un poco sobre esto y encontré algunas soluciones que implicaban editar app.config en la aplicación, y aquí hay extractos de ellas:

<serviceBehaviors>
    <behavior name="ThrottlingIssue">
        <serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" />
    </behavior>
</serviceBehaviors>

.

<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
 maxArrayLength="2147483647" 
 maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 

Luego, después de dejar de depurar, después de un par de minutos, aparece un mensaje de error que me dice que Fallo catastrófico ha ocurrido.

¿Como puedo solucionar este problema?No tuve este problema cuando trabajaba con un servicio web normal.


Como referencia, aquí está el completo. app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="ThrottlingIssue">
                    <serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IDBInteractionGateway" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                        maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="Message">
                        <transport clientCredentialType="Windows" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            algorithmSuite="Default" establishSecurityContext="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:28918/DBInteractionGateway.svc"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IDBInteractionGateway"
                contract="DBInteraction.IDBInteractionGateway" name="WSHttpBinding_IDBInteractionGateway">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

[Actualización] Solución:

Aparentemente, después de cada solicitud tienes que Close la conexión... Ahora estoy cerrando la conexión después de cada solicitud y está funcionando de maravilla.

Aunque lo que todavía no puedo entender es que en mi app.config, configuré mis maxConcurrentCalls y maxConcurrentSessions en 500 y, sin embargo, solo puedo crear 10.¿Alguien tiene alguna respuesta para eso?(tal vez tenga algún problema en mi app.config publicado arriba)

La respuesta a la pregunta anterior (ahora discontinua) es porque estaba editando el cliente. app.config, no el archivo de configuración del servicio (web.config)

¿Fue útil?

Solución

El número predeterminado de conexiones simultáneas permitidas es de 10.
Lo más probable es que su cliente no está cerrando las conexiones.

Para aumentar el número de llamadas simultáneas, que tendrá que añadir su comportamiento a la configuración del servicio, no el cliente.

Otros consejos

Una llamada a clientservice.close () va a resolver el problema.

Me encontré con este problema esta semana y yo no era capaz de ser determinante de lo que estaba pasando. De hecho, me hice cambiar mi llamada a mi servicio a Dispose() el cliente de servicio, pero no parecen tener ningún efecto. Al parecer, hubo otra llamada de servicio al acecho en alguna parte.

Lo que puede ser interesante para tener en cuenta es lo que me hizo decidir que se trataba de no el problema: este límite no está relacionado con el número real de conexiones de socket para el servicio web. Al llegar al límite maxConcurrentSessions, todavía hay solamente una conexión de socket real . Estaba revisando esto con netstat, lo que me llevó a la conclusión equivocada. Por lo tanto, no hay que confundir las sesiones con tomas .

Tenemos interfaces definidas para todos nuestros servicios WCF, por lo que tengo la intención de adaptar este modelo en mi código ahora:

IMyService service = new MyServiceClient();
using (service as IDisposable)
{
    service.MyServiceMethod();
}

Lo que también es interesante, es que el problema no se produjo por mí cuando los servicios (y página web) se alojan en IIS. La configuración es (casi) idénticos, sin embargo, no podía reproducir este comportamiento en esa máquina. Supongo que es una buena cosa:)

@ John Saunders (sobre la asignación variable en using):

Yo suelo hacer poner la asignación de variables en la declaración using. Pero el IMyService que se genera no es convertir implícitamente a IDisposable. Si realmente quería la asignación de allí, supongo que la alternativa sería:

IService service;
using ((service = new ServiceClient()) as IDisposable)
{
}

Eso todavía deja el problema del ámbito de las variables estar equivocado sin embargo. La referencia a IService service es inutilizable, pero aún en su alcance. Así que esto sería mejor en este aspecto:

using (IDisposable serviceDisposable = new ServiceClient())
{
     IService service = (IService)serviceDisposable;
}

Eso me obliga a introducir un nombre de variable adicional embargo. * Meh *

Esto se puede resolver mediante la creación de clase singleton como interfaz entre referencia de servicio web y la aplicación. A continuación, se creará sólo una instancia de referencia de servicio.

class ServiceInterface
{
     private static ServiceInterface  _instance;
     private ServiceClient _service = new ServiceClient ;
     private ServiceInterface()
     {
       //Prevent accessing default constructor
     }

     public static ServiceInterface GetInstance()
     {

     if(_instance == null)

     {

      _instance = new ServiceInterface();

    }

        return _instance;



 }


   // You can add your functions to access web service here

    Public int PerformTask()
    {
         return _service.PerformTask();
    }
}

Puede usted configurar el seguimiento y ejecutar el bucle? Puede ser que el canal está convirtiendo criticado y haciendo que el cliente el tiempo de espera.

Después de tirar mis pelos durante un más problema similar que no fue resuelto por cualquiera de las Close() o Dispose() Me gustaría añadir una solución simple que hizo que mi día, es decir, mediante el aumento de la ServicePointManager.DefaultConnectionLimit que es por defecto 2.

  

"La propiedad DefaultConnectionLimit establece el número máximo predeterminado de conexiones simultáneas que el objeto ServicePointManager asigna a la propiedad ConnectionLimit al crear objetos ServicePoint."

En mi caso mi solicitud correctamente conectado a mi servicio remoto 2 veces, en el tercer intento, simplemente no trató de conectarse al servicio. En su lugar, esperó un rato antes de tiempo de espera con el mismo mensaje de error como en la pregunta anterior. El aumento de DefaultConnectionLimit resuelve esto. Para añadir a la frustración este comportamiento fue algo al azar -. En un caso de 10 el servicio web se invocó con éxito múltiples (> 2) veces

La solución se origina y se discuten más adelante estas dos hilos: WCF-timeout-excepción-detailed- investigación y WCF servicio de estrangulamiento de . resuelto mi problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top