Pregunta

Tengo una aplicación cliente que intenta cada 10 segundos para enviar un mensaje a través de un servicio web WCF. Esta aplicación cliente será en un ordenador a bordo de un barco, que sabemos que va a tener conectividad a Internet irregular. Me gustaría que la aplicación para intentar enviar datos a través del servicio, y si no puede, hacer cola los mensajes hasta que pueda enviarlos a través del servicio.

Con el fin de probar esta configuración, comienzo a la aplicación cliente y el servicio web (tanto en mi máquina local), y todo funciona bien. Trato de simular la mala conexión a internet matando al servicio web y reiniciarlo. Tan pronto como mato al servicio, que comienza a recibir CommunicationObjectFaultedExceptions - que se espera. Pero después de reiniciar el servicio, continúo para conseguir esas excepciones.

Estoy bastante seguro de que hay algo que no soy la comprensión sobre el paradigma de servicios web, pero no sé lo que es eso. ¿Alguien puede ofrecer consejos sobre si esta configuración es posible, y si es así, cómo resolver este problema (es decir, re-establecer el canal de comunicación con el servicio web)?

Gracias!

Klay

¿Fue útil?

Solución

proxies de servicio de cliente no pueden ser reutilizados una vez que han criticado. Debe desechar el viejo y volver a crear una nueva.

También debe asegurarse de que se cierra el proxy de servicio de cliente correctamente. Es posible que un proxy de servicio WCF para lanzar una excepción en una estrecha, y si esto sucede no está cerrada, por lo que debe abortar la conexión. Utilice la opción "Cerrar try {} / catch {} Abortar" patrón. También tenga en cuenta que el método dispose por los pelos (y por lo tanto puede generar una excepción de la dispose), por lo que no se puede simplemente usar un utilizando como con las clases de venta normal.

Por ejemplo:

try
{
    if (yourServiceProxy != null)
    {
        if (yourServiceProxy.State != CommunicationState.Faulted)
        {
            yourServiceProxy.Close();
        }
        else
        {
            yourServiceProxy.Abort();
        }
    }
}
catch (CommunicationException)
{
    // Communication exceptions are normal when
    // closing the connection.
    yourServiceProxy.Abort();
}
catch (TimeoutException)
{
    // Timeout exceptions are normal when closing
    // the connection.
    yourServiceProxy.Abort();
}
catch (Exception)
{
    // Any other exception and you should 
    // abort the connection and rethrow to 
    // allow the exception to bubble upwards.
    yourServiceProxy.Abort();
    throw;
}
finally
{
    // This is just to stop you from trying to 
    // close it again (with the null check at the start).
    // This may not be necessary depending on
    // your architecture.
    yourServiceProxy = null;
}

No es un artículo de blog sobre este aquí

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