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 (..).
Lo hai mai capito? Sto incontrando lo stesso problema. – chad
Lo stesso problema qui ... –