Avrei bisogno di alcune linee guida dagli sviluppatori SignalR qual è il modo migliore per modificare la serializzazione dei parametri del metodo HUB.serializzazione parametro metodo hub SignalR
Ho iniziato la migrazione del mio progetto da WCF polling duplex (Silverlight 5 - ASP.NET 4.5) a SignalR (1.1.2). Il messaggio (contratto dati) è polimorfico basato su interfacce. (Come IMessage, MessageA: IMessage, ecc., Esiste effettivamente una gerarchia di interfacce implementate dalle classi, ma non ha molta importanza per la domanda). (So che gli oggetti polimorfici non vanno bene per i client ma il client lo gestirà come JSON e l'associazione agli oggetti viene eseguita solo sul lato server o client se .NET/Silverlight)
Sull'hub ho definito un metodo come questo :
public void SendMessage(IMessage data) { .. }
ho creato JsonConverters personalizzati e verificato i messaggi potrebbero essere serializzati/deserializzata utilizzando Json.NET. Quindi ho sostituito JsonNetSerializer in DependencyResolver con le impostazioni corrette. Allo stesso modo sul lato client Silverlight. Fin qui tutto bene.
Ma quando ho inviato il messaggio da client a server (il messaggio è stato serializzato su JSON correttamente - verificato in Fiddler), il server ha restituito l'errore che il parametro non può essere deserializzato. Con l'aiuto del debugger ho trovato un bug in SignalR (la classe JRawValue responsabile della deserializzazione del parametro crea internamente la propria istanza di JsonSerializer ignorando quella fornita). Sembrava di essere abbastanza facile soluzione sostituendo
var settings = new JsonSerializerSettings
{
MaxDepth = 20
};
var serializer = JsonSerializer.Create(settings);
return serializer.Deserialize(jsonReader, type);
con
var serializer = GlobalHost.DependencyResolver.Resolve<IJsonSerializer>();
return serializer.Parse(jsonReader, type);
ma ho anche scoperto che l'interfaccia IJsonSerializer sta per essere rimosso nella versione futura di SignalR. Quello di cui ho bisogno, in sostanza, è ottenere il JSON (o il flusso di byte) dal metodo HUB in modo da poterlo deserializzare da solo o una possibilità di modificare il serializzatore specificando convertitori, ecc.
Per ora ho finito con definendo il metodo con jobject tipo di parametro:
public void SendMessage(JObject data)
seguita da deserializzazione manuale dei dati utilizzando
JObject.ToObject<IMessage>(JsonSerializer)
metodo. Ma preferirei personalizzare il serializzatore e avere il tipo/interfaccia sul metodo hub. Qual è il "modo giusto" per farlo rispetto alla progettazione del prossimo SignalR?
Inoltre, ho trovato utile avere la possibilità di inviare al client JSON non elaborato dal mio codice, vale a dire in modo che l'oggetto non venga nuovamente serializzato di nuovo da SignalR. Come potrei ottenere questo?
Bella domanda. Triste di non vedere risposte. Sono anche interessato ad implementare contratti di messaggi polimorfici. –
Questa domanda è ancora pertinente con 2.x? Con 2.x, dovresti essere in grado di passare il 'DependencyResolver' aggiornato in' HubConfiguration' per la chiamata 'app.MapSignalR (config)' –