none
Lanzar excepciones en WCF / Ambiente distribuido RRS feed

  • Pregunta

  • Hola a todos!!

    Tengo un WCF que estoy probando que esta hosteado en una app de consola win.
    Tengo el problema de que, no importa lo que haga en el proyecto del WCF o el host, siempre que quiero tirar una excepción se frena el host. O sea que cuando lo consumo con el cliente, el cliente queda "frizado" o congelado porque no recibe respuesta, ya que el host se para por la excepción. No entiendo porque no la lanza al cliente.
    Estoy haciendo lo mismo que otros ejemplos que he buscado en la web y no encuentro el problema.

    Cabe aclarar que el WCF y la AppWin Host están en un equipo de la LAN, y el cliente en otro equipo en la LAN.

    Agradezco mucho alguna guía o idea!!

    Saludos!!


    Martin Mesa | Desktop Support Analyst, IS Infraestructure & Operations Telefonica España - Movistar Uruguay | Tel.: +598 97401516 | Montevideo - Uruguay

    viernes, 22 de marzo de 2019 20:38

Respuestas

  • Hola. No, no actives la depuración de ese hosts. Si lo haces, en tus pruebas obviamente cuando se produce una excepción la ejecución del mismo se detiene en la línea que la produce o en su caso en un bloque catch. Ejecuta lo sin Depurar Start without Debug"

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    • Editado Sergio ParraModerator sábado, 23 de marzo de 2019 21:50
    • Marcado como respuesta MMesa viernes, 29 de marzo de 2019 14:32
    sábado, 23 de marzo de 2019 21:49
    Moderador

Todas las respuestas

  • Hola. Puedes mostrar algo de código de cómo lanzas una excepción? Te recomiendo lances una FaultException más o menos así 

    namespace App.Services.Interfaces
    {
        [ServiceContract]
        public interface IService1
        {   
            [FaultContract(typeOf(AppException))]
            [OperationContract]
            void TestFunction();
        }
    }
    
    
    using System.ServiceModel;
    public class Service1 : IService1
        {
            public Service1 () 
            { }
    
            public void TestFunction() 
            {
                try
                {
                 service.TestFunction();
                }
                catch(Exception ex)
                 {
                   AppException app=new AppException();
                   app.strMessage =ex.Message;
                   throw new FaultExcpetion<AppException>(app);
                 }
            }
        }

    Y en tu cliente deberías tratarlo asi

                   try
                    {
                      //call wcf service contract.
                    }
                    catch (FaultException<ServiceReference.AppException> ex)
                    {
    
                       label.Text=ex.Detail.strMessage ;
                    }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    sábado, 23 de marzo de 2019 14:32
    Moderador
  • Gracias Sergio!!

    Entonces a ver si ordeno la idea:

    La idea es lanzar una excepcion personalizada del tipo FaultException

    Me creo una clase que herede de FaultException y sera la que lanzo.

    Decoro asi como indicas el Operation Contract para que deje pasar mi fault exception.

    Uso try catch en la operacion del WCF y lanzo esa excepcion.

    Capturo en el cliente con try catch buscando el tipo especifico desde la proxy class.

    Si es esto, lo pruebo y aviso.

    Muchsa gracias!!


    Martin Mesa | Desktop Support Analyst, IS Infraestructure & Operations Telefonica España - Movistar Uruguay | Tel.: +598 97401516 | Montevideo - Uruguay

    sábado, 23 de marzo de 2019 19:31
  • Bueno, no lo logre!! 

    No logre compilar el wcf.

    Al agregar una clase para la excepcion personalizada, si hereda de alguna clase de exception (que creo es la idea) al compilar me da error indicando que no se puede serializar (que intente decorando con datacontract / datamember)

    Cuando lo decoro con datacontract / datamember me dice que la clase no puede implementar ISerialize y ademas estar decorada con datacontract / datamember.

    Es como un bucle y no se en ese caso.

    Si tienes alguna idea te agradezco! 


    Martin Mesa | Desktop Support Analyst, IS Infraestructure & Operations Telefonica España - Movistar Uruguay | Tel.: +598 97401516 | Montevideo - Uruguay

    sábado, 23 de marzo de 2019 20:09
  • Logre hacer compilar, pero me pasa lo mismo que antes.

    La clase de la excepcion no la declare como que herede de nada, y ahi si compila.

    Pero me sucede lo mismo, al provocar la excepcion desde el cliente no se recibe ninguna respuesta,

    y si voy a la maquina donde esta el host, queda trancado la app host con el mensaje de la excepcion no controlada.

    Ya habia probado poner try catch en el codigo de la aplicacion host y pasaba igual lo mismo.

    Parece ser algo mal en el host o en la forma en que lo corro.

    Yo lo doy a "debug new instance" que es lo que vi en otros ejemplos. Hay otra forma? Seria correcto eso?


    Martin Mesa | Desktop Support Analyst, IS Infraestructure & Operations Telefonica España - Movistar Uruguay | Tel.: +598 97401516 | Montevideo - Uruguay

    sábado, 23 de marzo de 2019 21:12
  • Hola. No, no actives la depuración de ese hosts. Si lo haces, en tus pruebas obviamente cuando se produce una excepción la ejecución del mismo se detiene en la línea que la produce o en su caso en un bloque catch. Ejecuta lo sin Depurar Start without Debug"

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    • Editado Sergio ParraModerator sábado, 23 de marzo de 2019 21:50
    • Marcado como respuesta MMesa viernes, 29 de marzo de 2019 14:32
    sábado, 23 de marzo de 2019 21:49
    Moderador
  • Correcto Sergio!!

    Demore en contestar porque di con la solución por mi cuenta después de un par de horas.

    Ese era el error.

    En VS se presiona ctrl + F5, o como bien dices en el menú "Correr sin depuración".

    Muchísimas gracias de nuevo por la ayuda.

    Esperemos que esto sirva a otros.

    Saludos!!


    Martin Mesa | Desktop Support Analyst, IS Infraestructure & Operations Telefonica España - Movistar Uruguay | Tel.: +598 97401516 | Montevideo - Uruguay

    viernes, 29 de marzo de 2019 14:36