信号器不能从控制器工作,我认为它没有找到客户端

时间:2016-09-16 14:12:30

标签: c# .net asp.net-mvc signalr autofac

我试图从控制器广播消息。基本上我尝试做的是每当保存特定对象时向每个人的仪表板发送通知。在我的JS中我有连接方法,我可以向服务器发送消息并从中获取消息,所以我知道我已连接到集线器,但是在我的控制器中使用GlobalHost.ConnectionManager.GetHubContext<MyHub>()方法获取它似乎没有发送给任何客户的上下文。

集线器

public class UpdateHub : Hub
{
    public void Update()
    { 
        Clients.All.update("You've reached the hub");
    }
}

控制器(保存模型后,但在返回视图之前,模型保存并运行)

var updateHubContext = GlobalHost.ConnectionManager.GetHubContext<UpdateHub>();
updateHubContext.Clients.All.update("A new model has been saved");

调试更新方法显示...

updateHubContext.Clients.All.update("A new model has been saved");
Id = 1714, Status = RanToCompletion, Method = "{null}", Result = ""
AsyncState: null
CancellationPending: false
CreationOptions: None
Exception: null
Id: 1714
Result: null
Status: RanToCompletion

但如果它完成了,为什么客户没有看到它呢?如果我将更新方法发送到服务器,则客户端会看到它。

var myhub = $.connection.notificationHub;
myhub.server.Update();
myhub.client.update = function(message) {
    alert(message);
}
$.connection.hub.start();

我在这里出错的任何想法?

我也使用Autofac,我不认为问题存在,但这里是代码。

var config = new HubConfiguration();
var builder = new ContainerBuilder();

builder.RegisterControllers(typeof(MvcApplication).Assembly);
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterHubs(Assembly.GetExecutingAssembly()).SingleInstance();
var container = builder.Build();
config.Resolver = new Autofac.Integration.SignalR.AutofacDependencyResolver(container);
DependencyResolver.SetResolver(new Autofac.Integration.Mvc.AutofacDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver((IContainer)container);

app.UseAutofacMiddleware(container);
app.UseAutofacMvc();
app.MapSignalR("/signalr", config);

ConfigureAuth(app);

2 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

var myhub = $.connection.notificationHub;

myhub.client.update = function(message) {
    alert(message);
}

$.connection.hub.start().done(function(){
    myhub.server.update();    
});

在开始连接之前,您需要注册一个客户端回调方法。以下是ASP.NET SignalR Hubs API Guide - JavaScript Client - How to establish a connection

  

注意:通常在调用start方法建立连接之前注册事件处理程序。如果要在建立连接后注册一些事件处理程序,则可以执行此操作,但在调用start方法之前必须至少注册一个事件处理程序。 ...

此外,我认为您在开始连接之前尝试在服务器上调用方法。

希望这有帮助。

答案 1 :(得分:1)

我需要为Autofac注入一个生命周期范围。

private readonly ILifetimeScope _hubLifetimeScope;
public UpdateHub(ILifetimeScope lifetimeScope)
{
    _hubLifetimeScope = lifetimeScope.BeginLifetimeScope("AutofacWebRequest");
}

它在文档中。此外,我需要单独使用Autofac注册集线器,并ExternallyOwned