2012-02-27 17 views
5

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ó

+0

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

+0

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} –

+0

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ó –

Respuesta

4

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ó

Cuestiones relacionadas