SignalR を使用して単純な「Hello World」スタイルのアプリケーションを作成しようとしています。少し複雑な要因は、IIS/ASP.NET ではなく、SignalR ハブを自己ホストする必要があることです。私が知る限り、サーバー側は動作しており、ポート 8080 で利用できますが、クライアントの配線に問題があります。現時点で直面している問題は、指定した URL のポートを SignalR クライアントが無視しているように見えることです。
具体的には、ここに次のコードがあります。
<head runat="server">
<script type="text/javascript" src="/Scripts/jquery-1.8.2.min.js"></script>
<script type="text/javascript" src="/Scripts/json2.min.js"></script>
<script type="text/javascript" src="/Scripts/jquery.signalR-0.5.3.js"></script>
<script type="text/javascript" src="http://<%=Request.Url.Host %>:8080/signalr/hubs"></script>
<title>SignalR Test</title>
</head>
<body>
<script type="text/javascript">
$(function () {
// Wire up the client to the SignalR server on the same host
// as the source of this page, but on port 8080.
$.connection.url = "http://<%=Request.Url.Host %>:8080/signalr";
var roomHub = $.connection.roomHub;
$('#echoButton').click(function () {
roomHub.echo($('#echoButton').val())
.error(function (err) {
alert(err);
});
});
$.connection.hub.start({ transport: 'auto', xdomain: true })
.done(function () {
console.log('Connected.');
})
.fail(function (e) {
console.log('Unable to connect:' + e);
});
});
</script>
:8080/signalr/hubs スクリプトが正常にロードされ、問題ないように見えます。つまり、その中に の定義がroomHub
含まれているため、サーバーが稼働中であることがわかります。
ただし、$.connection.hub.start()
実行すると、http://app.dev.alanta.com:8080/signalr/signalr/negotiate?=1353072553935のような URL への接続を開こうとする必要があるようです。代わりに、Firebug は 8080 の部分を無視していて、代わりに URL http://app.dev.alanta.com/signalr/signalr/negotiate?=1353072553935との接続をネゴシエートしようとしていると教えてくれます。もちろん、それは機能しません。ポート 80 でリッスンしている SignalR サービスはなく、通常の Web サーバーだけです。そのため、「接続できません: SignalR: ネゴシエーション要求中にエラーが発生しました」というメッセージが表示されて失敗します。
また、jquery.signalR-0.5.3.js ファイルでは、接続を解析するコードの一部が実際にポートを無視しているように見えることにも注意してください。
// Resolve the full url
parser.href = connection.url;
if (!parser.protocol || parser.protocol === ":") {
connection.protocol = window.document.location.protocol;
connection.host = window.document.location.host;
connection.baseUrl = connection.protocol + "//" + connection.host;
}
else {
connection.protocol = parser.protocol;
connection.host = parser.host;
connection.baseUrl = parser.protocol + "//" + parser.host;
}
// Set the websocket protocol
connection.wsProtocol = connection.protocol === "https:" ? "wss://" : "ws://";
これはバグですか?それとも私は何かを誤解していますか?