【发布时间】:2014-11-11 22:53:09
【问题描述】:
我有一个托管我的网站的网络服务器。我有一个单独的服务器正在运行某个任务。一旦有结果,我想 ping 当前登录到我的网络服务器上的客户端。这应该使用 SignalR 完成
这种没有运行服务器的服务的设置正在工作:
我有一个单独的项目来托管我的集线器:
public class NotificationHub : Hub
{
public string Activate() { return ""; }
public override Task OnConnected()
{
string username = Context.User.Identity.Name.ToLower();
Groups.Add(Context.ConnectionId, username);
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
return base.OnDisconnected(stopCalled);
}
public override Task OnReconnected()
{
return base.OnReconnected();
}
}
和客户端(此代码在登录时执行)
var notificationHub = $.connection.notificationHub;
notificationHub.client.connected = function () { console.log('client connected fired!'); };
$.connection.hub.start().done(function () {
notificationHub.server.activate();
})
notificationHub.client.testPing = function (message) {
console.log("Message received: "+message);
};
然后我有一个控件,它调用带有动作的 BubbleController
public ActionResult NotifyPing(string username, string message)
{
SignalRfunctions.TestPing(username,message);
return Content("OK");
}
其中 SignalRFunction 是一个包含所有通信功能的静态类,它包含在一个名为 Notifications 的单独项目中
public class SignalRfunctions
{
public static void TestPing(string username, string message)
{
IHubContext signalR = GlobalHost.ConnectionManager.GetHubContext<NotificationHub.NotificationHub>();
signalR.Clients.Group(username).TestPing(message);
}
}
现在,当我编译所有内容时,以 Bob 身份登录并在浏览器控制台中执行此命令
$.get('/bubble/notifyping?username=bob&message=hi',function(){});
我在控制台中得到响应:
收到的消息:嗨
这是预期的(查看客户端 signalR 支持)
现在什么不起作用:
当我打电话时
SignalRfunctions.TestPing("bob"," hello from jobrunner");
来自在我的服务中(非网络相关项目),即使我以 bob 身份登录,我也没有在浏览器控制台中得到任何响应。基本上,SignalR 在我的网络应用程序中为我工作,当我尝试与我的服务器运行服务桥接时,我没有连接。
我做错了什么?
(我确实在调试下运行了所有内容以检查是否有任何明显的错误,但没有发现)
更新:在最初的问题中,我错过了一段初始化 SignalR 的代码:
[assembly: OwinStartup(typeof(WebApp.OwinStartup))]
namespace WebApp
{
public class OwinStartup
{
public void Configuration(IAppBuilder app)
{
UsernameProvider usernameProvider = new UsernameProvider();
GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => usernameProvider);
app.MapSignalR();
}
}
}
UsernameProvider 类在这里:
public class UsernameProvider : IUserIdProvider
{
public string GetUserId(IRequest request)
{
string username = request.User.Identity.Name.ToLower();
return username;
}
}
【问题讨论】:
标签: .net asp.net-mvc signalr signalr-hub