public static void InnerDuplexChannel_Faulted(object sender, EventArgs e)
 {
     if (!distribuidor.CheckAccess())
     {
         distribuidor.BeginInvoke(DispatcherPriority.Normal, new FaultedInvoker(AdministrarServicioChat.GestionarProxy));
         return;
     }
     AdministrarServicioChat.GestionarProxy();
 }
    }//Cerrar

    public static void Desconectar()
    {
        if (proxy != null)
        {
            if (proxy.State == CommunicationState.Faulted)
            {
                AdministrarServicioChat.GestionarProxy();;
            }
            else
            {
                proxy.DesconectarAsync(usuarioActual);
            }
        }
    }//Desconectar
    }//ActivarEstaEscribiendo

    public static void DesactivarEstaEscribiendo(String Mensaje)
    {
        if (proxy != null)
        {
            if (proxy.State == CommunicationState.Faulted)
            {
                AdministrarServicioChat.GestionarProxy();;
            }
            else
            {
                if (Mensaje.Length < 1)
                {
                    proxy.EstaEscribiendoAsync(null);
                }
            }
        }
    }//DesactivarEstaEscribiendo
    }//Enviar

    public static void EnviarArchivo(String NombreArchivo, byte[] Contenido)
    {
        if (proxy != null && NombreArchivo != "" && Contenido != null)
        {
            if (proxy.State == CommunicationState.Faulted)
            {
                AdministrarServicioChat.GestionarProxy();;
            }
            else
            {
                FileMessage fMsg = new FileMessage();
                fMsg.NombreArchivo = NombreArchivo;
                fMsg.Datos         = Contenido;
                proxy.EnviarArchivoAsync(fMsg);
            }
        }
    }
    }//Gestionar Proxy

    //Metodo que establece la conexion con el servicio
    public static Boolean Conectar(String Usuario,
                                   String IP,
                                   Object Contexto)
    {
        if (proxy == null)
        {
            try
            {
                usuarioActual         = new Cliente();
                usuarioActual.Usuario = Usuario;
                InstanceContext context = new InstanceContext(Contexto);
                proxy = new ChatClient(context);

                //Definir la direccion IP del servicio
                string servicePath       = proxy.Endpoint.ListenUri.AbsolutePath;
                string serviceListenPort = proxy.Endpoint.Address.Uri.Port.ToString();

                proxy.Endpoint.Address = new EndpointAddress("net.tcp://" + IP + ":" + serviceListenPort + servicePath);


                proxy.Open();

                proxy.InnerDuplexChannel.Faulted += new EventHandler(InnerDuplexChannel_Faulted);
                proxy.InnerDuplexChannel.Opened  += new EventHandler(InnerDuplexChannel_Opened);
                proxy.InnerDuplexChannel.Closed  += new EventHandler(InnerDuplexChannel_Closed);
                proxy.ConectarAsync(usuarioActual);
                proxy.ConectarCompleted += new EventHandler <ConectarCompletedEventArgs>(proxy_ConexionCompletada);
                return(true);
            }
            catch (Exception ex)
            {
                estadoConversacion = "Fuera de Línea: " + ex.Message.ToString();
                ActualizoEstadoConversacion(null, new EventArgs());
                return(false);
            }
        }
        else
        {
            AdministrarServicioChat.GestionarProxy();
            return(true);
        }
    }//Conectar
    }//Desconectar

    public static void ActivarEstaEscribiendo(String Mensaje, Key tecla)
    {
        if (proxy != null)
        {
            if (proxy.State == CommunicationState.Faulted)
            {
                AdministrarServicioChat.GestionarProxy();;
            }
            else
            {
                if (tecla == Key.Enter)
                {
                    Enviar(Mensaje);
                }
                else if (Mensaje.Length < 1)
                {
                    proxy.EstaEscribiendoAsync(usuarioActual);
                }
            }
        }
    }//ActivarEstaEscribiendo
    }//Conectar

    public static void Enviar(String Mensaje)
    {
        if (proxy != null && Mensaje != "")
        {
            if (proxy.State == CommunicationState.Faulted)
            {
                AdministrarServicioChat.GestionarProxy();;
            }
            else
            {
                //Crear el mensaje e iniciar propiedades
                Mensaje msg = new Mensaje();
                msg.Remitente = usuarioActual.Usuario;
                msg.Contenido = Mensaje;

                proxy.EnviarAsync(msg);
                //Indicar a los usuarios que el usuario actual esta escribiendo
                proxy.EstaEscribiendoAsync(null);
            }
        }
    }//Enviar