2012-07-23 121 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或作爲控制器操作的參數。