我正在尝试在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类中,一切都是空的。 我的调用者,客户端和上下文为空。所以似乎有些东西没有正确初始化。
有什么建议吗?
答案 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.ConnectionId
或context.Caller
,因为您正在调用ApiController而不是SignalR,因此在这种情况下框架对ConnectionId一无所知。您需要以其他方式将其传递给控制器,例如cookie或作为控制器动作的参数。