2

だから私はSignalRを使用しています、それは私のウェブサイトで正しくセットアップされて動作しています。

ユーザーAがログインするとします(私はMembership APIを使用しています)。Aがログインすると、マスターページにある.jsから接続を呼び出しています。これにより、特定のuserIdを使用するように割り当てられます。

ここで、ユーザーBのログインが何らかのイベントを実行し、そのイベントがコードビハインドからユーザーAに通知する必要があるとします。

したがって、ここで私が行おうとしているのは、CodeBehindからの使用AのアクションをユーザーBに通知することです。ユーザーBはユーザーAのIDをどのように知り、全体がどのように機能するのでしょうか。ドキュメントにはそのようなものが含まれていないため、ヘルプを見つけることができませんでした。

これはどのように達成できますか?ありがとう。

4

2 に答える 2

5

これはすでに回答されていることを認識していますが、人々が役立つと思われる別のオプションがあります。これを行う方法に関する情報を見つけるのに苦労したので、これが他の人の助けになることを願っています.

SignalR ClientID の生成をオーバーライドして、メンバーシップの UserID を使用することができます。これは、CleintID -> UserID マッピングを維持する必要がないことを意味します。

これを行うには、IClientIdFactory インターフェイスを実装するクラスを作成します。次のようなことができます:

public class UserIdClientIdFactory : IClientIdFactory
{
    public string CreateClientId(HttpContextBase context)
    {
        // get and return the UserId here, in my app it is stored
        // in a custom IIdentity object, but you get the idea
        MembershipUser user = Membership.GetUser();
        return user != null ? 
             user.ProviderUserKey.ToString() : 
             Guid.NewGuid().ToString();
    }
}

そして、global.asax で:

SignalR.Infrastructure.DependencyResolver.Register(typeof(IClientIdFactory), () => new UserIdClientIdFactory());

編集 - 下記の nillls のように、signalR バージョン 0.4 で変更されました。ClientId ではなく ConnectionId を使用します。

public class UserIdClientIdFactory : IConnectionIdFactory
{
    public string CreateConnectionId(SignalR.Hosting.IRequest request)
    {
        // get and return the UserId here, in my app it is stored
        // in a custom IIdentity object, but you get the idea
        MembershipUser user = Membership.GetUser();
        return user != null ? 
             user.ProviderUserKey.ToString() : 
             Guid.NewGuid().ToString();
    }
}

そして DependencyResolver は移動しました:

SignalR.Hosting.AspNet.AspNetHost.DependencyResolver.Register(typeof(IConnectionIdFactory), () => new UserIDClientIdFactory());

これが誰かを助けることを願っています!

于 2011-11-24T01:10:11.070 に答える
0

アプリは、SignalR クライアント (接続) ID からユーザー ID/名前へのマッピングを格納する必要があります。これにより、ユーザー B の現在の SignalR クライアント ID を検索し、それを使用してメッセージを直接送信できます。この例については、https://github.com/davidfowl/JabbRのチャット サンプル アプリをご覧ください。

于 2011-11-18T17:22:42.937 に答える