我使用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,如预期的那样。
答案 0 :(得分:0)
当客户端连接时,会为它们提供一个唯一的“连接ID”,该连接ID存储在Context
对象上(可以在Hub
类的方法中访问,该方法正在处理该调用。)
然后,您可以使用此ID向其发送消息,即:
Clients(Context.ConnectionId).SomeClientMethod();
听起来就像你需要做的那样。请注意,因为连接ID是请求的一部分,如果您需要以后,您需要将其存储在内存中以及设备的密钥或生成的操作,以便您可以适当地获取它