MVC4 アプリで SignalR を設定しようとしています。
問題は、パス /signalr/hubs を参照するとコードが表示されますが (フィドラーは /signalr/hubs に対して 200OK を表示します)、ハブへの参照が含まれていないようで、クライアント側のコードも含まれていません。ハブとメソッドを参照してください。
デバッグを開始すると、次のエラーが表示されます (IIS Express、VS Express 2012):
Global.asax の Application_Start には以下が含まれます。
//RouteTable.Routes.MapHubs("/signalr", new HubConfiguration());
RouteTable.Routes.MapHubs();
RouteConfig.RegisterRoutes(RouteTable.Routes);
(これで/signalr/hubsが生成されると思いますが、これは機能しているようですが、実際のハブには何もリンクしていません。両方のオプションを試してみました)。
私のプロジェクトでは、MessageHub.cs を使用してルートに "Hubs" フォルダーを取得しました。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
namespace Prj.Hubs
{
[HubName("messagehub")]
public class MessageHub : Hub
{
public void MessageAll(string message)
{
Clients.All.writeMessage(message);
}
public void MessageOthers(string message)
{
Clients.Others.writeMessage(message);
}
public void MessageSingle(string message)
{
}
}
}
私の _Layout.cshtml には、終了タグの直前にあります:
<script type="text/javascript" src="~/Scripts/jquery-1.9.1.js"></script>
<script type="text/javascript" src="~/Scripts/jquery.signalR-1.1.2.js"></script>
<script src="/signalr/hubs" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
// create proxy on the fly
var proxy = $.connection.messagehub; // this connects to our 'messageHub' Hub as above
// for SignalR to call the client side function we need to declare it with the Hub
proxy.messageAll = function (message) {
$('#messages').append('<li>' + message + ''); // when the Hub calls this function it appends a new li item with the text
};
// declare function to be called when button is clicked
$("#broadcast").click(function () {
// calls method on Hub and pass through text from textbox
proxy.messageAll($("#message").val());
});
// Start the connection
$.connection.hub.start();
});
</script>
(補足 - SignalR は @Scripts.Render("~/bundles/jquery") をまったく好きではありませんでしたが、直接の jquery スクリプト インクルードは機能しているようです)。
では、なぜ「messagehub」を正確に認識しないのでしょうか?