2010-10-01 3 views
8

J'ai un service Web asp.net classique (asmx) et une méthode web. J'ai besoin de lancer une exception personnalisée pour certains cas dans ma méthode Web, et j'ai besoin d'attraper cette exception personnalisée spécifique où j'appelle la méthode de service Web.Attraper une exception personnalisée lancée par un WebMethod sur ASP.NET WebService

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class WebService : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public HelloWorldOutput HelloWorld(HelloWorldInput input) 
    { 
     try 
     { 
      // My Code 
      return new HelloWorldOutput(); 
     } 
     catch (Exception ex) 
     { 
      throw new HelloWorldException("Hello World Exception", ex); 
     } 
    } 
} 

entrée, de sortie et les classes d'exception comme échantillon:

public class HelloWorldInput { } 
public class HelloWorldOutput { }  

[Serializable] 
public class HelloWorldException : Exception 
{ 
    public HelloWorldException() { } 
    public HelloWorldException(string message) : base(message) { } 
    public HelloWorldException(string message, Exception inner) 
     : base(message, inner) { } 
    protected HelloWorldException(
     System.Runtime.Serialization.SerializationInfo info, 
     System.Runtime.Serialization.StreamingContext context) 
     : base(info, context) { } 
} 

Du côté client, j'ai besoin:

public static void Main() 
{ 
    WebService service = new WebService(); 
    try 
    { 
     service.HelloWorld(new HelloWorldInput()); 
    } 
    catch (HelloWorldException ex) 
    { 
     // Do sth with HelloWorldException 
    } 
    catch (Exception ex) 
    { 
     // Do sth with Exception 
    } 
} 

Cependant, je ne peux pas le faire parce que quand j'ajoute la référence de service Web sur le client, j'ai classe de service, classes d'entrée et de sortie, mais je n'ai pas de classe d'exception personnalisée.

également un autre problème est que, j'ai aussi des problèmes avec la sérialisation classe d'exception (en raison de la propriété Exception.Data implémente l'interface IDictionary)

Est-il possible de le faire à ma façon, ou suis-je dans un environnement complètement mal, ou y a-t-il quelque chose qui me manque sur les fondamentaux des services web?

Merci.

Répondre

11

Service Web ASP.NET peut jeter tout type d'exception: SoapException , HelloWorldException ou quoi que ce soit. Toutefois, l'exception est sérialisée dans un élément SOAP Fault et quel que soit le type de l'exception lancée dans le service, l'exception est convertie en exception SoapException lors de la désérialisation. Par conséquent, il n'est pas possible d'attraper le HelloWorldException avec mon bloc catch dans ma question, même si je déploie le HelloWorldException sur le client.

Pour un client ASP.NET, la seule manière est d'intercepter l'exception en tant que SoapException et de la gérer par sa propriété Actor ou SoapFaultSubCode.

J'ai essentiellement résolu mon problème comme ci-dessous:

Service Web:

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class WebService : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public HelloWorldOutput HelloWorld(HelloWorldInput input) 
    { 
     try 
     { 
      // My Code 
      return new HelloWorldOutput(); 
     } 
     catch (Exception ex) 
     { 
      throw new SoapException("Hello World Exception", 
       SoapException.ServerFaultCode, "HelloWorld", ex); 
     } 
    } 
} 

Client:

public static void Main() 
{ 
    WebService service = new WebService(); 
    try 
    { 
     service.HelloWorld(new HelloWorldInput()); 
    } 
    catch (SoapException ex) 
    { 
     if(ex.Actor == "HelloWorld") 
      // Do sth with HelloWorldException 
    } 
    catch (Exception ex) 
    { 
     // Do sth with Exception 
    } 
} 

En collaboration avec le document que Bryce Fischer a écrit dans sa réponse; ces documents msdn contient également des informations utiles sur le lancement et la gestion des exceptions de service Web.

How to: Throw Exceptions from a Web Service Created Using ASP.NET

How to: Handle Exceptions Thrown by a Web Service Method

+0

Vous devez définir customErrors mode = 'RemoteOnly' ou 'On' sur votre site Web.config – eddy

4

This peut être utile. On dirait que vous aurez une exception SoapException, mais vous pouvez inspecter les détails pour déterminer si c'est votre classe ou non.

Side note, d'avoir accès à « HelloWorldException », vous pouvez la retirer dans un assemblage séparé et déployer que sur le client ...

+0

Le lien que vous avez partagé a été très utile Bryce. Merci. Cela m'aide à comprendre le comportement des exceptions de service Web. Cependant, le déploiement de la classe d'exception au client sera un choix tardif pour moi. Je vais réfléchir au sujet pendant un moment. Merci beaucoup. –

Questions connexes