Estoy tratando de crear algunos personalizado FaultException
. He hecho una clase DataContract
llamada CreateFault
.excepción de error personalizado WCF no captado correctamente en el cliente
[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; }
}
}
Estoy arrojando la falla en un método de servicio.
En IService1.cs
[OperationContract]
[FaultContract(typeof(CreateFault))]
void TestFaultException();
y en Service1.cs
public void TestFaultException()
{
throw new FaultException<CreateFault>(new CreateFault("CreateFault message"), "Message abt exception");
}
cojo el FaultException
en mi cliente.
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)
{
}
}
Ahora aquí viene el problema. Cuando creo un proyecto de aplicación de servicio WCF en Visual Studio 2010, funciona como se esperaba. El error está atrapado en:
catch (FaultException<CreateFault> ex)
Pero cuando se crea un proyecto WCF Biblioteca Servicio con mi costumbre FaultExceptions
el cliente no reconoce la excepción personalizada. En su lugar, detecta el error en:
catch (FaultException ex)
¿Por qué no funciona con WCF Service Application Project?
Editar: Esto es lo que me sale durante la depuración cuando se detecta la excepción de
catch (FaultException ex)
(mecanografiado ex en ventana Inmediato?)
{ "mensaje ABT excepción"}
[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:
Ha encontrado el problema. Tenía dos referencias de servicio que tenían el DataContract de CreateFault. Y estaba usando el incorrecto cuando ejecuté el programa.
Cuando cambié a
catch (FaultException<ServiceReference2.CreateFault> ex)
funcionó
decir de todos, debe capturar la excepción. ¿Podría comprobar si la excepción de captura es una "FaultException" genérica o simplemente "FaultException"? –
Coder
esto es lo que obtengo cuando escribo? Ex en la ventana Inmediato? Ex {"Excepción de mensaje abt"} [System.ServiceModel.FaultException]: {"Message abt exception"} base { System.ServiceModel.CommunicationException}: { "mensaje ABT excepción"} Acción: "http://tempuri.org/IService1/TestFaultExceptionCreateFaultFault" Código: {} System.ServiceModel.FaultCode mensaje: "Mensaje ABT excepción" Motivo: {ABT Mensaje excepción} –
Encontró el problema. Tenía dos referencias de servicio que tenían el DataContract de CreateFault. Y estaba usando el incorrecto cuando ejecuté el programa. Cuando cambié a captura (FaultException Ex) funcionó –