2016-06-15 40 views
5

Utilizzo di .NET Core RC2. Ha funzionato SignalR, ma sta cercando di farlo restituire le proprietà di camelCase in JSON.SignalR .NET Core camelCase JSON Contract Resolver

Per le API che sto usando ...

services.AddMvc().AddJsonOptions(o => { 
    o.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
}); 

Forse non c'è proprio nulla in luogo ancora per SignalR (dopo tutto, non dovrebbe nemmeno a lavorare ancora ...), ma chiedo se qualcuno ha capito è già uscito? Ho provato alcune cose come ...

services.AddTransient<IContractResolver, CamelCasePropertyNamesContractResolver>(); 

... ma non andare.

Chiunque ha ancora funzionato?

+2

Queste domande e risposte sono per .net 4.5/4.6, non core. – PersonThing

risposta

11

Basato su this issue dal repository SignalR Core, non esiste un modo nativo per farlo al momento, ma è possibile creare un resolver di contratto personalizzato come indicato in this comment on an old SignalR issue.

Poiché quel thread è per SignalR 2.2.0, facciamo funzionare SignalR Core.

using System; 
using System.Reflection; 
using Microsoft.AspNetCore.SignalR.Infrastructure; 
using Newtonsoft.Json.Serialization; 

    public class SignalRContractResolver : IContractResolver 
    { 
     private readonly Assembly _assembly; 
     private readonly IContractResolver _camelCaseContractResolver; 
     private readonly IContractResolver _defaultContractSerializer; 

     public SignalRContractResolver() 
     { 
      _defaultContractSerializer = new DefaultContractResolver(); 
      _camelCaseContractResolver = new CamelCasePropertyNamesContractResolver(); 
      _assembly = typeof(Connection).GetTypeInfo().Assembly; 
     } 


     public JsonContract ResolveContract(Type type) 
     { 
      if (type.GetTypeInfo().Assembly.Equals(_assembly)) 
       return _defaultContractSerializer.ResolveContract(type); 

      return _camelCaseContractResolver.ResolveContract(type); 
     } 

    } 

Quello che succede qui è che non è possibile utilizzare il contratto resolver caso di cammello per l'interno SignalR, perché si spezzerebbe la comunicazione con il cliente.

Quindi, ogni volta che risolviamo un contratto nel metodo ResolveContract, dobbiamo verificare l'assemblaggio del tipo correntemente risolto e controllare che sia interno SignalR. In caso contrario, possiamo risolvere il contratto usando il caso dei cammelli.

A questo punto, è necessario registrare questo risolutore di contratto nel framework.

public void ConfigureServices(IServiceCollection services) 
    { 
     var settings = new JsonSerializerSettings(); 
     settings.ContractResolver = new SignalRContractResolver(); 

     var serializer = JsonSerializer.Create(settings); 

     services.Add(new ServiceDescriptor(typeof(JsonSerializer), 
              provider => serializer, 
              ServiceLifetime.Transient)); 

     // register other services like SignalR, MVC and custom services 
    } 

Buona fortuna!

+0

Esattamente quello che stavo cercando e funziona alla grande. Grazie! – PersonThing

+4

Brillante, grazie. Ho ridotto la registrazione a una sola riga: 'services.AddSingleton (_ => new JsonSerializer {ContractResolver = new SignalRContractResolver()});' (e andato con un singleton). – Stajs

4

partire dalla prima versione alpha finale del nucleo signalR (1.0.0-alfa1-finale), è possibile ottenere caso cammello come il frammento di codice nativo di seguito:

services.AddSignalR(option => 
{ 
    option.JsonSerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
}); 

In effetti, si può anche impiegare qualsiasi resolver personalizzato invece di CamelCasePropertyNamesContractResolver.

+0

Grazie per l'aggiornamento, Arash. Buono a sapersi. Stavo usando SignalR per un po ', ma dopo che Azure ha abbandonato il supporto per project.json, ho implementato un semplice server websnet .net core per le mie esigenze. Potrei passare a SignalR quando viene rilasciato il segnale di rete ufficiale .net SignalR per evitare di dover mantenere un'implementazione personalizzata, ma per ora funziona bene. – PersonThing