2009-12-18 22 views
12

Tengo una tarea ejecutándose en un sistema remoto que se conecta de nuevo a un servidor usando WCF. Es muy posible que la tarea pueda arrojar excepciones, y me gustaría que esas excepciones sean canalizadas nuevamente al servidor. Esencialmente lo que quiero hacer algo como esto:Excepciones de serialización sobre WCF

Cliente:

server.SendException(new UnauthorizedAccessException("Some Exception")); 

Servidor:

public void SendException(Exception e) 
{ 
    throw e; 
} 

Contrato:

[ServiceContract] 
public interface IServerContract 
{ 
    [OperationContract] 
    void SendException(Exception e); 
} 

He estado leyendo un poco sobre fallos excepciones, pero por lo que entiendo, se usan para excepciones específicas que se ejecutan en un método llamado sobre WCF . Lo que quiero es enviar cualquier tipo de excepción que la aplicación haya arrojado fuera del contexto de WCF, y luego canalizarlos de vuelta al servidor para su posterior procesamiento. Si ayuda en una solución, el servidor también tiene una conexión de regreso con el cliente.

+0

Entonces, básicamente, si el cliente lanza una excepción, ¿quiere que se conecte al servidor? –

+0

Puede ser posible, pero creo que es posible que deba proporcionar más detalles sobre la cadena de comunicación entre el (los) servicio (s), el (los) cliente (s) y las aplicaciones. Puede ayudarte a obtener una respuesta sólida de alguien. Es un poco difícil seguir exactamente lo que necesitas tal como es. –

Respuesta

10

Necesita capturar las excepciones en el servidor y empaquetarlas en fallas SOAP para enviarlas de vuelta a través del cable. De lo contrario, su canal cliente-servidor tendrá "fallas" e inutilizable.

Un error SOAP es básicamente el equivalente SOAP interoperable de una excepción .NET. Se supone que no debe lanzar excepciones .NET debido a que son específicos de .NET. WCF y SOA son, por definición, independientes del sistema.

Si se garantiza que ambos extremos del cable de comunicación sean .NET, puede resumir fácilmente cualquier excepción .NET en un FaultException<T> y así canalizar fácilmente la información de excepción específica de .NET utilizando un "vehículo de transporte" compatible con SOAP.

leer más sobre los errores de SOAP y cómo convertir sus excepciones .NET en el servidor en los errores de SOAP en el alambre aquí:

+1

Esto es lo que he encontrado más lugares para decir, desafortunadamente necesito que vaya en la otra dirección, ya que estoy tratando de atrapar las excepciones del cliente y enviarlas al servidor. – MGSoto

+2

Bueno, use el mismo mecanismo: cree un método de servicio, p. "ReceiveFault", y haga que su parámetro sea "FaultException ". Ahora, desde el cliente, cuando algo sale mal, termine su excepción de .NET en una FaultException y llame a "ReceiveFault" en su servidor –

+0

Si bien el método que elegí funcionó, esta es probablemente la forma más adecuada de hacerlo. – MGSoto

6

Para lo que necesitaba, resolví mi propio problema. Usé la clase ExceptionDetail tal como lo proporciona ServiceModel, y la usé para enviar datos de excepción relevantes al servidor.

+0

Ha pasado un tiempo desde que publicaste esto, pero pensé que te haría saber que finalmente encontré la manera de hacerlo. Solución [aquí] (http://stackoverflow.com/a/28737527/722393). Como usted señala, 'ExceptionDetail' puede funcionar, pero solo en los casos en que el servidor no necesita un objeto 'Exception' deserializado. Este poco más lo cubre. – InteXX

Cuestiones relacionadas