none
¿Como establecer conexión única entre servidor-cliente con SignalR en asp.net? RRS feed

  • Pregunta

  • Resulta que utilizo signalr para mandar a imprimir a una impresora conectada en la red desde la pagina web lógicamente ubicada en el servidor, al computador del cliente. Cuando lo pruebo en un computador, funciona correctamente, pero el problema es cuando hay mas de uno conectado, me imprime por la cantidad de computadores conectados.

    Este es el código que tengo en el html:

    $(document).ready(function () {  
    var myHub = $.connection.myHub;
            var direccionWeb = $("#direccionWeb").val().toString();
            $.connection.hub.url = direccionWeb + "/signalr";
            $.connection.hub.start().done(function () {
                myHub.server.broadcastMessageToPrinterReportTicket(global_venta, global_mesa, nombregarzon, idgrupo, grupo);
            }).fail(function (error) {
                console.error(error);
            }); });

    En el HUB:

    public void BroadcastMessageToPrinterReportTicket(String global_venta, String global_mesa, String nombregarzon, String idgrupo, String grupo) { string nombreImpresora = grupo; //resto de código para obtener datos....... String nombreRDLC = "report_ticket.rdlc"; String nombreDataSet = "DataSet_ticket"; Clients.All.imprimeReport(nombreImpresora, parametros, dt, nombreRDLC, nombreDataSet); }

    En el Starup:

    public void Configuration(IAppBuilder app) {app.MapSignalR(); }

    En el cliente que es una aplicación windows Foms escritorio:

    public partial class Form1 : Form
    {    HubConnection hubConnection;
        IHubProxy hubProxy;
        public Form1()
        {       InitializeComponent();
                IncializaSignalR();
                hubConnection.Closed += IncializaSignalR;
                hubConnection.Start().Wait();
            }
         private void IncializaSignalR()
        {   String direccionServer = "https://mipaginaweb.cl";
            hubConnection = new HubConnection(direccionServer + "/signalr/hubs");
            hubProxy = hubConnection.CreateHubProxy("MyHub");
            CheckForIllegalCrossThreadCalls = false;
            hubProxy.On<String, ReportParameter[], DataTable, String, String>("imprimeReport", (nombreImpresora, parametros, dt, nombreRDLC, nombreDataSet) =>
            {  //Instrucción de código para imprimir con reportviewer
              }
            });
       }

    Revisando el codigo, sospecho que la causa del problema debe ser la siguiente instrucción por la sentencia All:

      Clients.All.imprimeReport(.......

    Por que al parecer, le envía la solicitud a todos los usuarios conectados, y la idea, es que la instrucción vaya solamente al PC del cliente que hizo la solicitud para imprimir, y no me imprima tickets duplicados(por cada computador conectado).

    Me gustaría saber como podría solucionar este problema, no se si hay que reemplazar la instrucción All de Clients por otra, o en el cliente habría que finalizar la conexión por cada solicitud que se envié a imprimir y volver a re-conectar? ¿Como podría obtener el id del usuario para enviarlo a la función de la aplicación cliente, y como se recibiría en el cliente. Cualquier ayuda, se les agradecería en gran manera.

    jueves, 4 de enero de 2018 3:26

Todas las respuestas

  • Supongo que filtrando clients por el que realizo la petición podrías.

    No obstante tengo que decirte pero lo que quieres hace por signalr me preocupa por el siguiente motivo:

    SignalR es un gestor de eventos DESDE el servidor AL cliente o clientes, por lo que la forma que lo usas no es correcta, ya que es el cliente quién solicita la impresión y por tanto quien genera el evento. Dicho esto te cuento como debe funcionar lo que deseas hacer (según yo creo) En el cliente solicitar el documento de rdlc y pasarlo a PDF(hay mucha documentacion, de eso) abrirlo e imprimirlo o bien con el visor de reports de reporting services mostrarlo y realizar la impresión en la impresora predeterminada del cliente o la confiugrada en el servidor para el cliente.

    El signalR se usa para otros fines por ejemplo quieres mostrar en una petición del cliente cuantos usaurios hay conectados  a la aplicación web. y además monitorizarlo en real time. Entonces SignalR dispara un evento a todos los clientes que vean la pagina del monitor de usuarios conectados y actualiza el contenido desde el servidor.

    • Propuesto como respuesta vyrcyrus_ jueves, 4 de enero de 2018 10:54
    jueves, 4 de enero de 2018 10:53
  • Gracias por responder, lo que pasa, es que estoy utilizando esta forma para realizar impresión directa sin que aparezca un vista previa, ya que en otras partes lo he visto, y se que se puede, instalando una aplicación en el cliente que se comunique con el servidor web. Donde el servidor envía la solicitud al cliente. El tema es que para eso, he estado intentando hacer la solicitud al usuario que esta conectado para que se haga el envío a la aplicación del mismo usuario cliente para imprimir, es decir, como un chat privado, pero en este caso, desde una aplicación web(servidor) a una aplicación escritorio winforms(cliente).
    jueves, 4 de enero de 2018 13:31
  • Gracias por responder, lo que pasa, es que estoy utilizando esta forma para realizar impresión directa sin que aparezca un vista previa, ya que en otras partes lo he visto, y se que se puede, instalando una aplicación en el cliente que se comunique con el servidor web. Donde el servidor envía la solicitud al cliente. El tema es que para eso, he estado intentando hacer la solicitud al usuario que esta conectado para que se haga el envío a la aplicación del mismo usuario cliente para imprimir, es decir, como un chat privado, pero en este caso, desde una aplicación web(servidor) a una aplicación escritorio winforms(cliente).
          Hola Danilo, lo pudiste solucionar ?
    viernes, 29 de noviembre de 2019 13:33