2013-10-20 11 views
16

Bitte beachten Sie, dass ich hier explizit auf SignalR 2.0 verweise ... Ich habe einige (bösen) Ansätze dafür mit SignalR 1.1/1.2 gesehen ... aber keine für 2.0 noch.SignalR 2.0 JSON Serializer zur Unterstützung abgeleiteter Objekte ändern

Hat jemand Erfolg mit der Änderung der SignalR 2.0 Standard JSON Serializer, um das Senden von abgeleiteten Typen zu ermöglichen? Basierend auf dem, was ich über SignalR 2.0 gelesen habe, sollte dies möglich sein, aber ich habe kein Glück und habe nirgends ein vollständiges Beispiel gefunden.

Hier ist, wie ich begann ... jede Hilfe wäre willkommen.

Mein Startup.cs

[assembly: OwinStartup(typeof(SignalRChat.Startup))] 
    namespace SignalRChat 
    { 

     public class Startup 
     { 
      public void Configuration(IAppBuilder app) 
      { 
       // this should allow the json serializer to maintain the object structures 
       var serializer = new JsonSerializer() 
       { 
        PreserveReferencesHandling = PreserveReferencesHandling.Objects, 
        TypeNameHandling = TypeNameHandling.Objects, 
        TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple 
       }; 

       // register it so that signalr can pick it up 
       GlobalHost.DependencyResolver.Register(typeof(JsonSerializer),() => serializer); 

       app.MapSignalR(); 
      } 
     } 
    } 

Methode auf dem Hub-

public void AddStock(Stock stock) 
    { 
     string stockType = stock.GetType().ToString(); 
     Console.WriteLine("The type of stock we got was: " + stockType); 
    } 

Meine Konsole Test-App (dies veröffentlicht auf der Nabe)

myDataHub.Invoke("AddStock", new NyseStock() 
    { 
     Company = "Microsoft", 
     NyseSymbol = "MSFT" 
    }); 

    myDataHub.Invoke("AddStock", new DaxStock() 
    { 
     Company = "Microsoft", 
     DaxSymbol = "DMSFT" 
    }); 

nur für eine gute Maßnahme Aktie. cs

namespace Messages 
    { 
     public class Stock 
     { 
      public string Company 
      { 
       get; 
       set; 
      } 
      public decimal Price 
      { 
       get; 
       set; 
      } 
     } 

     public class NyseStock : Stock 
     { 
      public string NyseSymbol 
      { 
       get; 
       set; 
      } 
     } 

     public class DaxStock : Stock 
     { 
      public string DaxSymbol 
      { 
       get; 
       set; 
      } 
     } 
    } 

Meine erste Neigung war, dass ich es versäumte, den Serializer im Client einzurichten. So habe ich die folgenden nach der Erstellung der Verbindung, aber vor der Schaffung der Nabe Proxy.

myConnection = new HubConnection("http://localhost:64041/"); 
    // Update the serializer to use our custom one 
    myConnection.JsonSerializer = new JsonSerializer() 
    { 
     PreserveReferencesHandling = PreserveReferencesHandling.Objects, 
     TypeNameHandling = TypeNameHandling.Objects, 
     TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple 
    }; 

    //Make proxy to hub based on hub name on server 
    myDataHub = myConnection.CreateHubProxy("DataHub"); 

Dies ist jedoch nur führte zu einer InvalidOperationException (Daten können nicht gesendet werden, weil die Verbindung im ausgeschalteten Zustand ist Call Start vor dem Senden von Daten.) während der myDataHub.Invoke (..) Aufrufe.

+2

Haben Sie das jemals herausgefunden? Ich stoße auf dasselbe Problem. – chad

+0

Das gleiche Problem hier ... –

Antwort

5

Es ist eine Weile her, seit diese Frage gestellt wurde. Als zukünftige Referenz muss die myConnection.Start() Methode nach dem Erstellen des Proxys aufgerufen werden, so wie dieser

+0

Ich bin nicht die Antwort die echte Frage, die ist "Wie man dies auf dem Server einrichten?". Es löst nur das kleine Problem, das am Ende der Frage erwähnt wird, wenn Autor erwähnt, was er bereits versuchte. –