"Le créateur de cette faute n'a pas spécifié de raison" Exception

J'ai le code suivant dans le service WCF pour lancer une erreur personnalisée basée sur certaines situations. Je reçois une exception "le créateur de cette faute n'a pas spécifié de raison". Ce que je fais mal?

//source code
if(!DidItPass)
{
    InvalidRoutingCodeFault fault = new InvalidRoutingCodeFault("Invalid Routing Code - No Approval Started");
    throw new FaultException<InvalidRoutingCodeFault>(fault);
}

//operation contract
[OperationContract]
[FaultContract(typeof(InvalidRoutingCodeFault))]
bool MyMethod();

//data contract
[DataContract(Namespace="http://myuri.org/Simple")]
public class InvalidRoutingCodeFault
{
    private string m_ErrorMessage = string.Empty;

    public InvalidRoutingCodeFault(string message)
    {
        this.m_ErrorMessage = message;
    }

    [DataMember]
    public string ErrorMessage
    {
        get { return this.m_ErrorMessage; }
        set { this.m_ErrorMessage = value; }
    }
}
50
demandé sur Michael Kniskern 2008-12-04 20:49:58

10 réponses

Après quelques recherches supplémentaires, le code modifié suivant a fonctionné:

if(!DidItPass)
{    
    InvalidRoutingCodeFault fault = new InvalidRoutingCodeFault("Invalid Routing Code - No Approval Started");    
    throw new FaultException<InvalidRoutingCodeFault>(fault, new FaultReason("Invalid Routing Code - No Approval Started"));
}
41
répondu Michael Kniskern 2015-01-29 16:54:06

La réponse courte est que vous ne faites rien de mal, en lisant simplement les résultats de manière incorrecte.

Du côté client lorsque vous attrapez l'erreur, ce qui est intercepté est du type System.ServiceModel.FaultException<InvalidRoutingCodeFault>.
Votre objet InvalidRoutingCodeFault est en fait dans la propriété .detail de FaultException. SI....

/ / Code client

private static void InvokeMyMethod() 
{ 
    ServiceClient service = new MyService.ServiceClient(); 

    try 
    { 
        service.MyMethod(); 
    } 
    catch (System.ServiceModel.FaultException<InvalidRoutingCodeFault> ex) 
    { 
        // This will output the "Message" property of the System.ServiceModel.FaultException
        // 'The creator of this fault did not specify a Reason' if not specified when thrown
        Console.WriteLine("faultException Message: " + ex.Message);    
        // This will output the ErrorMessage property of your InvalidRoutingCodeFault type
        Console.WriteLine("InvalidRoutingCodeFault Message: " + ex.Detail.ErrorMessage);    
    } 
}

La propriété Message de FaultException est ce qui est affiché sur la page d'erreur, donc si elle n'est pas remplie comme dans le post de John Egerton, vous verrez le 'le créateur de cette faute n'a pas spécifié un message de raison. Pour le remplir facilement, utilisez le constructeur à deux paramètres lorsque vous lancez le défaut dans le service comme suit, en passant votre message d'erreur à partir de votre type de défaut:

InvalidRoutingCodeFault fault = new InvalidRoutingCodeFault("Invalid Routing Code - No Approval Started");                                          
throw new FaultException<InvalidRoutingCodeFault>(fault, new FaultReason(fault.ErrorMessage));                                      
16
répondu Daniel Davis 2012-09-10 20:12:35
serviceDebug includeExceptionDetailInFaults="true"

N'est pas la solution

Le code suivant fonctionne même avec les serviceDebug includeExceptionDetailInFaults="false"

// data contract 

[DataContract]
public class FormatFault
{
    private string additionalDetails;

    [DataMember]
    public string AdditionalDetails
    {
        get { return additionalDetails; }
        set { additionalDetails = value; }
    }
}

// interface method declaration

    [OperationContract]
    [FaultContract(typeof(FormatFault))]
    void DoWork2();

// service method implementation

    public void DoWork2()
    {
        try
        {
            int i = int.Parse("Abcd");
        }
        catch (FormatException ex)
        {
            FormatFault fault = new FormatFault();
            fault.AdditionalDetails = ex.Message;
            throw new FaultException<FormatFault>(fault);
        }
    }

// client calling code

    private static void InvokeWCF2()
    {
        ServiceClient service = new ServiceClient();

        try
        {
            service.DoWork2();
        }
        catch (FaultException<FormatFault> e)
        {
            // This is a strongly typed try catch instead of the weakly typed where we need to do -- if (e.Code.Name == "Format_Error")
            Console.WriteLine("Handling format exception: " + e.Detail.AdditionalDetails);   
        }
    }

Il n'est pas nécessaire d'ajouter une raison de défaut si ce n'est pas nécessaire. Assurez-vous simplement que L'attribut FaultContract est correct

8
répondu Rashmi Pandit 2012-12-17 08:54:24

J'ai résolu ce problème en utilisant un constructeur à deux paramètres.

// service method implementation

 throw new FaultException<FormatFault>(fault,new FaultReason(fault.CustomFaultMassage)); 

CustomFaultMassage est une propriété du contrat de données.

4
répondu user386451 2012-07-09 10:58:14

On peut aussi rencontrer cette exception si l'on ne spécifie pas L'attribut FaultContract(typeof(className)) pour la méthode

2
répondu Rashmi Pandit 2009-01-28 11:21:37

J'ai du code exactement comme Rashmi A et j'ai eu le " le créateur de cette faute...." erreur. Cela se passait quand je déboguais dans VS2010. J'ai trouvé ce post:

Http://sergecalderara.wordpress.com/2008/11/25/systemservicemodelfaultexception1-was-unhandled-by-user-code/

Qui a expliqué quelques options de débogage que j'avais besoin de désactiver. Le problème est résolu.

1
répondu ScottG 2009-11-18 00:56:41

Si vous ne souhaitez pas être averti de telles exceptions, allez dans Debug - > Exceptions et décochez "User-unhandled "pour" Common Language Runtime Exceptions " ou pour des exceptions spécifiques.

1
répondu sandeep patil 2010-04-14 09:39:11

Vous pourriez essayer ceci dans la configuration du serveur (behaviors -> serviceBehaviors -> comportement):

<serviceDebug includeExceptionDetailInFaults="true" />
0
répondu Chris Porter 2008-12-04 18:12:34

En utilisant try catch fortement typé, j'ai pu me déplacer avec l'erreur "le créateur de cette faute n'a pas spécifié de raison".

0
répondu 2009-04-15 00:43:55

La mise à jour de la référence de service dans le client a résolu le problème. La même chose pourrait fonctionner pour vous.

0
répondu pencilslate 2010-09-21 22:50:45