4

私が見つけたSignalRの例のほとんどは、 ASP.NET (MVC かどうか) を想定しています。NancyFXを使用しています。問題が 1 つだけあるので、ASP.NET ではないことを補うために、見落としていること、または Nancy で行う必要があることを望んでいます。

私の 1 つの目標は、サーバー イベントが発生したときにクライアント ブラウザーに通知できるようにすることです。Nancy ルートをハブ メソッドに置き換えるつもりはありません。しかし、ルート (アクション) からブラウザーを呼び出す機能が必要です。

SignalR Wikiの例に従って作成した非常に単純なハブがあります。クライアントをサーバーに呼び出すつもりはないので、それが必要かどうかさえわかりません。

public interface IUserNotifier
{
    void Start();
    void Notify(object @event);
}

後でナンシールートで使用するために同じハブを挿入できるようになることを期待して、インターフェイスを使用しました...それがカードにあるかどうかはわかりません。

[HubName("userNotifier")]
public class UserNotifier : Hub, IUserNotifier
{        
    public void Start()
    {
        Notify(new {Status = "Started"});
    }

    public void Notify(object @event)
    {
        Clients.notification(@event);
    }
}

Start()HTML ファイルに次のコードがある場合、メソッドが実行され、次にメソッドが実行Notify()され、コンテンツがクライアントに配信されることがわかります。

var communicator = $.connection.userNotifier;

$.extend(communicator, {
    Notification: function(event) {
        alert("notification received from server!");
        console.log(event);
    }
});

$.connection.hub.start()
    .done(function() {
        communicator.start();
});

私が言ったように、ハブを「開始」すると、クライアントに通知が送信されます。とてもかっこいい。しかし、私の第一の目標はまだ達成されていません。これらの通知は、「リクエスト」に直接関連付けられていないコード内の他の場所から開始する必要があります。

ルートで使用するために nancy モジュールに IUserNotifier を挿入しようとしましたが、Notify()起動すると次のようになります。

null 参照に対して実行時バインドを実行できません

これClientsは、基本クラスのプロパティHubが null (初期化されていない) であるためです。それで、ギアを切り替えました。「ハブの外部からハブを介したブロードキャスト」というセクションのハブに関する wiki ページの例を含む、複数の例に従うことを試みました。

public class NotifierModule : NancyModule
{
    public NotifierModule(){

        Get["/notify/{message}"] = p => { 
            var context = GlobalHost.ConnectionManager.GetHubContext<UserNotifier>();
            context.Clients.notification(new { Message = p.message });
        };
    }
}

私の Nancy ルートは、エラーをスローすることなく実行されます。私のブラウザがメッセージを受信しないことを除いて。ルートにブレークポイントを設定すると、それが初期化されていることがわかりClientsます。おそらく、クライアントのコレクションは初期化されていますが空です。知るか?多分あなたはそうします。:)

繰り返しますが、私の主な目標は、コードのどこからでもいつでもイベント/通知をブラウザーに送信できるようにすることです。それは聞きすぎですか?私はここで何をすべきですか?

4

1 に答える 1

2

きっと、あなたはすでに答えを見つけているに違いありません。ただし、他の誰かが同様の問題に遭遇した場合に備えて、手助けできると思いました. .NET 側のサーバーがクライアントにメッセージを送信するには、ハブへの接続も確立する必要があります。

var connection = new HubConnection("http://localhost/");
connection.Start();
connection.Notify("Hello");

次の公式の例を確認してください。

https://github.com/SignalR/SignalR/blob/master/samples/Microsoft.AspNet.SignalR.Client.Samples/Program.cs

于 2013-05-19T02:54:41.753 に答える