SignalR appelle la méthode client de l'extérieur du hub en utilisant GlobalHost.ConnectionManager.GetHubContext ne fonctionne pas. Mais appeler de l'intérieur du hub ne

j'essaie d'appeler une méthode client à partir de l'action d'un contrôleur D'API Web.

je peux faire ça?

le seul post que je peux trouver qui se rapproche de ce que je cherche à faire est celui-ci:

SignalR + affichage d'un message vers un Hub via une méthode d'action

là-dedans un message est envoyé de l'intérieur d'un asp.net action du contrôleur MVC en utilisant GlobalHost.ConnectionManager.GetHubContext.

quand j'essaie que dans l'action de mon API Web aucune erreur ne soit lancée, mais la méthode "methodInJavascript" n'est jamais invoquée du côté du client.

    Public ActionResult MyControllerMethod()
    {
        var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
        context.Clients.All.methodInJavascript("hello world");
        // or
        context.Clients.Group("groupname").methodInJavascript("hello world");
    }

quand je mets un point d'arrêt à l'intérieur de cette action, je vois que le code est atteint et exécuté. Cependant, il ne se passe rien du côté du client javascript.

pourquoi? L'API Web est-elle si différente sous le capot que cela ne fonctionne pas? Quelqu'un d'autre a essayé et eu du succès?

quand j'appelle le" methodInJavascript "de" l'intérieur " de mon hub, il fonctionne parfaitement. Cela ne fonctionne tout simplement pas lorsqu'il est appelé à partir de l'action d'un contrôleur D'API Web.

mise à jour:

après des recherches sur cette question, je n'ai pas de solution. Je ne peux que supposer qu'il manque quelque chose dans les exemples comme ce serveur à messages client ne va pas à travers avec SignalR in ASP.NET MVC 4 et ce appelant SignalR hub depuis le contrôleur WebAPI émet comme peut-être il y a une étape de configuration supplémentaire pour permettre l'appel depuis un HubContext ou quelque chose. Le code que j'ai initialement posté ici est comme celui qui apparaît dans ces exemples n'a pas été démontré d'être défectueux de quelque manière que ce soit. Quelqu'un voit un défaut dans le code? Appel à partir de travaux html. Je fais beaucoup dans mes applications et jamais de problème. Je n'ai jamais j'ai vu un appel du HubContext dans un contrôleur D'API fonctionner. Pas d'erreurs. Juste pas de résultats sur le client.

résolu (type de):

Code ci-dessus fonctionne effectivement comme lors de la publication . Ne fonctionne pas dans L'environnement Visual Studio dev via localhost cependant. Aucune erreur, mais aucun résultat du côté du client. Publier le code tel quel sur un serveur réel sur le web fonctionne en effet. Je n'ai jamais pensé qu'il y aurait un différence donc je n'ai jamais essayé. J'ai pensé que si ça ne marchait pas localement ça ne marcherait pas publié. Il fonctionne en direct maintenant, mais je me demande pourquoi il ne fonctionne pas via localhost dans l'environnement dev. On ne peut pas tester localement avec des points de rupture et autres.

j'ai le sentiment que c'est ce répertoire virtuel signalr. Quelque chose est différent lorsqu'il est exécuté localement vs publiés. Pas sûr de quoi, mais je vois beaucoup de messages comme http://www.bitwisejourneys.com/signalr-hosting-in-iis-a-nasty-gotcha / . Lisez maintenant pour voir s'il y a un moyen de le faire fonctionner localement et de le publier.

30
demandé sur Community 2013-12-13 11:24:05

2 réponses

je suis tombé sur le même problème il y a quelques jours. Qui a pris mes 2 jours pour trouver une solution et de le résoudre. Après quelque enquête sérieuse la cause racine des problèmes était le résolveur de dépendance signalr que j'ai mis habituellement.

À la fin, j'ai trouvé ce lien et qui disait ceci:

Remplacement de la DependencyResolver

vous pouvez changer le résolveur de dépendances pour utiliser votre DI conteneur de choix en paramétrant GlobalHost.DependencyResolver.

NOTE: ne pas surcharger le résolveur global dans PreApplicationStart, it ne fonctionnera pas, ou il va travailler parfois seulement. Le faire dans PostApplicationStart (en utilisant WebActivator) ou dans Global.asax.

la place importante ici la NOTE. Bien sûr, après signalr 2.0 Cette documentation devient dépréciée . J'ai donc mélangé certains d'ici avec la nouvelle API SignalR. Dans la nouvelle API SignalR ne plus utiliser WebActivatorEx. OwinStartup a préféré WebActivator.

[assembly: OwinStartupAttribute(typeof(YourNamespace.Startup))]
namespace YourNamespace
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            //IoC container registration process
            UnityConfig.RegisterComponents();

            UnityConfig.Container.RegisterType<AHub, AHub>();

            HubConfiguration config = new HubConfiguration();
            config.EnableJavaScriptProxies = true;


            //You should remove your dependency resolver code from here to Global.asax Application_Start method. Before setting the MVC properties.
            //config.Resolver = new SignalrDefaultDependencyResolver(UnityConfig.Container); // your dependency resolver
            //


            app.MapSignalR(config);
        }
    }
}

et dans votre global.asax 151930920"

namespace YourNamespace
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            //Here your SignalR dependency resolver
            GlobalHost.DependencyResolver = new SignalrDefaultDependencyResolver(UnityConfig.Container);


            //other settings goes on
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);

            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
}

je ne veux pas envoyer tout le code ici, pour montrer le vrai problème.

Donc pour moi tout fonctionne bien pour le moment. L'injection de dépendance fonctionne aussi. Mais la mauvaise partie est partout où J'ai cherché David Fowler disait " son de par leur conception". J'ai commencé à penser, c'est cette conception vraiment nécessaire ou une erreur.

espérons que cela aide quelqu'un d'autre qui fait de la recherche pour le même problème.

25
répondu Yusuf Uzun 2014-08-05 00:24:41

j'ai eu le même problème, et il est lié au CIO (avec quoi que ce soit comme ninject ou castle). Si vous définissez le résolveur de dépendances global à votre gestionnaire D'IoC, il remplacera également la résolution de pipeline interne SignalR. Cela rend votre hub client SingleTon, ne fonctionne pas correctement.

Je l'ai résolu en n'ayant que les Hubs serveur étant IoC-ed Le code ci-dessous nécessite SignalHubActivator (vous pouvez le trouver sur internet)

maintenant, GlobalHost.ConnectionManager.GetHubContext retournera l'instance unique et les méthodes du client seront à nouveau appelées correctement!

 //configuration.Resolver = signalrDependency ; dont, this will cause GlobalHost.ConnectionManager to be intercepted by Castle


 configuration.Resolver.Register(typeof(IHubActivator),
                                      () => new SignalHubActivator(container));
1
répondu Egbert Nierop 2017-06-16 20:56:03