2017-09-22 36 views
0

我在同一個服務器上使用.net遠程處理在Web應用程序與Windows服務進行通信時使用了Web應用程序和Windows服務。 Windows服務檢查與LDAP的連接是否正常工作,然後返回true,否則引發異常。來自Windows服務的狀態在網站上更新。使用Web API作爲SignalR服務器並從Windows服務中使用

現在基礎設施將會改變。 Web應用程序正在使用Azure,而Windows服務將保留在客戶機上(因爲LDAP位於客戶端)。我需要像現在一樣更新Web應用程序的狀態。我已經將Web API介紹爲Web應用程序和Windows Service之間的中間層。

我找不到更好的解決方案來實現這種情況。我有考慮使用SignalR或Akka.remote。

我在想什麼,到目前爲止,如果我在的Web API和Windows服務中使用SignalR並執行以下操作:

  • Web應用程序消耗的Web API方法
  • 的Web API方法使用SignalR併發送信號到Windows服務
  • Windows服務檢查LDAP連接並調用Web API方法返回狀態。

注意:我不知道如何讓Windows服務作爲客戶端,並使其能夠偵聽如果web api向它發送信號,因爲我不需要使用自己託管的Windows服務。我們可以使用網頁API,因爲它已經託管。

它可以實現嗎?或者有沒有更好的解決方案?請幫忙。 在此先感謝。

回答

0

我已經能夠解決這個問題,並得到了解決方案。

啓動時的SignalR配置。CS中的Web API

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

在網頁API加樞

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

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

    } 

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

現在運行在郵遞員在Web API,也運行控制檯程序。雙向溝通將建立。

注意:下面的代碼是關於控制檯關閉時不立即觸發OnDisconnected事件的問題的修復。

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

Check the image showing result.

0

根據您的描述,您使用Windows服務檢查LDAP連接,並且想要向客戶端廣播LDAP連接狀態以在網頁上顯示更新。如果您將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}"); 

的Web API方法使用SignalR併發送信號到Windows服務

請說明詳細瞭解此要求。如果您希望啓用客戶端來獲取並檢查LDAP連接狀態記錄,則可以將連接狀態記錄存儲在外部存儲中,然後您可以從該外部存儲中查詢連接狀態記錄,並將結果推送到Web API中的客戶端調用Windows服務。

+0

嗨弗雷德漢,感謝您的回覆。如果Windows服務已關閉,那麼web api如何知道? –