1

我正在尝试在处理从页面上传的 ApiController 中使用信号器。

本质上,我是从我的 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 类中,一切都是空的。我的来电者、客户和上下文为空。所以似乎有些东西没有正确初始化。

有什么建议么?

4

1 回答 1

4

您不能自己创建 SignalR 集线器的实例。集线器需要由 SignalR 初始化,以便客户端等属性可用。

如果您想从集线器外部(例如您的控制器)向客户端广播,则需要使用集线器的上下文对象,如wiki 中所述

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

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

于 2012-07-23T15:13:14.337 回答