2017-09-22 1 views
0

웹 응용 프로그램과 Windows 서비스가 동일한 서버에 있고 웹 응용 프로그램이 .net 원격을 사용하여 Windows 서비스와 통신합니다. Windows 서비스는 LDAP와의 연결이 작동하는지 확인한 다음 true를 반환하고 그렇지 않으면 예외가 throw됩니다. Windows 서비스의 상태는 웹 사이트에서 업데이트됩니다.웹 API를 SignalR 서버로 사용하여 Windows 서비스에서 사용

이제 인프라가 변경 될 예정입니다. 웹 응용 프로그램은 Azure에서 진행되며 Windows 서비스는 클라이언트 시스템에 남아 있습니다 (LDAP가 클라이언트 측에 있음). 이제 웹 애플리케이션의 상태를 업데이트해야합니다. 웹 응용 프로그램과 Windows 서비스 사이에 중간 계층으로 웹 API를 도입했습니다.

이 시나리오를 달성하기위한 더 좋은 해결책을 찾을 수 없습니다. SignalR 또는 Akka.remote를 사용할 때 고려해야 할 사항이 있습니다. 내가 다음 웹 API 및 Windows 서비스에서 SignalR을 사용한다면 내가 지금까지 생각하고

:

  • 웹 응용 프로그램은 웹 API 방법을 소비는
  • 웹 API 방법은 SignalR을 사용하여 신호를 전송 Windows 서비스
  • Windows 서비스는 LDAP 연결을 확인하고 웹 API 메서드를 호출하여 상태를 반환합니다.

참고 : 저는 Windows 서비스 용 자체 호스팅을 사용할 필요가 없기 때문에 Windows 서비스를 클라이언트로 만들고 웹 API가 신호를 보내면 어떻게들을 수 있는지 알 수 없습니다. 이미 호스팅 된 상태에서 웹 API를 사용할 수 있습니까?

달성 가능합니까? 아니면 더 나은 해결책이 있습니까? 도와주세요. 미리 감사드립니다.

답변

0

이 문제를 해결하고 해결책을 찾았습니다.

시작시 SignalR 구성.웹 API에서 웹 API 웹 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" }; 
    } 

콘솔 응용 프로그램에서 지금 우체부의 웹 API를 실행 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(); 
    } 
} 

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

} 

를 추가하고 또한 콘솔 응용 프로그램을 실행합니다. 양방향 의사 소통이 설정됩니다.

참고 : 아래 코드는 콘솔을 닫았을 때 즉시 OnDisconnected 이벤트를 트리거하지 않았을 때의 문제를 해결합니다. 답장을 보내

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

Check the image showing result.

0

설명에 따르면 Windows 서비스를 사용하여 LDAP 연결을 확인하고 LDAP 연결 상태를 클라이언트에 브로드 캐스팅하여 웹 페이지에 업데이트를 표시하려고합니다. SignalR과 Web API를 중간 계층으로 통합하는 경우 Windows 서비스에서 해당 웹 API를 호출 할 수 있으며 다음 코드를 참조하여 클라이언트에 LDAP 연결 상태를 브로드 캐스트 할 수 있습니다. 당신이 당신의 Windows 서비스에서 Microsoft.AspNet.SignalR.Client를 설치할 수 있습니다 경우

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

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

게다가 웹 API 컨트롤러 액션에서

, 당신이 직접 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 연결 상태 레코드를 가져 와서 확인할 수있게하려면 외부 저장소에 연결 상태 레코드를 저장 한 다음 해당 외부 저장소에서 연결 상태 레코드를 쿼리하고 결과를 웹 API의 클라이언트에 푸시 할 수 있습니다 Windows 서비스 호출.

+0

안녕 프레드 한, 감사합니다. Windows 서비스가 다운되면 웹 API가 어떻게 알 수 있습니까? –

관련 문제