MVC-Chat サンプル アプリケーションにいくつかの簡単な変更を加え、2 つの webworker インスタンスで実行されている Azure にデプロイしました。クライアントは同じインスタンス上の他のクライアントとのみ通信できますが、これは後でバックプレーンを使用することで解決されます。
(Visual Studio から) サーバーに新しいコードをデプロイすると、インスタンスが 1 つずつアップグレードされ、すべてのクライアントが最初にインスタンス 2 に再接続され (インスタンス 1 が新しいコードを取得する間)、次にすべてのクライアントがインスタンス 2 に再接続されます。インスタンス 1 をアップグレードし、インスタンス 2 をアップグレードします。(実際にはコードを変更しておらず、再デプロイのみを行っています)。
問題は、クライアントが再接続した後、送信されたメッセージを受信できないクライアントもありますが、ブロードキャストを受信することです。
ここに私のハブコードがあります:
public class ChatHub : Hub
{
private string GetRoleId()
{
return RoleEnvironment.CurrentRoleInstance.Id;
}
public override Task OnConnected()
{
string message = String.Format("OnConnected ({0}) {1} - Version: {2}", GetRoleId(), Context.ConnectionId, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version);
Clients.All.newMessage(message);
return base.OnConnected();
}
public override Task OnDisconnected()
{
Clients.All.newMessage(String.Format("OnDisconnected ({0}) {1} - Version: {2}", GetRoleId(), Context.ConnectionId, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version));
return base.OnDisconnected();
}
public override Task OnReconnected()
{
Clients.All.newMessage(String.Format("OnReconnected ({0}) {1} - Version: {2}", GetRoleId(), Context.ConnectionId, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version));
return base.OnReconnected();
}
public void SendToConnection(string connectionId, string message)
{
Clients.Client(connectionId).newMessage(message);
}
}
私の Index.cshtml ファイルも非常にシンプルで、変更はほとんどありません。
@{
ViewBag.Title = "Index";
}
<script src="~/Scripts/jquery-1.8.2.js"></script>
<script src="~/Scripts/jquery.signalR-1.1.3.js"></script>
<script src="~/signalr/hubs"></script>
<script type="text/javascript">
$(function () {
var addMessage = function(message) {
var time = new Date();
$('#info').prepend('<li>' + time.toUTCString() + ' - ' + message + '</li>');
};
var chat = $.connection.chatHub;
chat.client.newMessage = function (message) {
addMessage('Incomming message: ' + $.connection.hub.transport.name + ' - ' + message);
};
var start = function () {
$.connection.hub.logging = true;
addMessage('Before start');
$.connection.hub.start().done(function () {
addMessage('After start');
});
};
$.connection.hub.stateChanged(function (state) {
addMessage('State changed (' + state.newState + '). ID: <b>' + $.connection.hub.id + '</b></li>');
});
start();
});
</script>
<div id="info"></div>
ブラウザー (私は Chrome を使用) でプライベート メッセージを自分自身に送信するには、開発者コンソールに次のように入力します。
$.connection.chatHub.server.sendToConnection($.connection.hub.id, '<b>Hey!</b>')
「ねえ」は、ブラウザの約 5 ~ 15% で表示されません。
これは、「ブラインド」されたブラウザがサーバーに再接続されたときに、javascript コンソール ウィンドウに表示されるものです。
[15:25:08 GMT+0200 (W. Europe Daylight Time)] SignalR: Keep alive has been missed, connection may be dead/slow. jquery.signalR-1.1.3.js:54
[15:25:14 GMT+0200 (W. Europe Daylight Time)] SignalR: Keep alive timed out. Notifying transport that connection has been lost. jquery.signalR-1.1.3.js:54
[15:25:16 GMT+0200 (W. Europe Daylight Time)] SignalR: Closing the Websocket jquery.signalR-1.1.3.js:54
[15:25:16 GMT+0200 (W. Europe Daylight Time)] SignalR: Clearing hub invocation callbacks with error: Connection started reconnecting before invocation result was received. jquery.signalR-1.1.3.js:54
[15:25:16 GMT+0200 (W. Europe Daylight Time)] SignalR: webSockets reconnecting jquery.signalR-1.1.3.js:54
[15:25:16 GMT+0200 (W. Europe Daylight Time)] SignalR: Connecting to websocket endpoint 'ws://myappname.cloudapp.net/signalr/reconnect?transport=webSockets&connectionToken=z-aUiXxW_jcBHDi631xCvrrQLoMtK0jVl3l-dRYcESU01cvkgDzwPfc8GlHk2P9zlmp-4GLwxLYdKzdUJi-vahn0qOGlEnc2Z85p8ecDT1fgTBLI0&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D&messageId=B%2C14&tid=3' jquery.signalR-1.1.3.js:54
[15:25:25 GMT+0200 (W. Europe Daylight Time)] SignalR: Websocket opened jquery.signalR-1.1.3.js:54
[15:25:25 GMT+0200 (W. Europe Daylight Time)] SignalR: Triggering client hub event 'newMessage' on hub 'ChatHub'. jquery.signalR-1.1.3.js:54
[15:25:25 GMT+0200 (W. Europe Daylight Time)] SignalR: Triggering client hub event 'newMessage' on hub 'ChatHub'. jquery.signalR-1.1.3.js:54
> $.connection.chatHub.server.sendToConnection($.connection.hub.id, '<b>Hey!</b>')
Object {state: function, always: function, then: function, promise: function, pipe: function…}
このバグを解決するための助けをいただければ幸いです。