在asp.net中与SignalR建立唯一的服务器 - 客户端连接

时间:2018-01-03 15:48:04

标签: c# asp.net signalr signalr-hub signalr.client

我使用SignalR通过连接到网络的打印机从网站打印文档。当我在电脑上测试时,它工作正常。问题是当连接了多台PC时,因为它打印的副本数量与使用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);

    }

这是Windows窗体:

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(.......

因为很明显,它会将请求发送给所有连接的用户。但是,该指令只能来自提出打印请求的客户PC,如预期的那样。

1 个答案:

答案 0 :(得分:0)

当客户端连接时,会为它们提供一个唯一的“连接ID”,该连接ID存储在Context对象上(可以在Hub类的方法中访问,该方法正在处理该调用。)

然后,您可以使用此ID向其发送消息,即:

Clients(Context.ConnectionId).SomeClientMethod();

听起来就像你需要做的那样。请注意,因为连接ID是请求的一部分,如果您需要以后,您需要将其存储在内存中以及设备的密钥或生成的操作,以便您可以适当地获取它

相关问题