web-dev-qa-db-ja.com

SignalR-OnConnectedにパラメーターを送信しますか?

私は次のJSを使用しています。

var chat = $.connection.appHub;

私のアプリには、AppHubChatの2種類の通知を処理する単一のハブOtherがあります。常にすべての接続にアクセスする必要があるため、単一のハブを使用しています。

次のような方法で、OnConnectedにどのタイプかを伝えることができる必要があります。

[Authorize]
public class AppHub : Hub {
    private readonly static ConnectionMapping<string> _chatConnections =
        new ConnectionMapping<string>();
    private readonly static ConnectionMapping<string> _navbarConnections =
        new ConnectionMapping<string>();
    public override Task OnConnected(bool isChat) { // here
        string user = Context.User.Identity.Name;
        if (isChat){
            _chatConnections.Add(user, Context.ConnectionId);
            _navbarConnections.Add(user, Context.ConnectionId);
        } else{
            _navbarConnections.Add(user, Context.ConnectionId);
        }  
    }
}

使用法は、理想的には次のようになります。

var chat = $.connection.appHub(true);

そのパラメーターをjavascriptからハブに渡すにはどうすればよいですか?

更新:

メッセージを送る:

 // will have another for OtherMessage
 public void SendChatMessage(string who, ChatMessageViewModel message) {
        message.HtmlContent = _compiler.Transform(message.HtmlContent);
        foreach (var connectionId in _chatConnections.GetConnections(who)) {
            Clients.Client(connectionId).addChatMessage(JsonConvert.SerializeObject(message).SanitizeData());
        }
    }
14
RobVious

むしろ、クライアントから呼び出して型にサブスクライブするメソッドをハブに追加したいと思います。例えば。

public void Subscribe(bool isChat) {
    string user = Context.User.Identity.Name;
    if (isChat){
        _chatConnections.Add(user, Context.ConnectionId);
    } else{
        _otherConnections.Add(user, Context.ConnectionId);
    }
}

このメソッドは、ハブが接続された後に呼び出します。再接続せずに通知タイプを変更できるという点で、より柔軟性があります。 (購読解除および購読)

代替

余分な往復/柔軟性が必要ない場合。ハブに接続するときにQueryStringパラメーターを送信できます。 Stackoverflowの回答: クエリパラメータを使用したSignalrの持続的接続

 $.connection.hub.qs = 'isChat=true';

そしてOnConnectedで:

 var isChat = bool.Parse(Context.QueryString["isChat"]);
27