2008-08-28 7 views
15

J'ai une simple opération de service Web comme celui-ci:Comment puis-je extraire l'exception interne d'une exception de savon dans ASP.NET?

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

Et puis-je avoir une application client qui utilise le service Web, puis appelle l'opération. De toute évidence, il lancera une exception :-)

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

Dans mon bloc catch, ce que je voudrais faire est extrait le message de l'exception réelle à l'utiliser dans mon code. L'exception est pris une SoapException, ce qui est bien, mais il est Message propriété est comme ça ...

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

... et le InnerException est null. Qu'est-ce que je voudrais faire est d'extraire la propriété Message du InnerException (le texte HelloWorldException dans mon échantillon), quelqu'un peut-il aider avec cela? Si vous pouvez l'éviter, veuillez ne pas suggérer l'analyse de la propriété Message du SoapException.

Répondre

6

Malheureusement, je ne pense pas que ce soit possible. L'exception que vous élevez dans votre code de service Web est en cours d'encodage dans une erreur de carte, qui est ensuite transmise sous forme de chaîne à votre code client. Ce que vous voyez dans le message SoapException est simplement le texte de l'erreur Soap, qui n'est pas convertie en une exception, mais simplement stockée en tant que texte.

Si vous souhaitez renvoyer des informations utiles dans des conditions d'erreur, je vous recommande de renvoyer une classe personnalisée de votre service Web qui peut contenir une propriété "Error" qui contient vos informations.

[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; 
    } 
} 
+1

Pourquoi créer une classe personnalisée si vous pouvez y parvenir sans un? S'il vous plaît examiner ma réponse sur ce post. – BornToCode

1

je suis tombé sur quelque chose de similaire il y a un peu et blogged about it. Je ne suis pas certain que ce soit précisément applicable, mais pourrait l'être. Le code est assez simple une fois que vous vous rendez compte que vous devez passer par un objet MessageFault. Dans mon cas, je savais que le détail contenait un GUID que je pourrais utiliser pour re-interroger le service SOAP pour plus de détails. Le code ressemble à ceci:

catch (FaultException soapEx) 
{ 
    MessageFault mf = soapEx.CreateMessageFault(); 
    if (mf.HasDetail) 
    { 
     XmlDictionaryReader reader = mf.GetReaderAtDetailContents(); 
     Guid g = reader.ReadContentAsGuid(); 
    } 
} 
4

Il EST possible!

exemple de fonctionnement du service:

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

client consommer le service:

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

Juste une chose - vous devez définir le mode customErrors = 'RemoteOnly' ou 'On' dans votre site Web. config (du projet de service).

crédits sur la découverte customErrors - http://forums.asp.net/t/236665.aspx/1

+0

Je pense que vous voulez dire 'throw new SoapException (e.Message, ...' plutôt que le message InnerException de l'exception interceptée. – Timothy

Questions connexes