2017-02-08 3 views
1

J'essaie de créer un projet de test SignalR simple; cependant, il ne se comporte pas comme je le crois. J'ai un site web avec le code suivant:Projet de test Signalr ne fonctionne pas comme prévu

namespace SignalRTest3 
{     
    public class MyHub1 : Hub 
    { 
        public void Hello(string message) 
        { 
            Clients.All.Hello(); 
             
        } 
    } 
} 

Startup.cs:

[assembly: OwinStartupAttribute(typeof(SignalRTest3.Startup))] 
namespace SignalRTest3 
{ 
    public partial class Startup 
    { 
        public void Configuration(IAppBuilder app) 
        { 
            ConfigureAuth(app); 

      app.UseCors(CorsOptions.AllowAll); 
            app.MapSignalR(); 
        } 
    } 
} 

J'ai changé la page d'index:

<body> 
    <!-- HTML Content --> 

    <script type="text/javascript" src="~/Scripts/jquery-1.10.2.min.js"></script> 
    <script type="text/javascript" src="~/Scripts/jquery.signalR-2.1.2.min.js"></script> 
    <script type="text/javascript" src="~/signalr/hubs"></script> 
    <script type="text/javascript" src="~/Scripts/SignalRTest.js"></script> 
    <div class="jumbotron"> 
        <h1>SignalR Test</h1> 
    </div> 
</body> 

Et le fichier JS référencé ci-dessus est :

$(function () { 
    // Declare a proxy to reference the hub.  
    var hub = $.connection.MyHub1; 

    // Create a function that the hub can call to broadcast messages. 
    hub.client.Hello = function (message) { 

        alert(message); 
    }; 

    hub.start(); 
}); 

Ainsi, l'intention i s que, lors de la réception d'une notification, le site affichera une alerte. Pour déclencher cela, j'ai une application console:

class Program 
{ 
    static void Main(string[] args) 
    { 
        Console.Write("Message: "); 
        string message = Console.ReadLine(); 

        HubConnection connection = new HubConnection("http://localhost:4035/"); 
        IHubProxy hub = connection.CreateHubProxy("MyHub1"); 
        connection.Start().Wait(); 
        hub.Invoke<string>("Hello", message).Wait();             
    } 
} 

Je tapez un message, et peut voir que le code dans les feux de moyeu, mais il semble qu'il y ait quelque chose de mal avec le câblage entre le javascript et le moyeu ; s'il vous plaît quelqu'un peut me pointer dans la bonne direction?

EDIT: modifier les signatures de méthode et hub.start selon la suggestion de JPThorne

EDIT: essayé d'utiliser CORS, mais en vain

Il semble que le problème peut être avec le proxy; Je reçois la sortie suivante dans la fenêtre de la console F12:

Uncaught TypeError: Cannot read property 'MyHub1' of undefined 
    at HTMLDocument.<anonymous> (VM456 SignalRTest.js:3) 
    at c (jquery-1.10.2.min.js:21) 
    at Object.fireWith [as resolveWith] (jquery-1.10.2.min.js:21) 
    at Function.ready (jquery-1.10.2.min.js:21) 
    at HTMLDocument.q (jquery-1.10.2.min.js:21) (anonymous) @ VM456 SignalRTest.js:3 c @ jquery-1.10.2.min.js:21 fireWith @ jquery-1.10.2.min.js:21 ready @ jquery-1.10.2.min.js:21 q @ jquery-1.10.2.min.js:21 

MISE À JOUR:

Merci à l'aide de JPThorne, j'ai finalement dépisté vers le bas dans le fichier BundleConfig; la mienne ressemblait à ceci:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
      "~/Scripts/jquery-{version}.js")); 

bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
      "~/Scripts/jquery.validate*")); 
// Use the development version of Modernizr to develop with and learn from. Then, when you're 
// ready for production, use the build tool at http://modernizr.com to pick only the tests you need. 
bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
      "~/Scripts/modernizr-*")); 

bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
      "~/Scripts/bootstrap.js", 
      "~/Scripts/respond.js")); 

bundles.Add(new StyleBundle("~/Content/css").Include(
      "~/Content/bootstrap.css", 
      "~/Content/site.css")); 

mieux que je peux recueillir, l'expression régulière pour {version} sur ~/Scripts/jquery-{version}.js a également été ramasser les scripts SignalR trop tôt!

+0

Une question rapide, ces deux codes sont dans le même projet ou deux projets différents parce que l'un IMO semble être une application basée sur la console et un autre basé sur le Web. Est-ce correct? – Prabhat

+0

Oui - applications distinctes. Application de console pour envoyer le message et application Web pour l'afficher –

+2

Il est important que vous autorisiez également CORS. Voir https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client – Tester

Répondre

1

Vous devez également démarrer le concentrateur côté client. Eh bien, c'est ce qui fonctionne pour nous. Vous pouvez essayer ceci:

$.connection.hub 
    .start() 
    .done(function() { console.log("Hub started"); }) 
    .fail(function() { console.log("Error: could not connect"); }); 

En outre, j'ai trouvé les auditeurs suivants pour être à portée de main:

$.connection.hub.connectionSlow(function() { 
    console.log("We are currently experiencing difficulties with the connection."); 
}); 

$.connection.hub.error(function (error) { 
    console.log("SignalR error: ", error); 
}); 

MISE À JOUR # 1: je changerais Clients.All.hello(); sur votre serveur pour être Clients.All.hello(message);

puis sur la modification FE hub.client.Hello = function (name, message) à hub.client.Hello = function (message)

MISE À JOUR # 2 : Ajouter: [HubName("MyHub1")] ci-dessus public class MyHub1 : Hub

MISE À JOUR # 3:

Ok j'ai donc essayé votre version, et il y a quelques problèmes en réalité.

  1. Ne pas appeler commencer comme ceci: hub.start(); appellent comme ceci: $.connection.hub.start();
  2. Vous pouvez passer à la dernière version de jquery.
  3. Assurez-vous que vous référencez jquery au-dessus de votre SignalRTest.js - c'est pourquoi vous obtenez cette erreur 'ne peut pas lire la propriété d'undefined' ci-dessus.
+0

Il semblerait que, même si cela peut être correct, ce n'est pas la réponse complète (toujours pas l'alerte). –

+0

Ok, donc regarder à nouveau votre code, je vois: publique vide Bonjour (message string) et hub.client.Hello = function (nom, message) { si ... vous n'utilisez pas le premier message de chaîne - vous ne le transmettez pas. Et sur le script frontal, vous avez un nom de paramètre supplémentaire. Vérifier ma dernière mise à jour. Les params doivent correspondre. – JPThorne

+0

J'ai essayé cela. J'ai même essayé de jouer avec le cas de la méthode (Bonjour/Bonjour), mais pas de dés. –