2012-02-27 17 views
5

Sto tentando di creare un numero personalizzato FaultException. Ho creato una classe DataContract denominata CreateFault.Eccezione personalizzata errore WCF non rilevata correttamente nel client

[DataContract] 
public class CreateFault 
{ 
    private string report; 

    public CreateFault(string message) 
    { 
     this.report = message; 
    } 

    [DataMember] 
    public string Message 
    { 
     get { return this.report; } 
     set { this.report = value; } 
    } 
} 

Sto quindi lanciando l'errore in un metodo di servizio.

In IService1.cs

[OperationContract] 
[FaultContract(typeof(CreateFault))] 
void TestFaultException(); 

e in Service1.cs

public void TestFaultException() 
{ 
    throw new FaultException<CreateFault>(new CreateFault("CreateFault message"), "Message abt exception"); 
} 

prendo il FaultException nel mio client.

private void btnTest_Click(object sender, RoutedEventArgs e) 
{ 
    try 
    { 
     ServiceReference1.Service1Client client = new ServiceReference1.Service1Client(); 
     client.TestFaultException(); 
    } 
    catch (FaultException<CreateFault> ex) 
    { 
     MessageBox.Show(ex.Detail.Message, "Success", MessageBoxButton.OK, MessageBoxImage.Error); 
    } 
    catch (FaultException ex) 
    { 
     MessageBox.Show(ex.Message, "Failure", MessageBoxButton.OK, MessageBoxImage.Error); 
    } 
    catch (Exception ex) 
    { 
    } 
} 

Ora arriva il problema. Quando creo un progetto di applicazione servizio WCF in Visual Studio 2010 funziona come previsto. L'errore e 'colto in:

catch (FaultException<CreateFault> ex) 

Ma quando creo un progetto di servizio WCF Biblioteca con mia abitudine FaultExceptions il client non riconosce la mia eccezione personalizzata. Rileva invece l'errore in:

catch (FaultException ex) 

Perché non funziona con il progetto di applicazione del servizio WCF?

Edit: Questo è ciò che ottengo durante il debug quando si cattura l'eccezione nel

catch (FaultException ex) 

(digitato ex nella finestra immediata?)

{ "messaggio circa eccezione"}

[System.ServiceModel.FaultException<WpfApplication1.ServiceReference2.CreateFault>]: {"Message abt exception"} 
base {System.ServiceModel.CommunicationException}: {"Message abt exception"} 
Action: "http://tempuri.org/IService1/TestFaultExceptionCreateFaultFault" 
Code: {System.ServiceModel.FaultCode} 
Message: "Message abt exception" 
Reason: {Message abt exception} 

Edit2:

Trovato il problema. Ho avuto due riferimenti al servizio che avevano entrambi i CreateFault DataContract. E stava usando quello sbagliato quando ho eseguito il programma.

Quando ho cambiato per

catch (FaultException<ServiceReference2.CreateFault> ex) 

ha funzionato

+0

A detta di tutti dovrebbe intercettare l'eccezione. Potresti controllare se l'eccezione di cattura è una generica "FaultException " o semplicemente "FaultException". – Coder

+0

questo è ciò che ottengo quando digito ex in Finestra Immediata ex { "messaggio circa eccezione"} [System.ServiceModel.FaultException ]:?? { "Messaggio circa eccezione"} { di base System.ServiceModel.CommunicationException}: { "message circa eccezione"} Azione: "http://tempuri.org/IService1/TestFaultExceptionCreateFaultFault" Codice: {} System.ServiceModel.FaultCode messaggio: "Messaggio circa eccezione" Motivo: {circa Messaggio exception} –

+0

Trovato il problema. Ho avuto due riferimenti al servizio che avevano entrambi i CreateFault DataContract. E stava usando quello sbagliato quando ho eseguito il programma. Quando ho cambiato per catch (FaultException ex) ha funzionato –

risposta

4

trovato il problema. Ho avuto due riferimenti al servizio che avevano entrambi i CreateFault DataContract. E stava usando quello sbagliato quando ho eseguito il programma.

Quando ho cambiato per

catch (FaultException<ServiceReference2.CreateFault> ex) 

ha funzionato

Problemi correlati