繁体   English   中英

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

[英]Establish a unique server-client connection with SignalR in asp.net

我使用SignalR通过连接到网络的打印机从网站上打印文档。 当我在PC上对其进行测试时,它可以正常工作。 问题是当连接多台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。

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

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

Clients(Context.ConnectionId).SomeClientMethod();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM