web-dev-qa-db-fra.com

Utilisation de l'API Web en tant que serveur SignalR et utilisation depuis le service Windows

J'ai une application Web et un service Windows sur le même serveur. L'application Web communique avec le service Windows à l'aide de .net remoting. Le service Windows vérifie si la connexion avec LDAP fonctionne, puis renvoie true, sinon une exception est levée. Le statut du service Windows est mis à jour sur le site Web.

Maintenant, l'infrastructure va être changée. L'application Web est en cours d'utilisation sur Azure et le service Windows restera sur l'ordinateur du client (le LDAP étant du côté client). Je dois mettre à jour le statut de l'application Web comme maintenant. J'ai introduit l'API Web en tant que couche intermédiaire entre l'application Web et le service Windows.

Je ne peux pas trouver une meilleure solution pour réaliser ce scénario. J'ai des considérations à utiliser SignalR ou Akka.remote.

Ce que je pense jusqu'à présent, si j'utilise SignalR dans l'API Web et le service Windows et que je fais les choses suivantes:

  • Application Web utilise la méthode de l'API Web
  • La méthode de l'API Web utilise SignalR et envoie le signal au service Windows
  • Le service Windows vérifie la connectivité LDAP et appelle la méthode de l'API Web pour renvoyer l'état.

Remarque: je ne sais pas comment nous pouvons rendre Windows Service en tant que client et le rendre capable d'écouter si l'API Web lui envoie un signal car je n'ai pas besoin d'utiliser l'auto-hébergement pour le service Windows. Peut-on utiliser l'API Web car elle est déjà hébergée?.

Est-ce réalisable? ou y a-t-il une meilleure solution? S'il vous plaît aider. Merci d'avance.

4
Imran Yaseen

J'ai pu régler ce problème et trouver la solution.

configuration de SignalR dans startup.cs de l'API Web

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

dans le hub ajouté à l'API Web

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

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

    }

dans la méthode d'action de l'API Web

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

dans l'application console, ajoutez SignalR Client

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

}

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

Maintenant, lancez l’API Web dans Postman et lancez également l’application console. La communication à double sens sera établie.

Remarque: Le code ci-dessous est un correctif qui résolvait le problème suivant: lors de la fermeture de la console, l'événement OnDisconnected n'était pas déclenché immédiatement.

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

Vérifiez le résultat montrant l'image.

5
Imran Yaseen

Selon votre description, vous vérifiez la connectivité LDAP à l'aide d'un service Windows et vous souhaitez diffuser l'état de la connexion LDAP aux clients pour afficher les mises à jour sur une page Web. Si vous intégrez SignalR à l'API Web en tant que couche intermédiaire, vous pouvez appeler cette API Web à partir de votre service Windows et vous pouvez vous reporter au code suivant pour diffuser l'état de la connexion LDAP aux clients.

dans l'action du contrôleur API Web

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

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

En outre, si vous pouvez installer Microsoft.AspNet.SignalR.Client dans votre service Windows, vous pouvez essayer d’appeler directement une méthode de concentrateur dans votre service Windows, le code suivant vous est destiné.

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

La méthode de l'API Web utilise SignalR et envoie le signal au service Windows

S'il vous plaît clarifier plus sur cette exigence. Si vous souhaitez permettre aux clients d'extraire et de vérifier les enregistrements d'état de connexion LDAP, vous pouvez stocker des enregistrements d'état de connexion dans un stockage externe, puis interroger des enregistrements d'état de connexion à partir de ce stockage externe et envoyer les résultats aux clients de votre API Web. d'appeler le service Windows.

0
Fei Han