Domanda

Ho un applicazione client che tenta ogni 10 secondi per inviare un messaggio nel corso di un servizio Web WCF. Questa applicazione cliente sarà su un computer a bordo di una nave, che sappiamo avrà connettività internet spotty. Vorrei che l'applicazione per provare a inviare i dati tramite il servizio, e se non è possibile, fare la coda dei messaggi fino a che non li può inviare tramite il servizio.

Al fine di verificare questa impostazione, io avviare l'applicazione client e il servizio web (sia sulla mia macchina locale), e tutto funziona bene. Io cerco di simulare la connessione a internet male uccidendo il servizio web e riavviandolo. Appena ho uccido il servizio, ho iniziare a ricevere CommunicationObjectFaultedExceptions - che si prevede. Ma dopo aver riavviato il servizio, io continuo a ottenere tali eccezioni.

Sono abbastanza sicuro che ci sia qualcosa che non sto capendo circa il paradigma di servizio web, ma non so di cosa si tratta. Chiunque può offrire consigli sulla necessità o meno questa configurazione è realizzabile, e in caso affermativo, come risolvere questo problema (vale a dire ristabilire il canale di comunicazione con il servizio web)?

Grazie!

Klay

È stato utile?

Soluzione

proxy del servizio client non possono essere riutilizzati una volta che sono in errore. È necessario disporre di quello vecchio e ricreare una nuova.

È inoltre necessario assicurarsi di chiudere il proxy del servizio clienti in modo corretto. E 'possibile per un proxy di servizio WCF per un'eccezione su una stretta, e se questo accade il collegamento non è chiuso, quindi è necessario interrompere. Utilizzare il "try {Chiudi} / catch {Interrompi}" pattern. anche tenere presente che il metodo dispose chiama close (e quindi può un'eccezione dal dispose), quindi non si può semplicemente utilizzare un utilizzo come con le normali classi monouso.

Ad esempio:

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;
}

C'è un articolo su questo blog qui

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top