web-dev-qa-db-ja.com

SignalRサーバーとしてWeb APIを使用し、Windowsサービスから使用する

同じサーバー上にWebアプリケーションとWindowsサービスがあり、Webアプリケーションは.netリモート処理を使用してWindowsサービスと通信します。 Windowsサービスは、LDAPとの接続が機能しているかどうかを確認し、trueを返します。それ以外の場合、例外がスローされます。 Windowsサービスのステータスがウェブサイトで更新されます。

これで、インフラストラクチャが変更されます。 WebアプリケーションはAzureで実行され、Windowsサービスはクライアントのマシンに残ります(LDAPがクライアント側にあるため)。今と同じように、Webアプリケーションのステータスを更新する必要があります。 WebアプリケーションとWindowsサービスの中間層としてWeb APIを導入しました。

このシナリオを達成するためのより良い解決策を見つけることができません。 SignalRまたはAkka.remoteの使用を検討しています。

SignalRをWeb APIとWindowsサービスで使用して、次のことを行った場合、これまでに考えていること:

  • WebアプリケーションはWeb APIメソッドを使用します
  • Web APIメソッドはSignalRを使用し、Windowsサービスにシグナルを送信します
  • WindowsサービスはLDAP接続を確認し、Web APIメソッドを呼び出してステータスを返します。

注:Windowsサービスをセルフサービスでホストする必要がないため、クライアントとしてWindowsサービスを作成し、Web APIが信号を送信した場合にWindowsサービスをリッスンできるようにする方法がわかりません。すでにホストされているため、Web APIを使用できますか?.

それは達成可能ですか?またはより良い解決策はありますか?助けてください。前もって感謝します。

6
Imran Yaseen

私はこの問題を解決することができ、解決策を得ました。

Web APIのstartup.csのSignalR構成

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.MapSignalR("/signalr", new Microsoft.AspNet.SignalR.HubConfiguration());
    }
}

Web APIでハブを追加しました

    public class ServiceStatusHub : Hub
    {
        private static IHubContext hubContext = 
        GlobalHost.ConnectionManager.GetHubContext<ServiceStatusHub>();

        public static void GetStatus(string message)
        {
            hubContext.Clients.All.acknowledgeMessage(message);
        }

    }

Web APIアクションメソッド内

    public IEnumerable<string> Get()
    {
        // Query service to check status
        ServiceStatusHub.GetStatus("Please check status of the LDAP!");
        return new string[] { "val1", "val2" };
    }

コンソールアプリケーションでSignalRクライアントを追加

public class SignalRMasterClient
{
    public string Url { get; set; }
    public HubConnection Connection { get; set; }
    public IHubProxy Hub { get; set; }

    public SignalRMasterClient(string url)
    {
        Url = url;
        Connection = new HubConnection(url, useDefaultUrl: false);
        Hub = Connection.CreateHubProxy("ServiceStatusHub");
        Connection.Start().Wait();

        Hub.On<string>("acknowledgeMessage", (message) =>
        {
            Console.WriteLine("Message received: " + message);

            /// TODO: Check status of the LDAP
            /// and update status to Web API.
        });
    }

    public void SayHello(string message)
    {
        Hub.Invoke("hello", message);
        Console.WriteLine("hello method is called!");
    }

    public void Stop()
    {
        Connection.Stop();
    }

}

Program.csクラス

class Program
{
    static void Main(string[] args)
    {
        var client = new SignalRMasterClient("http://localhost:9321/signalr");

        // Send message to server.
        client.SayHello("Message from client to Server!");

        Console.ReadKey();

        // Stop connection with the server to immediately call "OnDisconnected" event 
        // in server hub class.
        client.Stop();
    }
}

次に、postmanでWeb APIを実行し、コンソールアプリも実行します。双方向通信が確立されます。

注:以下のコードは、コンソールを閉じたときにOnDisconnectedイベントがすぐにトリガーされない問題の修正です。

    public void Stop()
    {
        Connection.Stop();
    }

結果を示す画像を確認してください。

8
Imran Yaseen

説明によると、Windowsサービスを使用してLDAP接続を確認し、LDAP接続ステータスをクライアントにブロードキャストして、更新をWebページに表示します。 SignalRをWeb APIと中間層として統合する場合、WindowsサービスからそのWeb APIを呼び出すことができ、次のコードを参照してLDAP接続ステータスをクライアントにブロードキャストできます。

Web APIコントローラアクション

var context = Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<ChatHub>();

context.Clients.All.addNewMessageToPage("{new_ LDAP_connectivity}");

さらに、Windowsサービスに Microsoft.AspNet.SignalR.Client をインストールできる場合は、Windowsサービスで直接ハブメソッドを呼び出そうとすることができます。次のコードは参照用です。

var hub = new Microsoft.AspNet.SignalR.Client.HubConnection("http://xxxxxx/signalr/hubs");

var proxy = hub.CreateHubProxy("ChatHub");
hub.Start().Wait();

//invoke hub method
proxy.Invoke("addNewMessageToPage", "{new_ LDAP_connectivity}");

Web APIメソッドはSignalRを使用し、Windowsサービスにシグナルを送信します

この要件について詳しく説明してください。クライアントがLDAP接続ステータスレコードを取得して確認できるようにする場合は、接続ステータスレコードを外部ストレージに保存し、その外部ストレージから接続ステータスレコードをクエリして、Web APIでクライアントに結果をプッシュすることができます。 Windowsサービスの呼び出し。

0
Fei Han