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
A detta di tutti dovrebbe intercettare l'eccezione. Potresti controllare se l'eccezione di cattura è una generica "FaultException" o semplicemente "FaultException". –
Coder
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} –
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 –