Question

J'ai une simple opération de service web comme celui-ci:

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

Et puis j'ai une application client qui utilise le service web et appelle ensuite l'opération.Évidemment, il va lever une exception :-)

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

Dans mon fourre-bloc, ce que je voudrais faire est d'extraire le Message de l'exception pour l'utiliser dans mon code.L'exception interceptée est un SoapException, ce qui est bien, mais c'est Message la 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.

Ce que je voudrais faire est d'extraire le Message propriété de la InnerException (le HelloWorldException texte dans mon exemple), peut aider quelqu'un avec qui?Si vous pouvez l'éviter, s'il vous plaît ne pas suggérer l'analyse de la Message propriété de la SoapException.

Était-ce utile?

La solution

Malheureusement, je ne pense pas que ce soit possible.

L'exception que vous soulevez dans votre code de service web est codé en une erreur Soap, qui ensuite être transmis sous forme de chaîne de retour à votre code client.

Ce que vous voyez dans le SoapException message est tout simplement le texte de l'erreur Soap, ce qui n'est pas convertie en arrière à une exception, mais simplement stockés en tant que texte.

Si vous souhaitez retourner des informations utiles dans des conditions d'erreur alors je vous recommandons de retourner une classe personnalisée de votre service web qui peut avoir une "Erreur" de la propriété 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;
  }
}

Autres conseils

Il EST possible!

Fonctionnement du Service, exemple:

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

Client de la consommation du service:

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

Juste une chose, vous devez définir customErrors mode='RemoteOnly" ou " on " dans votre site web.config (le projet de service).

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

Je suis tombé sur quelque chose de similaire il ya un peu et blogué à ce sujet.Je ne suis pas certain si c'est précisément le cas, mais peut-être.Le code est assez simple une fois que vous vous rendez compte que vous devez passer par un MessageFault à l'objet.Dans mon cas, je savais que les détails figurant un GUID je pourrais utiliser pour ré-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();
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top