Estoy tratando de llegar a un patrón de diseño simple y fácil de usar para el manejo de errores en un servicio wcf .NET (específicamente un servicio wcf activado Silverlight). Si se lanza una excepción en el método de servicio, la aplicación Silverlight verá una CommunicationException que dice "El servidor remoto devolvió un error: NotFound --->" y posiblemente un seguimiento de pila dependiendo de su configuración, lo cual no es útil porque no lo hace Te digo el error real, y generalmente el error real no es "NotFound"..Net WFC/Web service manejo de excepciones patrón de diseño
Al leer servicios web y servicios wcf y excepciones, debe lanzar excepciones estándar de soap/wcf tales como FaultException o SoapException. Por lo tanto, para un servicio wcf necesita ajustar cada método en una captura de prueba, atrapar cada excepción, envolverlo en una FaultException y lanzarlo. Al menos eso es lo que entiendo, corrígeme si estoy equivocado.
Así que he creado mi patrón de diseño:
[ServiceContract(Namespace = "http://MyTest")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DataAccess
{
/// <summary>
/// Error class, handle converting an exception into a FaultException
/// </summary>
[DataContractAttribute]
public class Error
{
private string strMessage_m;
private string strStackTrace_m;
public Error(Exception ex)
{
this.strMessage_m = ex.Message;
this.strStackTrace_m = ex.StackTrace;
}
[DataMemberAttribute]
public string Message
{
get { return this.strMessage_m; }
set { this.strMessage_m = value; }
}
[DataMemberAttribute]
public string StackTrace
{
get { return this.strStackTrace_m; }
set { this.strStackTrace_m = value; }
}
//Convert an exception into a FaultException
public static void Throw(Exception ex)
{
if (ex is FaultException)
{
throw ex;
}
else
{
throw new FaultException<Error>(new Error(ex));
}
}
}
[OperationContract]
[FaultContract(typeof(Error))]
public void TestException()
{
try
{
throw new Exception("test");
}
catch (Exception ex)
{
Error.Throw(ex);
}
}
}
Así que para hacer una larga historia corta, todavía no recibo el error correcto en mi aplicación Silverlight. Inspecciono el objeto AsyncCompletedEventArgs.Error y todavía contiene un objeto CommunicationException con el error genérico. Ayúdenme a crear un patrón de diseño simple y agradable que me permita arrojar fácilmente la excepción correcta del servicio y atraparla fácilmente en la aplicación.
Solo como sugerencia, no complete su código con comentarios. Como SO permite entremezclar el código y el texto, úselo para que las personas no tengan que desplazarse por un bloque de código relativamente pequeño para ver lo que está haciendo. –