信号器没有连接

时间:2012-07-23 10:25:33

标签: asp.net-web-api signalr

我正在尝试在ApiController中使用signalr来处理页面上传。

基本上我是从uploadController调用我的Hub然后我想和我的客户交谈。

缩短上传控制器如下所示:

public class UploadController : ApiController
{
  public Task<HttpResponseMessage> PostFile()
    {
        var hubMan = new HubManager();
        hubMan.showUpload("test");
    }
 }

然后我的HubManager应该负责发送给我的客户:

public class HubManager : Hub
{

    public HubManager()
    {
    }

    public void showUpload(string src)
    {
        Caller.showUpload(src);
    }

}

我也在showUpload中试过这个:

public void showUpload(string str)
    {
        var context = GlobalHost.ConnectionManager.GetHubContext<HubManager>();
        context.Clients[this.Context.ConnectionId].showUpload(str);
    }

我的客户端代码如下所示:

$(document).ready(function () {

var progress = $.connection('/signalr/hubs/hubManager');

progress.showUpload = function (src) {
    alert(src);
};

// Start the connection
$.connection.hub.start();
});

现在的问题是,在我的Hub类中,一切都是空的。 我的调用者,客户端和上下文为空。所以似乎有些东西没有正确初始化。

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

您无法自己创建SignalR中心的实例。集线器需要由SignalR初始化,因此可以使用客户端等属性。

如果要从集线器外部(例如控制器)向客户端广播,则需要将集线器的上下文对象用作described in the wiki

public ActionResult ControllerAction()
{
    var context = GlobalHost.ConnectionManager.GetHubContext<HubManager>();
    context.Clients[ /* connectionId or group name */ ].showUpload();
    // ...
}

请注意,您无法访问context.ConnectionIdcontext.Caller,因为您正在调用ApiController而不是SignalR,因此在这种情况下框架对ConnectionId一无所知。您需要以其他方式将其传递给控制器​​,例如cookie或作为控制器动作的参数。