53 votes

"Le créateur de ce défaut n'a pas d'indiquer la Raison de" l'Exception"

J'ai le code suivant dans le service WCF pour lancer une coutume responsabilité en se basant sur certaines situations. Je suis Le créateur de ce défaut n'a pas d'indiquer la Raison de" l'exception". 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; }
    }
}

45voto

Michael Kniskern Points 7276

Après quelques addtional de recherche, les éléments suivants du code modifié travaillé:

if(!DidNotPass)
{    
    InvalidRoutingCodeFault fault = new InvalidRoutingCodeFault("Invalid Routing Code - No Approval Started");    
    throw new FaultException<InvalidRoutingCodeFault>(fault, new FaultReason("Invalid Routing Code - No Approval Started"));
}

17voto

Daniel Davis Points 101

La réponse courte est que vous faites rien de mal, il suffit de lire les résultats de manière incorrecte.

Sur le côté client quand vous prenez l'erreur, ce qui est pris est de type System.ServiceModel.FaultException<InvalidRoutingCodeFault>.
Votre InvalidRoutingCodeFault objet est en fait dans l' .detail de la propriété de la FaultException. DONC....

// 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);    
    } 
}

Le Message de la propriété de la FaultException est ce qui est affiché sur la page d'erreur si elle n'est pas fournie comme dans Jean Egerton post, vous verrez la "Le créateur de cette faute ne spécifiez pas une Raison" message. Pour remplir facilement, utilisez les deux paramètre de constructeur, en jetant la faute dans le service, comme suit, de faire passer votre message d'erreur à partir de votre type de panne:

InvalidRoutingCodeFault fault = new InvalidRoutingCodeFault("Invalid Routing Code - No Approval Started");                                          
throw new FaultException<InvalidRoutingCodeFault>(fault, new FaultReason(fault.ErrorMessage));                                      

8voto

Rashmi Pandit Points 9341
serviceDebug includeExceptionDetailInFaults="true"

n'est PAS la solution

Le code suivant fonctionne même avec l' 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 de raison de défaut si ce n'est pas nécessaire. Juste assurez-vous que le FaultContract attribut est correct

5voto

user386451 Points 31

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

// service method implementation

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

CustomFaultMassage est la propriété de contrat de données.

2voto

Rashmi Pandit Points 9341

On peut également rencontrer cette exception si on ne précise pas le FaultContract(typeof(className)) attribut de la méthode

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X