Frage

Ich habe einen einfachen Webservice-Vorgang wie diesen:

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

Und dann habe ich eine Clientanwendung, die den Webdienst nutzt und dann den Vorgang aufruft.Offensichtlich wird es eine Ausnahme auslösen :-)

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

In meinem Catch-Block möchte ich die Nachricht der tatsächlichen Ausnahme extrahieren, um sie in meinem Code zu verwenden.Die abgefangene Ausnahme ist a SoapException, was in Ordnung ist, aber es ist Message Eigentum ist so...

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

...und das InnerException Ist null.

Was ich gerne tun würde, ist das zu extrahieren Message Eigentum der InnerException (Die HelloWorldException Text in meinem Beispiel), kann jemand dabei helfen?Wenn Sie dies vermeiden können, schlagen Sie bitte nicht vor, das zu analysieren Message Eigentum der SoapException.

War es hilfreich?

Lösung

Leider glaube ich nicht, dass das möglich ist.

Die Ausnahme, die Sie in Ihrem Webdienstcode auslösen, wird in einen Soap-Fehler codiert, der dann als Zeichenfolge an Ihren Clientcode zurückgegeben wird.

Was Sie in der SoapException-Nachricht sehen, ist einfach der Text aus dem Soap-Fehler, der nicht wieder in eine Ausnahme umgewandelt, sondern lediglich als Text gespeichert wird.

Wenn Sie unter Fehlerbedingungen nützliche Informationen zurückgeben möchten, empfehle ich die Rückgabe einer benutzerdefinierten Klasse von Ihrem Webdienst, die über eine „Error“-Eigenschaft verfügen kann, die Ihre Informationen enthält.

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

Andere Tipps

Es IST möglich!

Beispiel für einen Servicebetrieb:

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

Kunde, der den Dienst nutzt:

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

Nur eine Sache: Sie müssen in Ihrer web.config „customErrors mode='RemoteOnly'“ oder „On“ festlegen (des Serviceprojekts).

Credits zur Entdeckung von „customErrors“ – http://forums.asp.net/t/236665.aspx/1

Ich bin vor einiger Zeit auf etwas Ähnliches gestoßen und darüber gebloggt.Ich bin mir nicht sicher, ob es genau anwendbar ist, aber es könnte sein.Der Code ist recht einfach, sobald Sie erkennen, dass Sie ein MessageFault-Objekt durchlaufen müssen.In meinem Fall wusste ich, dass das Detail eine GUID enthielt, mit der ich den SOAP-Dienst erneut nach Details abfragen konnte.Der Code sieht so aus:

catch (FaultException soapEx)
{
    MessageFault mf = soapEx.CreateMessageFault();
    if (mf.HasDetail)
    {
        XmlDictionaryReader reader = mf.GetReaderAtDetailContents();
        Guid g = reader.ReadContentAsGuid();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top