2017-04-27 7 views
1

J'ai une application ASP.NET. Je cours en cliquant debug. Il fonctionne sur localhost: 2842.ASP.NET SignalR Exception d'application client C# au démarrage

J'ai un SignalR Hub défini dans une classe sans méthodes sur le serveur.

J'ai une application WPF Windows C#. J'ai ajouté le paquet SignalR NuGet. J'utilise le code suivant pour instancier le proxy client:

 var hubConnection = new HubConnection("http://localhost:2842"); 

     IHubProxy myHubProxy = hubConnection.CreateHubProxy("MyHub"); 
     myHubProxy.On<string>("SendMeData", dataString => { 

      Console.WriteLine("String value {0}", dataString); 
     }); 

     hubConnection.Start().Wait(); 

Voici ma classe de moyeu défini sur le serveur:

public class MyHub : Hub 
{ 
    public static void SendMeData(string dataString) 
    { 
     var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
     if (context != null) 
      context.Clients.All.SendMeData(dataString); 
    } 
} 

J'ai ce code dans Startup.cs:

public partial class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     ConfigureAuth(app); 

     app.MapSignalR(new HubConfiguration 
     { 
      EnableDetailedErrors = true 
     }); 
    } 
} 

Le problème que j'ai est que lorsque le client C# appelle hubConnection.Start(). Wait(); Je reçois une exception très inutile. Voici l'exception:

StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1, Content: 
System.Net.Http.StreamContent, Headers: Transfer-Encoding: chunked 
X-SourceFiles: =?UTF-8?B?QzpcTXlEZXZcUmVhbHRpbWVNRFxSZWFsdGltZU1EUHJvdG9cUmVhbHRpbWVNRFByb3RvXHNpZ25hbHJcbmVnb3RpYXRl?= 
Cache-Control: private Date: Thu, 27 Apr 2017 04:23:18 GMT Server: Microsoft-IIS/10.0 
X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Content-Type: text/html; charset=utf-8 

Je définis des points de rupture dans le code du serveur et il n'en tape aucun.

Comment puis-je comprendre?

+0

Activez les exceptions du développeur pour afficher la trace de la pile ou activer la rupture des exceptions de première chance et déboguer le serveur. – Pawel

Répondre

0

Tout le problème a fini par être que j'avais changé le nom de ma classe de Hub dans le serveur sans changer le nom utilisé dans CreateHubProxy. il fonctionne maintenant.

0

Dans votre classe MyHub, vous avez la ligne suivante:

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
     if (context != null) 

Débarrassez-vous de cela. Au lieu de votre classe MyHub devrait être:

public class MyHub : Hub 
{ 
    public static void SendMeData(string dataString) 
    { 
     Clients.All.SendMeData(dataString); 
    } 
} 

GetHubContext est utilisé pour obtenir une référence à un Hub d'une autre classe dans le même AppDomain. Par exemple, si vous êtes dans une classe Controller et devez appeler une méthode sur un Hub au sein du même AppDomain, vous obtiendrez une référence au Hub via GetHubContext.

Toujours dans votre code client, supprimez le fichier .Wait(). Le code doit être

await hubConnection.Start(); 

Reference

+0

Les clients ne sont pas statiques. Comment accéder aux clients sans pointeur d'objet? Je dois pouvoir envoyer des données aux clients depuis un contrôleur de réunion en utilisant SendMeData. – user856232

+0

Les clients sont une propriété dynamique du concentrateur. Vous ne pouvez pas obtenir le support Intellisense, mais le code compilera. Vous pouvez le voir comme une propriété dans le code source SignalR ici: https://github.com/SignalR/SignalR/blob/2.2.0/src/Microsoft.AspNet.SignalR.Core/Hub.cs –

+0

J'ai changé mon code à ce que vous avez spécifié et obtenu l'erreur de compilation suivante: erreur CS0120: une référence d'objet est requise pour le champ non statique, la méthode ou la propriété 'Hub.Clients' – user856232