Domanda

Ho un servizio web semplice operazione come questa:

    [WebMethod]
    public string HelloWorld()
    {
        throw new Exception("HelloWorldException");
        return "Hello World";
    }

E poi ho un applicazione client che utilizza il servizio web e quindi chiama l'operazione.Ovviamente, verrà generata un'eccezione :-)

    try
    {
        hwservicens.Service1 service1 = new hwservicens.Service1();
        service1.HelloWorld();
    }
    catch(Exception e)
    {
        Console.WriteLine(e.ToString());
    }

Nel mio blocco catch, quello che vorrei fare è estrarre il Messaggio dell'eccezione effettiva per utilizzarlo nel mio codice.L'eccezione è preso un SoapException, che è bene, ma è Message la struttura è simile a questo...

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Exception: HelloWorldException
   at WebService1.Service1.HelloWorld() in C:\svnroot\Vordur\WebService1\Service1.asmx.cs:line 27
   --- End of inner exception stack trace ---

...e il InnerException è null.

Quello che vorrei fare è estrarre il Message proprietà del InnerException (il HelloWorldException testo nel mio esempio), qualcuno può aiutarmi con questo?Se si può evitare, si prega di non suggerire l'analisi del Message proprietà del SoapException.

È stato utile?

Soluzione

Purtroppo non credo che questo è possibile.

L'eccezione si stanno alzando nel servizio web il codice è stato codificato in una Soap Fault, che poi viene passata come una stringa di codice client.

Quello che si sta vedendo in SoapException messaggio è semplicemente il testo da l'errore Soap, che non è stato riconvertito in un'eccezione, ma semplicemente memorizzato come testo.

Se si desidera restituire informazioni utili in condizioni di errore, quindi mi consiglia di restituire una classe personalizzata dal servizio web che può avere un "Errore" di proprietà che contiene le tue informazioni.

[WebMethod]
public ResponseClass HelloWorld()
{
  ResponseClass c = new ResponseClass();
  try 
  {
    throw new Exception("Exception Text");
    // The following would be returned on a success
    c.WasError = false;
    c.ReturnValue = "Hello World";
  }
  catch(Exception e)
  {
    c.WasError = true;
    c.ErrorMessage = e.Message;
    return c;
  }
}

Altri suggerimenti

Si È possibile!

L'operazione di servizio esempio:

try
{
   // do something good for humanity
}
catch (Exception e)
{
   throw new SoapException(e.InnerException.Message,
                           SoapException.ServerFaultCode);
}

Client consumando il servizio:

try
{
   // save humanity
}
catch (Exception e)
{
   Console.WriteLine(e.Message);    
}

Solo una cosa, è necessario impostare customErrors mode= "RemoteOnly" o Sul web.config (il progetto di servizio).

crediti su customErrors scoperta - http://forums.asp.net/t/236665.aspx/1

Mi sono imbattuto in qualcosa di simile un po ' fa e bloggato su di esso.Io non sono sicuro se è proprio il caso, ma potrebbe essere.Il codice è abbastanza semplice una volta capito che si deve passare attraverso un MessageFault oggetto.Nel mio caso, ho saputo che il dettaglio contenute GUID ho potuto utilizzare per re-interrogare il SAPONE di servizio per i dettagli.Il codice simile a questo:

catch (FaultException soapEx)
{
    MessageFault mf = soapEx.CreateMessageFault();
    if (mf.HasDetail)
    {
        XmlDictionaryReader reader = mf.GetReaderAtDetailContents();
        Guid g = reader.ReadContentAsGuid();
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top