Frage

Ich habe den folgenden Code im WCF -Dienst, um einen benutzerdefinierten Fehler basierend auf bestimmten Situationen zu werfen. Ich bekomme einen "Der Schöpfer dieses Fehlers hat keinen Grund angegeben". Was mache ich falsch?

//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; }
    }
}
War es hilfreich?

Lösung

Nach einigen addtionalen Forschungen funktionierte der folgende geänderte Code:

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

Andere Tipps

Die kurze Antwort ist, dass Sie nichts falsch machen, nur die Ergebnisse falsch lesen.

Auf der Clientseite, wenn Sie den Fehler aufnehmen, ist das, was gefangen wird System.ServiceModel.FaultException<InvalidRoutingCodeFault>.
Dein InvalidRoutingCodeFault Objekt ist tatsächlich in der .detail Eigenschaft der Verwerfungen. ALSO....

// Clientcode

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

Die Meldungseigenschaft der Verwerfungen wird auf der Fehlerseite angezeigt. Wenn sie also nicht wie in John Egertons Post besiedelt ist, werden Sie den Schöpfer dieses Fehlers nicht feststellen, die keine Grund angegeben haben. Um es einfach zu bevölkern, verwenden Sie den beiden Parameterkonstruktor, wenn Sie den Fehler in den Dienst wie folgt werfen und Ihre Fehlermeldung von Ihrem Fehlertyp übergeben:

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

ist nicht die Lösung

Der folgende Code funktioniert sogar mit 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);   
        }
    }

Es ist nicht erforderlich, einen Fehler zu erhöhen, wenn dies nicht erforderlich ist. Stellen Sie einfach sicher, dass das Fehlerunternehmensattribut korrekt ist

Ich habe dieses Problem unter Verwendung eines zwei Parameterkonstruktierers gelöst.

// service method implementation

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

CustomFaultMassage ist Eigenschaft aus Datenvertrag.

Man kann diese Ausnahme auch begegnen, wenn man das Attribut "Fehlercontract (TypeOF (ClassName)) für die Methode nicht angibt

Wenn Sie nicht über solche Ausnahmen informiert werden möchten, gehen Sie zu Debug -> Ausnahmen und deaktivieren Sie "benutzerfreundlich" für "gemeinsame Sprachlaufzeitausnahmen" oder für bestimmte Ausnahmen.

Ich habe Code genau wie Rashmi und ich habe den Fehler "Der Schöpfer dieses Fehlers ...". Es geschah, als ich in VS2010 debuggierte. Ich habe diesen Beitrag gefunden:

http://serdecalderara.wordpress.com/2008/11/25/SystemServicemodelfaultException1-was-unhandled-by-user-code/

Das erklärte ein paar Debugging -Optionen, die ich ausschalten musste. Problem gelöst.

Sie können dies in der Serverkonfiguration (Verhalten -> ServiceBehaviors -> Verhalten) versuchen:

<serviceDebug includeExceptionDetailInFaults="true" />

Durch die Verwendung von stark getipptem Versuch konnte ich mit dem Fehler "Der Schöpfer dieses Fehlers haben keinen Grund angegeben" herumkommen.

Die Aktualisierung der Servicereferenz im Client löste das Problem. Gleiches könnte für Sie funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top