2009-08-18 10 views
9

J'ai un service Web dans lequel j'ai créé une exception personnalisée. Supposons que le nom de cette exception soit InvalidContractException.Intercepter l'exception personnalisée du service Web ASMX

Ce que je voudrais faire est si une étape spécifique se produit, je veux jeter cette exception. Cependant, je ne peux pas comprendre comment le client attraperait le InvalidContractException afin de le gérer correctement.

Ceci est un service Web ASP.Net écrit en C#

Répondre

17

Vous ne pouvez pas le faire:

  1. services Web SOAP font défauts. Les exceptions sont spécifiques à la plate-forme.
  2. Lorsqu'une exception n'est pas gérée dans un service Web ASMX, .NET la traduira en une erreur SOAP. Les détails de l'exception ne sont pas sérialisés.
  3. Dans un client ASMX, une erreur SOAP sera traduite en exception SoapException.

Les services Web ASMX ne prennent pas correctement en charge les pannes SOAP. Il n'y a aucun moyen d'obtenir une exception autre qu'une exception SoapException du côté client.

Encore une autre raison de passer à WCF.


À titre d'exemple de ce que vous ne pouvez pas faire avec ASMX, voici comment fonctionne WCF. WCF vous permet de spécifier, pour chaque opération de service Web qui défauts qu'il peut retourner:

[ServiceContract] 
public interface IMyServiceContract 
{ 
    [FaultContract(typeof(IntegerZeroFault))] 
    [FaultContract(typeof(SomeOtherFault))] 
    [OperationContract] 
    public string GetSomeString(int someInteger); 
} 

[DataContract] 
public class IntegerZeroFault 
{ 
    [DataMember] 
    public string WhichInteger {get;set;} 
} 

[DataContract] 
public class SomeOtherFault 
{ 
    [DataMember] 
    public string ErrorMessage {get;set;} 
} 

public class MyService : IMyServiceContract 
{ 
    public string GetSomeString(int someInteger) 
    { 
     if (someInteger == 0) 
      throw new FaultException<IntegerZeroFault>(
       new IntegerZeroFault{WhichInteger="someInteger"}); 
     if (someInteger != 42) 
      throw new FaultException<SomeOtherFault>(
       new SomeOtherFault{ErrorMessage ="That's not the anaswer"}); 
     return "Don't panic"; 
    } 
} 

Un client WCF peut alors prendre FaultException<SomeOtherFault>, par exemple. Lorsque j'ai essayé cela avec un client Java, il a été capable de capturer SomeOtherFault, que IBM Rational Web Developer a créé pour dériver de la classe Java Exception.

0

Dans votre appel client au service WCF qui jette la faille, vous

essayer ..

faute de capture comme FaultException (de YourService.FooBarFault)

fin essayer

Vous devez déclarer un FaultContract pour la méthode de service qui peut générer des e e défaut, par ex.

_

<FaultContract(GetType(FooBarFault))> _ 

Function yourCall 
+0

Il utilise ASMX. Il l'appelle "ASP.NET Web Services" –

+0

Ah ok .. je pensais qu'il utilisait WCF –

5

Si votre objectif est de lancer une exception afin qu'un utilisateur sache que quelque chose s'est mal passé, qu'une exception spécifique s'est produite et que vous ayez une manipulation spéciale, vous avez une option. Vous devez juste compter sur une implémentation correcte du proxy client (en effet, une option consiste à fournir vous-même les proxys clients).

Il existe un article utile disponible here sur la façon dont fonctionnent les SoapException. Fondamentalement, il s'agit de coder vos détails d'exception (par exemple un code d'erreur) dans le nœud de détail du SoapException, puis de l'analyser du côté client avant de relancer l'exception.

Il n'y a aucun moyen de recréer l'exception comme si elle était lancée à travers la limite de service, et il n'y a aucun moyen automagical d'obtenir quoi que ce soit sauf une exception SoapException côté client.

Questions connexes