2017-09-22 3 views
0

WebアプリケーションとWindowsサービスが同じサーバーにあり、Webアプリケーションが.net remotingを使用してWindowsサービスと通信しています。 Windowsサービスは、LDAPとの接続が機能しているかどうかをチェックし、trueを返します。それ以外の場合は例外がスローされます。 Windowsサービスからのステータスは、Webサイトで更新されます。Web APIをSignalRサーバーとして使用し、Windowsサービスから消費する

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

このシナリオを達成するためのより良い解決策が見つかりません。私は、SignalRまたはAkka.remoteを使用するための考慮事項を持っています。私は、次のWeb APIとWindowsサービスでSignalRを使用して行う場合、私は、今のところ考えてい

  • Webアプリケーションは、Web APIメソッドを消費は
  • ウェブAPIメソッドはSignalRを使用して信号を送り、 Windowsサービス
  • WindowsサービスはLDAP接続をチェックし、Web APIメソッドを呼び出してステータスを返します。

注:Windowsサービスをセルフホスティングにする必要がないため、Windowsサービスをクライアントとしてどのようにして、Web APIがシグナルを送信するかを聞くことができます。すでにホストされているので、Web APIを使用できますか?

達成可能ですか?それとももっと良い解決策がありますか?助けてください。 ありがとうございます。

答えて

0

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

起動時のSignalR構成。ウェブAPIでWeb APIのWeb APIを追加しましたハブで

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

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

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

    } 

におけるCSのアクションメソッド

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(); 
    } 
} 

を追加します。今すぐ郵便配達でWeb APIを実行しても、コンソールアプリケーションを実行します。双方向のコミュニケーションが確立されます。

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

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

Check the image showing result.

0

説明によると、Windowsサービスを使用してLDAP接続をチェックし、クライアントにLDAP接続ステータスをブロードキャストしてWebページに更新を表示したいとします。 SignalRを中間層としてWeb APIと統合する場合は、WindowsサービスからそのWeb APIを呼び出すことができます。また、次のコードを参照して、クライアントにLDAP接続状態をブロードキャストできます。ウェブ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}"); 

ウェブAPIメソッドはSignalRを使用し、この要件についての詳細を明確にしてくださいWindowsサービス

に信号を送ります。クライアントがLDAP接続ステータスレコードを取得してチェックできるようにするには、接続ステータスレコードを外部ストレージに保存してから、その外部ストレージから接続ステータスレコードを照会し、結果をWeb APIのクライアントにプッシュできますWindowsサービスを呼び出す

+0

こんにちはフレッド・ハン、お返事に感謝。 Windowsサービスがダウンしている場合、どのようにWeb APIが知ることができますか? –

関連する問題