web-dev-qa-db-ja.com

外部からSignalRハブメソッドを呼び出すにはどうすればよいですか?

これは私のHubコードです:

public class Pusher : Hub, IPusher
{
    readonly IHubContext _hubContext = GlobalHost.ConnectionManager.GetHubContext<Pusher>();

    public virtual Task PushToOtherInGroup(dynamic group, dynamic data)
    {
        return _hubContext.Clients.Group(group).GetData(data);
    }
}

私はこのコードで別のプロジェクトでこのメソッドを呼び出したいです:

var pusher = new Pusher.Pusher();
pusher.PushToOtherInGroup("Test", new {exchangeTypeId, price});

メソッドを呼び出すときにPushToOtherInGroupを呼び出したいのですが、エラーは発生しませんが、プッシャーが機能しません。

これは私のUiコードです:

$(function() {
    hub = $.connection.pusher;
    $.connection.hub.start()
        .done(function() {
            hub.server.subscribe('newPrice');
            console.log('Now connected, connection ID=' + $.connection.hub.id);
        })
        .fail(function() { console.log('Could not Connect!'); });
});

(function() {
    hub.client.GetData = function (data) {
        debugger;
    };
});

私の問題は何ですか?

15
user1968030

そのように直接ハブクラスをインスタンス化して呼び出すことはできません。 SignalRランタイムによってハブクラスの周りに提供されている多くの配管は、そのような「プレーンな古いクラス」として使用することによってバイパスしています。

外部からSignalRハブとやり取りする唯一の方法は、SignalRランタイムからハブを表すIHubContextのインスタンスを実際に取得することです。他の「プロジェクト」がSignalRコードを使用してプロセスで実行されている限り、これは同じプロセス内からのみ実行できます。

他のプロジェクトが別のプロセスで実行される場合、実行したいことは、別のSignalRハブまたは通常の古いWebサービス(ASP.NET Web APIを使用)の一種である「コンパニオン」APIを公開することです。この他のアプリケーションから呼び出して、必要な動作をトリガーできます。どちらのテクノロジを選択する場合でも、認証されたアプリケーションだけが呼び出すことができるように、これをセキュリティで保護する必要があります。

どのアプローチを取るかを決定したら、Pusherハブ経由でメッセージを送信するために行うことはすべて次のようになります。

// Get the context for the Pusher hub
IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<Pusher>();

// Notify clients in the group
hubContext.Clients.Group(group).GetData(data);
20
Drew Marsh

別のプロジェクトからハブのメソッドを呼び出す場合は、同じアプリドメイン内に存在する必要があります。それがここにある場合、それを行う方法は次のとおりです。

コントローラーのアクションからハブメソッドを呼び出す (タイトルは気にせず、シナリオで機能します)

6

(ハブメソッドの外部からクライアントメソッドを呼び出してグループを管理する方法)のトピックにある this リンクをご覧ください。
コード例は、呼び出し元クラスのシングルトンインスタンスを作成し、IHubContextをそのコンストラクターに渡すだけです。次に、必要なcontext.Clients呼び出し元クラスのメソッド:

// This sample only shows code related to getting and using the SignalR context.
public class StockTicker
{
    // Singleton instance
    private readonly static Lazy<StockTicker> _instance = new     Lazy<StockTicker>(() => new StockTicker(GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>()));

private IHubContext _context;

private StockTicker(IHubContext context)
{
    _context = context;
}

// This method is invoked by a Timer object.
private void UpdateStockPrices(object state)
{
    foreach (var stock in _stocks.Values)
    {
        if (TryUpdateStockPrice(stock))
        {
            _context.Clients.All.updateStockPrice(stock);
        }
    }
}
0
Rzassar