10

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://";

これはバグですか?それとも私は何かを誤解していますか?

4

1 に答える 1

24

これを試してみてもうまくいかなかったと断言できますが、さらにトラブルシューティングを行っていたので、URL の割り当てを次のように変更しました。

$.connection.url = "http://<%=Request.Url.Host %>:8080/signalr";

これに:

$.connection.hub.url = "http://<%=Request.Url.Host %>:8080/signalr";

そして確かに、これはここに文書化されている方法です。どこかで最初の方法が文書化されているのを見たと思いましたが、今は見つかりません。しかたがない。私が十分な注意を払っていないので、これをチョークで書きます。

于 2012-11-16T17:55:58.800 に答える