SignalR在IE浏览器客户端接收POS交易信息失败求助
SignalR在IE中无法接收Pax S800 POS设备交易回传的问题
问题概述
通过SignalR + JavaScript向Pax S800 POS设备发送价格的功能正常,设备能启动并显示价格,但刷卡完成(支付成功/取消)后,交易信息无法回传到IE浏览器——接收回调GetTransactionResponse在Chrome中正常触发,在IE中完全没反应。由于应用依赖Silverlight,必须使用IE。
相关代码
发送价格的核心代码
var serverMessage = ''; $.connection.hub.url = "http://localhost:8080/signalr"; var console = $.connection.SSP1126HUB; var ip = ''; console.client.GetSystemResponse = function (message) { serverMessage = ''; serverMessage = message; } $.connection.hub.start().done( function initialize() { console.server.Initial(1, ip, 'COM4', 1, 0, '0'); var delayInMilliseconds = 1000; //1 second setTimeout(function () { if (serverMessage == '0') { console.server.SendAmount1Step(TotalAmount, Amountiban, ' ', ' ', ' ', ' '); } else alert("error"); }, delayInMilliseconds); });
页面引入的脚本
<script src="Scripts/jquery-1.7.1.min.js"></script> <script src="Scripts/jquery-1.12.4.min.js"></script> <script src="Scripts/jquery.signalR-2.2.2.min.js"></script> <script src="http://localhost:8080/signalr/hubs"></script>
未触发的接收回调代码
console.client.GetTransactionResponse = function (TerminalId, ResponseCode, SerialId, RRN, ResponseDescription, TxnDate, CardNumberMask) { alert("received"); }
已尝试的无效方案
- 修改IE开发者工具文档模式
- 降低IE安全级别
- 关闭IE保护模式
可行解决方案建议
- 强制SignalR使用长轮询传输方式
IE对WebSocket的兼容性较差,直接指定长轮询(兼容所有IE版本):
$.connection.hub.start({ transport: 'longPolling' }) .done(function() { // 原初始化逻辑 });
- 清理重复的jQuery引用
页面同时引入两个版本的jQuery,版本冲突会导致SignalR回调绑定失效。保留高版本,移除旧版本:
<!-- 移除旧版本引用 --> <!-- <script src="Scripts/jquery-1.7.1.min.js"></script> --> <script src="Scripts/jquery-1.12.4.min.js"></script> <script src="Scripts/jquery.signalR-2.2.2.min.js"></script> <script src="http://localhost:8080/signalr/hubs"></script>
- 调整回调绑定时机
确保所有客户端回调在SignalR连接启动前绑定,避免连接建立后注册导致无法接收消息:
var console = $.connection.SSP1126HUB; // 先绑定所有回调 console.client.GetSystemResponse = function (message) { serverMessage = message; }; console.client.GetTransactionResponse = function (TerminalId, ResponseCode, SerialId, RRN, ResponseDescription, TxnDate, CardNumberMask) { alert("received"); }; // 再启动连接 $.connection.hub.start({ transport: 'longPolling' }).done(function initialize() { console.server.Initial(1, ip, 'COM4', 1, 0, '0'); setTimeout(function () { if (serverMessage == '0') { console.server.SendAmount1Step(TotalAmount, Amountiban, ' ', ' ', ' ', ' '); } else { alert("error"); } }, 1000); });
- 启用SignalR日志排查
开启日志功能,查看IE控制台中的连接细节和错误信息:
$.connection.hub.logging = true; $.connection.hub.start({ transport: 'longPolling' }) .done(function() { console.log("SignalR连接已启动"); });
- 添加IE兼容性meta标签
强制IE使用最新渲染模式,避免兼容性问题:
<meta http-equiv="X-UA-Compatible" content="IE=edge">
内容的提问来源于stack exchange,提问作者maryam mohammadbagheri
相关产品推荐
相关产品推荐

