Na podstawie this issue z repozytorium SignalR Core, nie ma natywnego sposobu robienia tego od teraz, ale można utworzyć niestandardowy resolver umowy, jak wskazano w this comment on an old SignalR issue.
Ponieważ ten wątek jest dla SignalR 2.2.0, zróbmy to dla 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);
}
}
Co się dzieje, jest to, że nie można używać zamówieniu case wielbłąd rozpoznawania nazw dla wewnętrznych SignalR, ponieważ byłoby to przerwać komunikację z klientem.
Tak więc za każdym razem, gdy rozwiązujemy umowę w metodzie ResolveContract
, musimy sprawdzić złożenie aktualnie rozpatrywanego typu i sprawdzić, czy jest to sygnał wewnętrzny SignalR. Jeśli nie, wówczas możemy rozwiązać umowę za pomocą walizki wielbłądziej.
W tym momencie musimy zarejestrować resolver umowy w ramach.
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
}
Powodzenia!
Te pytania i odpowiedzi dotyczą .net 4.5/4.6, a nie core. – PersonThing