Tengo un servicio web asp.NET (no WCF pero el .asmx clásico con WebMethods) que arroja excepciones. Las excepciones todas derivan de una de las dos clases de excepción de base (ambos de los cuales se derivan de Excepción):¿Cómo puedo determinar el tipo de excepción lanzada por un servicio web asp.net?
public class InputException : Exception
{
....
}
public class FatalException : Exception
{
....
}
public class NoFilesFound: FatalException
{
....
}
....
El servicio web en este momento inicia la excepción, según sea necesario. En mi código de cliente que puedo detectar las excepciones y veo el mensaje como este:
Server was unable to process request. ---> There were no files found
Sin embargo, la excepción es de tipo FaultException (como se ve cuando lo haga .GetType() en la excepción capturada). El cliente que realiza la llamada necesita poder diferenciar entre una InputException y una FatalException (y diferenciar de manera óptima entre las derivadas individuales, pero eso no es tan importante). En este momento, la única forma de hacerlo es analizar el mensaje, quitar el texto antes de "--->" y activar el texto. Eso claramente no es óptimo.
Sé que puedo lanzar SoapExceptions con Código personalizado, pero quiero evitar eso si es posible. Además, parece diseñado para aquellos que se ocupan de XML, pero todo nuestro código de servicio web no toca XML, ya que ya está deserializado para nosotros.
En resumen, ¿hay alguna manera de lanzar excepciones personalizadas desde el servicio web y para que el cliente llamante pueda diferenciar entre las excepciones?
¡Gracias! Me pregunto si puedo hacer que mis clases personalizadas se deriven de SoapException y luego use el constructor para construir los XmlNodes ... – user1079591
@ user1079591, sí, puedes y en realidad es una muy buena forma de proceder. –
Así que hice lo que sugirió, pero en el código del cliente no lo está captando como SoapException, sino más bien como System.ServiceModel.FaultException. En mi código tengo dos bloques catch: uno para SoapException y otro para Exception regular y siempre va a la Exception regular y cuando hago a.GetType() en el genérico dice que es de tipo System.ServiceModel.FaultException. – user1079591