2016-04-24 3 views
3

У меня есть сервер WebAPI, у которого есть концентратор, который отвечает на запросы Подписки, публикуя объект Dictionary<long, List<SpecialParam>>.Объект Deserialize, переданный как абстрактный класс SignalR

Список SpecialParam содержит элементы типа SpecialParamASpecialParamB & которые оба наследуемых SpecialParam.

Когда я пытаюсь захватить публиковать на клиенте:

hubProxy.On<Dictionary<long, List<SpecialParam>>>(hubMethod, res => 
{ 
    DoStuff(); 
}); 

Метод DoStuff() не называется. Если я изменил возвращаемое значение публикации на string и изменил прокси-сервер для получения значения string, вызывается метод DoStuff(). Поэтому проблема заключается в десериализации предмета SpecialParam.

Я попытался настройки на стороне сервера:

var serializer = JsonSerializer.Create(); 
serializer.TypeNameHandling = TypeNameHandling.All; 
var hubConfig = new HubConfiguration(); 
hubConfig.Resolver.Register(typeof(JsonSerializer),() => serializer); 
GlobalHost.DependencyResolver.Register(typeof(JsonSerializer),() => serializer); 

Но это не помогло.

Я также попытался добавить к клиенту:

HubConnection hubConnection = new HubConnection(hubPath); 
hubConnection.JsonSerializer.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto; 
hubProxy = hubConnection.CreateHubProxy(hubName); 
hubProxy.JsonSerializer.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto; 

И это тоже не помогло.

В других решениях я обнаружил, что люди определили новый IParameterResolver, но он вызывается только тогда, когда сервер получает вход для метода хаба, а не когда выход публикуется из концентратора.

Пожалуйста, помогите!

UPDATE

Вот что я поймал с Фидлер:

{"$type":"Microsoft.AspNet.SignalR.Hubs.HubResponse, Microsoft.AspNet.SignalR.Core","I":"0"} 

Это то, что сервер отвечает клиенту.

UPDATE 2

Я все еще пытаюсь выяснить, как получить это уже десериализации в Dictionary<long, List<SpecialParam>>.

ответ

1

Я решил его, установив в службе:

public static void ConfigureApp(IAppBuilder appBuilder) 
{ 
    ... 
    var service = (JsonSerializer)GlobalHost.DependencyResolver.GetService(typeof(Newtonsoft.Json.JsonSerializer)); 
    service.TypeNameHandling = TypeNameHandling.All; 
    ... 
} 

и удаление ожидаемого типа в клиенте:

hubProxy.On(hubMethod, res => 
{ 
    DoStuff(); 
}); 

я получаю ответ в виде JSON, и я десериализацией его:

var serializer = new JsonSerializer(); 
serializer.TypeNameHandling = TypeNameHandling.All; 
JObject jObject = resp as JObject; 
var specialParams = jObject.ToObject<Dictionary<long, List<SpecialParam>>>(serializer); 

Я до сих пор не знаю, как заставить моего клиента получить его уже десериализованным.

Смежные вопросы