0

そのため、次のコンポーネント/機能があるサンプルを作成しようとしています:

  • Windows サービスから自己ホストされる hangfire サーバー OWIN
  • ジョブが完了したときの SignalR 通知

Github プロジェクト

タスクをキューに入れて実行することはできますが、タスク/ジョブがいつ完了したかをクライアントに通知する方法を整理するのに苦労しています(現在、すべてうまく機能するまで)。

私の現在の問題は、SignalR ハブを「コア」ライブラリSampleCoreに配置したいのですが、webapp SampleWebを起動するときに「登録」する方法がわかりません。私がこれを回避した 1 つの方法は、実際のハブを継承し、単純な処理 (1 つのクライアントからすべてのクライアントにメッセージを送信する) に適したハブ クラスNotificationHubProxyを作成することです。

NotifyTaskCompleteでは、ハブ コンテキストを取得して、次のようにメッセージを送信できると思います。

private void NotifyTaskComplete(int taskId)
    {
        try
        {
            var hubContext = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
            if (hubContext != null)
            {
                hubContext.Clients.All.sendMessage(string.Format("Task {0} completed.", taskId));
            }
        }
        catch (Exception ex)
        {
        }
    }

しかし、NotificationHubProxy が使用されているクラスである場合、SampleWeb ライブラリの一部であり、SampleCore から参照すると循環参照が発生するため、これを行うことはできません。

主な問題は外部アセンブリのハブであることはわかっていますが、SignalR または MVC5 を使用している、またはこの特定の方法でセットアップされている関連サンプルを見つけることはできません。

何か案は?

4

1 に答える 1

2

したがって、解決策は次の2つのことを行うことでした。

  1. SampleCore アセンブリの SignalR .NET クライアントを使用して HubConnection を作成し、「NotificationHub」への HubProxy を作成し、それを使用して「SendMessage」メソッドを呼び出す必要がありました。

    private void NotifyTaskComplete(string hostUrl, int taskId)
    {
        var hubConnection = new HubConnection(hostUrl);
        var hub = hubConnection.CreateHubProxy("NotificationHub");
        hubConnection.Start().Wait();
        hub.Invoke("SendMessage", taskId.ToString()).Wait();
    }
    

しかし、その HubConnection を作成する一環として、OWIN インスタンスへの URL を知る必要がありました。そのパラメーターをタスクに渡し、次のように取得することにしました。

private string GetHostAddress()
{
    var request = this.HttpContext.Request;
    return string.Format("{0}://{1}", request.Url.Scheme, request.Url.Authority);
}
  1. ハブを外部アセンブリに配置するための解決策は、次のように、SignalR ルーティングをセットアップする前にアセンブリを読み込む必要があることです。

    AppDomain.CurrentDomain.Load(typeof(SampleCore.NotificationHub).Assembly.FullName);
    app.MapSignalR();
    

この部分のこのソリューションはhereから来ました。

于 2015-03-24T17:28:10.537 に答える