2017-09-13 1 views
2

J'essaie de configurer SignalR avec mon système Azure. La configuration est assez standardAppel de SignalR à partir de la fonction Azure

  • portail web principal dans Azure service App écrite dans ASP.NET MVC
  • Un rôle de travailleur de services cloud qui effectue la logique métier. Le rôle de travail écoute sur une file d'attente sur laquelle le portail écrit. Quand un utilisateur démarre une opération qui prend beaucoup de temps à partir du portail, je souhaite que le service de cloud puisse informer tous les navigateurs connectés. Pour cela, je dois utiliser un service de cloud computing basé sur la logique commerciale C++ existante

via SignalR que le service cloud est complet.

Je pensais que je pouvais le faire en utilisant une fonction Azure comme un client SignalR, qui pourrait être déclenché pour forcer SignalR à diffuser un message en utilisant le code dans une fonction Azure comme celui-ci

HubConnection hub = new HubConnection(*URL OF PORTAL GOES HERE*); 

    var proxy = hub.CreateHubProxy(*NAME OF HUB GOES HERE*); 
    await hub.Start(); 
    await proxy.Invoke("Hello"); // Name of default hub method 

ASP.NET MVC côté , J'utilise également les files d'attente Azure Service Bus, ce qui semble être le conseil en matière de mise à l'échelle. Donc, dans mon Startup.cs j'ai

public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      GlobalHost.DependencyResolver.UseServiceBus(@"*SERVICE BUS CONNNECTION STRING GOES HERE*", "blah"); 
      app.MapSignalR(); 
     } 
    } 

Note: Pour que cela fonctionne avec la dernière SignalR je devais utiliser le paquet NuGet Microsoft.AspNet.SignalR.ServiceBus3 sinon je viens de recevoir un exception lors de l'appel UseServiceBus.

Maintenant, tout semble fonctionner. Je peux appeler la fonction Azure de PostMan et bien sûr dans mon navigateur l'appel de signal vient à travers.

Cependant, je ne suis pas sûr si c'est la bonne chose à faire. La mise à l'échelle fonctionnera-t-elle dans ce cas ou existe-t-il un meilleur moyen de forcer Signalr à diffuser des messages?

merci

+0

Vous devriez accepter la réponse de Rob comme réponse. Bonne étiquette Stackoverflow. – McGuireV10

Répondre

2

Vous avez la bonne idée. J'utilise la même architecture, sauf que j'utilise un WebJob à la place d'une fonction Azure. Quelques points:

  • C'est un bon choix pour aller avec le fond de panier de bus de service pour SignalR. Je l'ai exécuté avec des volumes assez élevés, et il fonctionne bien. Un autre développeur avec qui j'ai discuté ici sur StackOverflow est allé sur la route du fond de panier Redis et a eu beaucoup de problèmes.
  • Vous avez la bonne approche en créant un proxy dans votre fonction Azure. Toutefois, l'établissement d'une HubConnection est une opération lourde. Pour les performances, pensez à créer une fois HubConnection et proxy, puis à les réutiliser. Vous devrez vous assurer que vous gérez le cas où SignalR perd la connexion à votre Hub, épuise les tentatives, puis abandonne. Si vous réutilisez HubConnection et que cela se produit, vous avez des problèmes si vous n'avez pas de logique pour tenter de rétablir la connexion.