Установите уникальное соединение сервер-клиент с SignalR в asp.net.

Я использую SignalR для печати документа с веб-сайта через принтер, подключенный к сети. Когда я тестирую его на компьютере, он работает нормально. Проблема возникает, когда подключено более одного компьютера, поскольку он печатает столько копий, сколько компьютеров подключено с помощью SignalR.

Это 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);
        });
 });

Это файл 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);

    }

Это форма окна:

public partial class Form1 : Form
{
    HubConnection hubConnection;
    IHubProxy hubProxy;
    //Install-Package HtmlRenderer.PdfSharp -Version 1.5.0.6
    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
          }
        });
   }

При проверке кода я подозреваю, что причиной проблемы может быть оператор «Все»:

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

Потому что, судя по всему, он отправляет запрос всем подключенным пользователям. Однако инструкция должна идти только с ПК клиента, сделавшего запрос на печать, как и предполагалось.


person DavidM    schedule 03.01.2018    source источник
comment
Вы пробовали Clients.Caller.imprimeReport?   -  person Rafael    schedule 03.01.2018
comment
Да, но он не может общаться   -  person DavidM    schedule 03.01.2018


Ответы (1)


Когда клиент подключается, ему присваивается уникальный «идентификатор подключения», который хранится в объекте Context (доступен в методе класса Hub, обрабатывающем вызов).

Затем вы можете использовать этот идентификатор для отправки им сообщений, например:

Clients(Context.ConnectionId).SomeClientMethod();

Похоже, это то, что вам нужно сделать. Обратите внимание: поскольку идентификатор соединения является частью запроса, если он понадобится вам позже, вам нужно будет сохранить его где-нибудь в памяти вместе с ключом для устройства или сгенерированным действием, чтобы вы могли получить его соответствующим образом. .

person BradleyDotNET    schedule 03.01.2018
comment
У вас есть пример? Я пробовал это: Clients.User(Context.ConnectionId).imprimeReport(nombreImpresora, parametros, dt, nombreRDLC, nombreDataSet);, но он не вызывает функцию печати - person DavidM; 03.01.2018
comment
@DavidM Это не Clients.User, а просто Clients. На основании вашего комментария к фактическому вопросу; похоже, что клиент не поддерживает соединение? - person BradleyDotNET; 03.01.2018
comment
@BradleyDotNET, должны ли мы изменить hubProxy.On‹String, ReportParameter[], DataTable, String, String›(imprimeReport, (nombreImpresora, parametros, dt, nombreRDLC, nombreDataSet) =› { // } Для другой инструкции? - person Danilo; 03.01.2018
comment
@Danilo Мне кажется, это правильно. Этот объект где-то утилизируется? Очевидно, в какой-то момент это сработало, потому что ваш Clients.All работал. - person BradleyDotNET; 03.01.2018
comment
Я нашел это решение: (stackoverflow.com/questions/19522103/), но я хочу знать, как получить идентификатор пользователя и отправить его клиенту - person DavidM; 03.01.2018
comment
Вижу, что при использовании Clients.All.imprimeReport(....) работает нормально, но при переходе на другой метод, на стороне клиента не проходит точка останова функции.imprimeReport (Так мне говорят) - person Danilo; 03.01.2018
comment
@DavidM Я не выполнял аутентификацию ASP.NET; так что я не могу помочь вам там. Идти напрямую с Caller (при условии, что вы никогда не оставляли запрос, конечно) или идентификатор соединения никогда не терпит неудачу для меня. Основная проблема заключается в том, что если вы попытаетесь использовать один из них вне фактического контекста запроса (что довольно распространено), поэтому я упоминаю, что вам может потребоваться сохранить его. - person BradleyDotNET; 03.01.2018