& # 8220; El creador de esta falla no especificó una Razón & # 8221; Excepción

StackOverflow https://stackoverflow.com/questions/341512

  •  19-08-2019
  •  | 
  •  

Pregunta

Tengo el siguiente código en el servicio WCF para generar un error personalizado basado en ciertas situaciones. Recibo un " El creador de esta falla no especificó una Razón " excepción. ¿Qué estoy haciendo mal?

//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; }
    }
}
¿Fue útil?

Solución

Después de una investigación adicional, el siguiente código modificado funcionó:

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

Otros consejos

La respuesta corta es que no estás haciendo nada malo, solo estás leyendo los resultados incorrectamente.

En el lado del cliente cuando detecta el error, lo que se detecta es del tipo System.ServiceModel.FaultException < InvalidRoutingCodeFault > .
Su objeto InvalidRoutingCodeFault está realmente en la propiedad .detail de FaultException. SO ....

// código de cliente

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

La propiedad de mensaje de FaultException es la que se muestra en la página de error, por lo que si no se completa como en la publicación de John Egerton, verá el mensaje 'El creador de esta falla no especificó un motivo'. Para rellenarlo fácilmente, use el constructor de dos parámetros al lanzar la falla en el servicio de la siguiente manera, pasando su mensaje de error de su tipo de falla:

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

NO es la solución

El siguiente código funciona incluso con 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);   
        }
    }

No es necesario agregar un motivo de falla si no es necesario. Solo asegúrese de que el atributo FaultContract sea correcto

Resolví este problema usando un constructor de dos parámetros.

// service method implementation

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

CustomFaultMassage es propiedad del contrato de datos.

También se puede encontrar esta excepción si no se especifica el atributo FaultContract (typeof (className)) para el método

Si no desea que se le notifiquen tales excepciones, vaya a Depurar - > Excepciones y desmarque " Usuario no manejado " para " Excepciones de Common Language Runtime " o para excepciones específicas.

Tengo un código exactamente como Rashmi tiene y obtuve el "Creador de esta falla ..." error. Estaba sucediendo cuando estaba depurando en VS2010. Encontré esta publicación:

http: // sergecalderara. wordpress.com/2008/11/25/systemservicemodelfaultexception1-was-unhandled-by-user-code/

que explicaba un par de opciones de depuración que necesitaba desactivar. Problema resuelto.

Puede intentar esto en la configuración del servidor (comportamientos - > serviceBehaviors - > behaviour):

<serviceDebug includeExceptionDetailInFaults="true" />

Al usar try catch fuertemente tipado, pude evitar el error "El creador de esta falla no especificó una Razón".

La actualización de la referencia del servicio en el cliente resolvió el problema. Lo mismo podría funcionar para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top