2012-07-23 87 views
1

我想在ApiController中使用signalr来处理页面上传。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试过这样:我的客户端代码如下所示:

$(document).ready(function() { 

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

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

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

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

有什么建议吗?

+1

请注意,您在JavaScript中访问集线器也是错误的。它应该是'$ .connection.hubManager;'而不是'$ .connection('/ signalr/hubs/hubManager');' – 2012-07-23 15:23:22

回答

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一无所知。您需要以其他方式将其传递给控制器​​,例如cookies或作为控制器操作的参数。