Измените ReferenceLoopHandling в signalR

Я работаю над проектом, в котором у нас есть два приложения; Первое — это консольное приложение, которое заполняет базу данных, а второе — собственная служба signalR, которая транслирует любые изменения, происходящие в содержимом базы данных.

Консольное приложение отправляет измененную модель, а служба публикует ее всем заинтересованным сторонам. Но есть проблема, когда модель имеет циклические зависимости. Я пытался сделать что-то вроде этого:

var config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling =          ReferenceLoopHandling.Ignore;

но, похоже, это ничего не меняет; Он по-прежнему выдает исключение Обнаружен цикл самоссылки для свойства

Есть ли простой способ установить ReferenceLoopHandling глобально и заставить его влиять на любую модель, с которой работает преобразователь?


person ppoliani    schedule 12.07.2013    source источник
comment
Это настройка WebApi и не имеет ничего общего с SignalR.   -  person davidfowl    schedule 13.07.2013


Ответы (1)


С SignalR 2 вы можете использовать DepandyResolver для замены сериализатора Json.Net. Чтобы решить проблемы с эталонным циклом в моем приложении, я использовал следующее:

  protected void Application_Start()
  {
     var serializerSettings = new JsonSerializerSettings();
     serializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
     serializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;

     var serializer = JsonSerializer.Create(serializerSettings);
     GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), () => serializer); 
  }

Если вы используете hubProxy на клиенте, потребуются аналогичные настройки:

hubProxy.JsonSerializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
hubProxy.JsonSerializer.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
person mbursill    schedule 29.11.2013