18

これは私の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;
    };
});

私の問題は何ですか?

4

3 に答える 3

26

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

外部から SignalR ハブを操作する唯一の方法はIHubContext、SignalR ランタイムからハブを表す のインスタンスを実際に取得することです。これは同じプロセス内からのみ実行できるため、他の "プロジェクト" が 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);
于 2013-07-09T17:35:02.977 に答える
7

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

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

于 2013-07-09T17:32:12.187 に答える