locked
Intercettare EndpointNotFoundException RRS feed

  • Domanda

  • Ciao a tutti,

    Su una App per Windows Phone 8 che sfrutta i servizi forniti da un webservice, vorrei poter capire quando il webservice non è raggiungibile.

    Per fare questo, su Windows 8/8.1/RT, intercetto l'eccezione EndpointNotFoundException e mi comporto di conseguenza.

    Tuttavia la stessa cosa, sembra non funzionare su WindowsPhone8. Addirittura, se il server non è raggiungibile, il mio codice non solleva nessun tipo di eccezione:

    try{ WebServiceClient ws = new WebServiceClient(); MessageBox.Show("Creato WebService Client!"); ws.myMethodDataCompleted += finito;

    ws.myMethodDataAsync(); } catch (Exception e) { MessageBox.Show("Errore generico"); }


    In questo caso, non si entra mai nel blocco catch ma il programma solleva comunque una eccezione (System.ServiceModel.CommunicationException) in reference.cs (l'eccezione non viene intercettata dal codice di reference.cs).

    E' un comportamento normale? Come posso risolvere?


    CP http://www.fjmsoftware.altervista.org


    • Modificato CLROS sabato 28 settembre 2013 21:49
    sabato 28 settembre 2013 21:48

Risposte

  •              //qui risalgo all'errore (come?) e lo gestisco

    Se vuoi gestire quell'eccezione specifica, basta controllare il contenuto di e.Error

    if (e.Error == null)
    {
       // tutto ok
    }
    else if (e.Error is System.ServiceModel.CommunicationException)
    {
       // impossibile connettersi
    }
    else
    {
       // altro errore
    }
    A questo punto mi chiedo se è possibile sapere se il server è disponibile senza invocare esplicitamente nessun metodo del webservice...

    No, in generale non e' possibile. Il web server (che hosta il web service) potrebbe rispondere diversamente (o non rispondere affatto) se la richiesta che gli viene fatta non gli piace. Per questo il client puo' sapere se la connessione va a buon fine solo con una corretta chiamata ad un metodo.


    SMS Access API - Windows Phone Dev Feedback


    • Modificato Marco Mura domenica 29 settembre 2013 19:46
    • Contrassegnato come risposta CLROS domenica 29 settembre 2013 22:12
    domenica 29 settembre 2013 19:43
  • Ciao,

    ti avevo risposto qui : http://forum.aspitalia.com/forum/post/399524/Web-Service-Windows-Phone.aspx

    in ogni caso copio ed incollo :

    Ciao,
    prova così :
    private void finito(object sender, myMethodDataCompletedEventArgs e)
            {
                try
                {
                    if (e.Error != null) throw e.Error;
                    MessageBox.Show("Città: " + e.Result.citta);
                    //è preferibile usare uno string.Format:
                    //MessageBox.Show(string.Format("Città: {0}",e.Result.citta));
                }
                catch (Exception error)
                {
                    MessageBox.Show(error.Message);
                }
            }
    


    o più semplicemente :

    private void finito(object sender, myMethodDataCompletedEventArgs e)
            {
               if (e.Error != null) MessageBox.Show(e.Error.Message);
               else MessageBox.Show("Città: " + e.Result.citta);
            }

    • Contrassegnato come risposta CLROS domenica 29 settembre 2013 22:11
    domenica 29 settembre 2013 15:46

Tutte le risposte

  • L'eccezione che vedi viene sollevata in un thread non gestito da te, quindi visual studio non rileva che e' gestita e interrompe l'esecuzione.

    Tuttavia il framework gestisce l'eccezione, e se continui l'esecuzione (in debug) o se lo esegui nel device, vedrai che viene invocata la tua callback Completed.
    Nell'event args della callback troverai l'eccezione nella property Error.


    SMS Access API - Windows Phone Dev Feedback


    • Modificato Marco Mura domenica 29 settembre 2013 13:11
    domenica 29 settembre 2013 13:10
  • Questo vuol dire che non dovrei più gestire una eccezione ma controllare un codice di errore?

    Il codice seguente potrebbe andare bene?

     private void finito(object sender, FJMService.myMethodDataCompletedEventArgs e)
            {
                if (e.Error == null)
                {
    		//Qui va tutto bene! 
               }	 
                else
              {
                 //qui risalgo all'errore (come?) e lo gestisco
               }
    }	


    CP http://www.fjmsoftware.altervista.org

    domenica 29 settembre 2013 15:43
  • Ciao,

    ti avevo risposto qui : http://forum.aspitalia.com/forum/post/399524/Web-Service-Windows-Phone.aspx

    in ogni caso copio ed incollo :

    Ciao,
    prova così :
    private void finito(object sender, myMethodDataCompletedEventArgs e)
            {
                try
                {
                    if (e.Error != null) throw e.Error;
                    MessageBox.Show("Città: " + e.Result.citta);
                    //è preferibile usare uno string.Format:
                    //MessageBox.Show(string.Format("Città: {0}",e.Result.citta));
                }
                catch (Exception error)
                {
                    MessageBox.Show(error.Message);
                }
            }
    


    o più semplicemente :

    private void finito(object sender, myMethodDataCompletedEventArgs e)
            {
               if (e.Error != null) MessageBox.Show(e.Error.Message);
               else MessageBox.Show("Città: " + e.Result.citta);
            }

    • Contrassegnato come risposta CLROS domenica 29 settembre 2013 22:11
    domenica 29 settembre 2013 15:46
  • Grazie e scusa! Non avevo visto la tua risposta su ASPItalia! 

    A questo punto mi chiedo se è possibile sapere se il server è disponibile senza invocare esplicitamente nessun metodo del webservice...


    CP http://www.fjmsoftware.altervista.org

    domenica 29 settembre 2013 16:14
  • Non devi scusarti, ci mancherebbe...

    comunque anche se non invochi dal web service dovresti in ogni caso contattare l'indirizzo per sapere se è disponibile, quindi non è che cambi molto...

    domenica 29 settembre 2013 16:45
  •              //qui risalgo all'errore (come?) e lo gestisco

    Se vuoi gestire quell'eccezione specifica, basta controllare il contenuto di e.Error

    if (e.Error == null)
    {
       // tutto ok
    }
    else if (e.Error is System.ServiceModel.CommunicationException)
    {
       // impossibile connettersi
    }
    else
    {
       // altro errore
    }
    A questo punto mi chiedo se è possibile sapere se il server è disponibile senza invocare esplicitamente nessun metodo del webservice...

    No, in generale non e' possibile. Il web server (che hosta il web service) potrebbe rispondere diversamente (o non rispondere affatto) se la richiesta che gli viene fatta non gli piace. Per questo il client puo' sapere se la connessione va a buon fine solo con una corretta chiamata ad un metodo.


    SMS Access API - Windows Phone Dev Feedback


    • Modificato Marco Mura domenica 29 settembre 2013 19:46
    • Contrassegnato come risposta CLROS domenica 29 settembre 2013 22:12
    domenica 29 settembre 2013 19:43
  • Grazie a tutti per le esaurienti risposte!

    CP http://www.fjmsoftware.altervista.org

    domenica 29 settembre 2013 22:11