2013-10-20 5 views
16

Si noti che sto facendo riferimento esplicito a SignalR 2.0 qui ... Ho visto alcuni (cattivi) approcci per questo con SignalR 1.1/1.2 ... ma nessuno per 2.0 ancora.SignalR 2.0 cambia Json Serializer per supportare gli oggetti di tipo derivato

Qualcuno ha avuto successo con il cambiamento del SignalR serializzatore JSON 2.0 di default per consentire l'invio di tipi derivati? Basandomi su ciò che ho letto su SignalR 2.0, ciò dovrebbe essere possibile, tuttavia, non sto avendo fortuna e non ho trovato un esempio completo da nessuna parte.

Ecco come ho iniziato ... qualsiasi aiuto sarebbe apprezzato.

mio 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(); 
      } 
     } 
    } 

metodo sul

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

La mia prova console App Hub (questa pubblica al mozzo)

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

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

Solo per buona misura di Fotografici. 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; 
      } 
     } 
    } 

La mia prima inclinazione è stata che ho trascurato di configurare il serializzatore nel client. Così ho aggiunto il seguente dopo la creazione della connessione, ma prima della creazione del proxy hub:.

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"); 

Questo però solo ha determinato un InvalidOperationException (dati non possono essere inviati perché la connessione è nello stato disconnesso Chiama inizio prima di inviare qualsiasi dato.) durante le chiamate myDataHub.Invoke (..).

+2

Lo hai mai capito? Sto incontrando lo stesso problema. – chad

+0

Lo stesso problema qui ... –

risposta

5

È passato un po 'di tempo da quando è stata posta questa domanda. Per riferimento futuro, il metodo myConnection.Start() deve essere chiamato dopo aver creato il proxy, come questo

myConnection = new HubConnection(endpoint); 

proxy = _conn.CreateHubProxy("DataHub"); 
proxy.On<string>("ServerEvent", ClientHandler); 

myConnection.Start(); 

proxy.Invoke("hubMethod", ...); 
+0

Non rispondo alla vera domanda che è "Come configurare questo sul server?". Risolve solo il piccolo problema menzionato alla fine della domanda, quando l'autore menziona ciò che ha già provato. –

Problemi correlati