13

コントローラーから SignalR ハブのメソッドを呼び出す良い方法はありますか?

今私はこれを持っています:

public class StatsHub : Hub
{
    private static readonly Lazy<StatsHub> instance = new Lazy<StatsHub>(() => new StatsHub());
    public static StatsHub Instance { get { return instance.Value; } }

    public StatsHub()
    {
        if (this.Clients == null)
        {
            var hubContext = SignalR.GlobalHost.ConnectionManager.GetHubContext<StatsHub>();
            this.Clients = hubContext.Clients;
            this.Groups = hubContext.Groups;
        }
    }

    // methods here...
}

だから私のコントローラのアクションでは、例えば、私は言うことができます

StatsHub.Instance.SendMessage("blah");

これは、hubContext が Hub の Caller プロパティまたは Context プロパティを持たないことを除いて、ほとんど問題ありません。

うまくいけば、これを行うためのより良い方法がありますか?

4

2 に答える 2

18

GlobalHost.ConnectionManager.GetHubContext<MyHub>()ハブの外部からハブを介してブロードキャストする場合は、ハブのコンテキストを把握する必要があります。次に、このコンテキストを使用して、.Clientsプロパティを介してブロードキャストできます。

サンプルコードに示されているように、ハブコンテキストはすでに把握していますが、ハブ内でそうすることは、私の意見では正しくありません。コントローラーアクションからのロジックのみを使用している場合はSendMessage()、コードをコントローラーアクションに直接移動し、GetHubContext<T>()そこから取得したハブコンテキストを使用します。

サーバーへのリクエスト時にSignalRが関与していなかったため、プロパティを提供できないため、CallerorContextプロパティは常にこのシナリオに含まれることに注意してください。null

于 2012-09-17T17:03:40.790 に答える
16

私が必要としている DefaultHubManager を見つけました。

DefaultHubManager hd = new DefaultHubManager(GlobalHost.DependencyResolver);
var hub = hd.ResolveHub("AdminHub") as AdminHub;
hub.SendMessage("woohoo");

動作します。さらに良い/好ましい方法がある場合は、共有してください。

于 2012-09-17T12:10:28.950 に答える