see remarks example cref c# wcf exception wcf-data-services

c# - remarks - Active IncludeExceptionDetailInFaults(ya sea desde ServiceBehaviorAttribute o desde el comportamiento de configuraciĆ³n<serviceDebug>) en el servidor



remarks/> (6)

Tengo un servicio WCF que ha estado funcionando perfectamente, y algo ha cambiado y no sé qué.

Obtengo esta excepción:

System.ServiceModel.FaultException: el servidor no pudo procesar la solicitud debido a un error interno. Para obtener más información sobre el error, active IncludeExceptionDetailInFaults (ya sea desde ServiceBehaviorAttribute o desde el comportamiento de configuración) en el servidor para enviar de nuevo la información de excepción al cliente o active el rastreo según la documentación de Microsoft .NET Framework 3.0 SDK e inspeccionar los registros de seguimiento del servidor.

Esto es confuso porque estoy ejecutando .NET 4.0.

¿Dónde puedo activar IncludeExceptionDetailInFaults ? Estoy luchando por encontrarlo.


Como la información de error dice primero, intente aumentar el valor de tiempo de espera tanto del lado del cliente como del lado del servicio de la siguiente manera:

<basicHttpBinding> <binding name="basicHttpBinding_ACRMS" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" openTimeout="00:20:00" receiveTimeout="00:20:00" closeTimeout="00:20:00" sendTimeout="00:20:00"> <readerQuotas maxDepth="32" maxStringContentLength="2097152" maxArrayLength="2097152" maxBytesPerRead="4006" maxNameTableCharCount="16384" /> </binding>

Entonces, no olvide aplicar esta configuración de enlace al punto final haciendo lo siguiente:

<endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding_ACRMS" contract="MonitorRAM.IService1" />

Si lo anterior no puede ayudar, será mejor si puede intentar cargar su proyecto principal aquí, entonces quiero tener una prueba en mi equipo.


Defina un behavior en su archivo .config :

<configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="debug"> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> </behaviors> ... </system.serviceModel> </configuration>

Luego aplique el comportamiento a su servicio a lo largo de estas líneas:

<configuration> <system.serviceModel> ... <services> <service name="MyServiceName" behaviorConfiguration="debug" /> </services> </system.serviceModel> </configuration>

También puede configurarlo programáticamente. Ver esta pregunta


Está en el archivo app.config.

<configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior> <serviceDebug includeExceptionDetailInFaults="true"/>


Si desea hacer esto por código, puede agregar el comportamiento de esta manera:

serviceHost.Description.Behaviors.Remove( typeof(ServiceDebugBehavior)); serviceHost.Description.Behaviors.Add( new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });


También puede configurarlo en la etiqueta [ServiceBehavior] encima de su declaración de clase que hereda la interfaz

[ServiceBehavior(IncludeExceptionDetailInFaults = true)] public class MyClass:IMyService { ... }

Immortal Blue está en lo cierto al no divulgar los detalles de la excepción a una versión publicada públicamente, pero para fines de prueba esta es una herramienta práctica. Siempre apague cuando lo suelte.


También recibía el mismo error, el WCF funcionaba correctamente cuando lo usaba en Dev Environment con mis credenciales, pero cuando alguien más lo usaba en TEST lanzaba el mismo error. Investigué mucho y luego, en lugar de hacer actualizaciones de configuración, manejé una excepción en el método WCF con la ayuda de la excepción de falla. Además, la identidad de la WCF debe establecerse con las mismas credenciales que tienen acceso en la base de datos, alguien podría haber cambiado su autoridad. A continuación, encontrará el código para el mismo:

[ServiceContract] public interface IService1 { [OperationContract] [FaultContract(typeof(ServiceData))] ForDataset GetCCDBdata(); [OperationContract] [FaultContract(typeof(ServiceData))] string GetCCDBdataasXMLstring(); //[OperationContract] //string GetData(int value); //[OperationContract] //CompositeType GetDataUsingDataContract(CompositeType composite); // TODO: Add your service operations here } [DataContract] public class ServiceData { [DataMember] public bool Result { get; set; } [DataMember] public string ErrorMessage { get; set; } [DataMember] public string ErrorDetails { get; set; } }

en su service1.svc.cs puede usar esto en el bloque de captura:

catch (Exception ex) { myServiceData.Result = false; myServiceData.ErrorMessage = "unforeseen error occured. Please try later."; myServiceData.ErrorDetails = ex.ToString(); throw new FaultException<ServiceData>(myServiceData, ex.ToString()); }

Y use esto en la aplicación Cliente como el siguiente código:

ConsoleApplicationWCFClient.CCDB_HIG_service.ForDataset ds = obj.GetCCDBdata(); string str = obj.GetCCDBdataasXMLstring(); } catch (FaultException<ConsoleApplicationWCFClient.CCDB_HIG_service.ServiceData> Fex) { Console.WriteLine("ErrorMessage::" + Fex.Detail.ErrorMessage + Environment.NewLine); Console.WriteLine("ErrorDetails::" + Environment.NewLine + Fex.Detail.ErrorDetails); Console.ReadLine(); }

Simplemente intente esto, será seguro para obtener el problema exacto.