启动课程:
using Owin;
using Microsoft.Owin;
using Microsoft.AspNet.SignalR;
[assembly: OwinStartup(typeof(ESimSolFinancial.Startup))]
namespace ESimSolFinancial
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
// Any connection or hub wire up and configuration should go here
app.MapSignalR("/signalr", new HubConfiguration());
}
}
}
枢纽类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web;
using Microsoft.AspNet.SignalR;
namespace ESimSolFinancial.Hubs
{
public class ProgressHub : Hub
{
public static void SendMessage(string msg,int nCount)
{
var hubContext = GlobalHost.ConnectionManager.GetHubContext<ProgressHub>();
hubContext.Clients.All.broadcastMessage(string.Format(msg), nCount);
}
}
}
在js文件中我有这个功能:
function InitializeProgressBar() {
ProgressBarShow();
var progressNotifier = $.connection.progressHub;
progressNotifier.client.broadcastMessage = function (message, count) {
UpdateProgressBar(message, count);
};
$.connection.hub.url = "/signalr";
$.connection.hub.start({ transport: ['webSockets', 'longPolling'] }).done(function () {
//progressNotifier.client.broadcastMessage('Opening Connection',0);
});
}
在点击事件中调用
click事件调用一个动作结果,我有这个代码:
Thread.Sleep(5000);
ProgressHub.SendMessage("Getting Ledger Data", 10);
在长程序完成后更新进度条。
消息在chrome和IE中正确发送,但firefox没有相应地收到这些消息。 UpdateProgressBar(message, count);
未被调用。当我打开萤火虫并停止执行很长时间时,它有时会起作用。
我认为这是因为漫长的过程不够长,所以我增加了睡眠时间但事实并非如此。
我不明白我在这里做错了什么。任何帮助表示赞赏。
更新: actionresult是click事件所在的页面。它似乎只在应用程序刚刚启动后才能工作。之后,firefox拒绝接收这些消息。
答案 0 :(得分:0)
您是否在js中为点击事件调用了服务器功能
progressNotifier.server.SendMessage(msg,count);
您可以通过调用服务器功能
来修改客户端代码 function InitializeProgressBar() {
ProgressBarShow();
var progressNotifier = $.connection.progressHub;
progressNotifier.client.broadcastMessage = function (message, count) {
UpdateProgressBar(message, count);
};
$.connection.hub.url = "/signalr";
$.connection.hub.start({ transport: ['webSockets', 'longPolling']
}).done(function () {
//Call to server function(SendMessage) made .This fuction broadcasts to all clients
//by calling client side(broadcast message ) function of all users
progressNotifier.server.SendMessage(msg,count);
//progressNotifier.client.broadcastMessage('Opening Connection',0);
});
}
请尝试这个。我无法在应用程序中运行该程序。但这就是信号R工作的方式。一个客户端在一个事件上调用一个服务器函数(或服务器回复没有调用但只有一些逻辑),服务器向所选组或选定用户或所有用户(在客户端)广播实时通知
$('#id').click(function(){
progressNotifier.server.SendMessage(msg,count);
});
必须调用服务器功能