9
votes

Attrape personnalisée à partir du service Web ASMX

J'ai un service Web dans lequel j'ai créé une exception personnalisée. Disons que le nom de cette exception est InvalidContractException.

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

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


0 commentaires

3 Réponses :


0
votes

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

Essayez ..

Défaut de capture comme défaillante (de votreservice.foobarfault) Essayez

Vous devez déclarer une condition erronée pour la méthode de service pouvant générer le défaut, par exemple

_ xxx


2 commentaires

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


Ah ok .. je pensais qu'il utilisait WCF



17
votes

Vous ne pouvez pas faire cela:

  1. Les services Web font des défauts de savon. Les exceptions sont spécifiques à la plate-forme. LI>
  2. Lorsqu'une exception est non heurtée dans un service Web ASMX, .NET le traduira en une faute de savon. Les détails de l'exception ne sont pas sérialisés. LI>
  3. dans un client ASMX, un défaut de savon sera traduit en une exception SOAPExException. Li> ol>

    Les services Web ASMX n'ont pas de support approprié pour les défauts de savon. Il n'y a aucun moyen d'obtenir une exception autre qu'une impression SOAPExException du côté du client. P>

    Encore une autre raison de passer à la WCF. P>


    comme exemple de ce que vous Ne peut pas em> faire avec asmx, voici comment fonctionne WCF. WCF vous permet de spécifier, pour chaque opération de service Web, qui défaut, il peut renvoyer: p>

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


0 commentaires

5
votes

Si votre objectif est de lancer une exception afin qu'un utilisateur puisse savoir que quelque chose s'est mal passé, une exception spécifique s'est produite et une manipulation spéciale pour cela, vous avez une option. Vous devez juste compter sur une mise en œuvre correcte du proxy client (en effet, une option est de fournir les proxy clients vous-même).

Il y a un article utile Disponible ici sur la façon dont SOAPException S Work.

Essentiellement, il s'agit d'encoder vos détails d'exception (par exemple, un code d'erreur) dans le nœud de détail de la SOAPException , puis l'analysant sur le côté du client avant de retirer l'exception.

Il n'y a aucun moyen de recréer l'exception comme s'il était jeté sur la limite de service et il n'y a pas de moyen automagifique d'obtenir quoi que ce soit à l'exception d'une parfaite exception du côté du client.


0 commentaires