/signalr/hubs 未在 asp.net mvc4 中載入:拋出 404
這就是我所做的。
- 我使用 nuget 為我的 MVC4 項目獲取 SignalR。
- 在我的控制器中創建了一個 MyHub 類(SignalRTestController.cs)
- 在索引操作中,嘗試從集線器外部廣播消息並返回視圖。
- 在視圖中,引用了所有腳本和 /signalr/hubs。
問題是找不到 /signalr/hubs(拋出 404)。
我的項目有區域,結構如下所示:
- MVC項目
領域
子文件夾
控制器
- SignalRTestController.cs
模型
看法
- 索引.cshtml
控制器
模型
看法
腳本
signalR 的所有腳本都在 Scripts 文件夾中,我的 SignalRTestController.cs 如下所示:
namespace SignalRTest.Controllers { public class SignalRTestController : Controller { public ActionResult Index() { // Do some work here // Broadcasting over a Hub from outside of a Hub var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); context.Clients.say("Hello SignalR!"); return View(); } } [HubName("MyHub")] public class MyHub : Hub { public void Say(string message) { Clients.sendMessage(message); } } }我的任何 Index.cshtml 都引用了所有的 javascripts 和 /signalr/hubs,如下所示: // 其他 Javascripts
腳本類型=“text/javascript” src="/signalr/hubs" />
我認為控制器很好,但我沒有得到 /signalr/hubs。它拋出 404 並且 Chrome 控制台中的消息是這樣的:
資源解釋為腳本,但使用 MIME 類型 text/html 傳輸:“http://www.myproject.com/signalr/hubs”。未擷取的語法錯誤:意外的令牌 < 集線器:2 未擷取的 SignalR:載入集線器時出錯。確保您的集線器引用正確,例如腳本 src=’/signalr/hubs’>。
腳本返回為 html 的原因是伺服器返回 404 not found。
我不確定出了什麼問題。我認為這可能是一個路由問題。我不確定,如果我們需要在項目中為 /signalr/hubs 添加任何路由資訊,或者我在這裡遺漏了什麼。
僅供參考:當我創建一個新的空 MVC 項目並添加 signalR 並開始處理它時,它工作得非常好。無需添加路由。
另外,我在某些地方同時使用預設路由和屬性路由。但是控制器 SignalRTestController 不使用屬性路由。
你有呼叫 RouteTable.Routes.MapHubs()(可能在 Global.asax 中)嗎?如果是這樣,請嘗試擺脫它並查看它是否可以解決您的問題。– 皮特 11 月 16 日 17:22
我一直在玩它。看來在目前版本中(我得到了最新的原始碼,因為我需要一個簽名的程序集),你必須呼叫 RouteTable.Routes.MapHubs()。但要使其工作,必須首先呼叫它(或至少在 RouteConfig.RegisterRoutes() 呼叫之前)。如果在此之後呼叫它,MVC 會為其尋找控制器,但這是行不通的。在我使用的通過 nuGet 獲得的早期版本中,刪除 RouteTable.Routes.MapHubs() 可以解決問題,但現在似乎是必需的。希望這會有所幫助。- 皮特 11 月 27 日 20:53
顯然,您通過將 RouteTable.Routes.MapHubs() 更改為:RouteTable.Routes.MapHubs("~/signalr") 解決了這個問題。