gefunden Happily eine Abhilfe von here dank BrannonKing
Wesentlichen einen Kunden Resolver für SignalR Parameter verwendet es, die die korrekte Serializer verwendet stattdessen einen Standard zu schaffen.
Auch auf SO here verweisen aber natürlich fand nur, dass einmal begonnen hatte, meine eigene Frage zu stellen;)
hier Umbuchen für andere googeln für (die ausgezeichneten) NodaTime speziell, und einige andere Serialisierung Korrekturen zu teilen ich brauchte , wie zum Beispiel:
Newtonsoft.Json.JsonSerializationException: Self referencing loop detected for property X with type Y Path Z
Server Startup
public void Configuration(IAppBuilder app)
{
JsonSerializerSettings js = new JsonSerializerSettings();
js.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
js.DateParseHandling = DateParseHandling.None;
js.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
js.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
var serializer = JsonSerializer.Create(js);
GlobalHost.DependencyResolver.Register(typeof(JsonSerializer),() => serializer);
var resolver = new Resolver(serializer);
GlobalHost.DependencyResolver.Register(typeof(IParameterResolver),() => resolver);
}
Benutzerdefinierte Parameter Resolver
public class Resolver : DefaultParameterResolver
{
private readonly JsonSerializer _serializer;
public Resolver(JsonSerializer serializer)
{
_serializer = serializer;
}
private FieldInfo _valueField;
public override object ResolveParameter(ParameterDescriptor descriptor, Microsoft.AspNet.SignalR.Json.IJsonValue value)
{
if(value.GetType() == descriptor.ParameterType)
{
return value;
}
if(_valueField == null)
_valueField = value.GetType().GetField("_value", BindingFlags.Instance | BindingFlags.NonPublic);
var json = (string)_valueField.GetValue(value);
using(var reader = new StringReader(json))
return _serializer.Deserialize(reader, descriptor.ParameterType);
}
}
Vielen Dank Brannon!