2016-10-12 2 views
3

Я довольно новыми для SignalR поэтому я буду стараться быть ясно, как possible.Here то, что я пытаюсь выполнить:SignalR: Использование сообщений базового типа между клиентом и ступицей

1.Create self-hosted web application using SignalR 
2.Create WPF rich client which will communicate with above-mentioned server app. 
3.Use strongly typed request/response messages which inherit from base types respectively to pass data from client to server and vice-versa. 

Здесь некоторые определения моих сообщений запроса/ответа:

//Base request message 
public class HubRequestMessageBase 
{ 

} 

//Base response message 
public class HubResponseMessageBase 
{ 
    public bool Success { get; set; } 
    public Exception Error { get; set; } 
} 

//Request message to query node by name 
public class QueryNodeRequest : HubRequestMessageBase 
{ 
    public string Name { get; set; } 
    public Guid Identifier { get; set; } 
} 

//Response message carrying metadata for the specified node 
public class QueryNodeResponse : HubResponseMessageBase 
{ 
    public NodeMetadata NodeMetadata { get; set; } 
} 

Теперь, если я определяю на мои методы сервера следующим образом:

//Main method for handling client requests 
public void HandleClientRequest(HubRequestMessageBase message) 
{ 
    //Omitted for brevity 
} 

и вызов метода сервера от клиента, как это:

internal async void QueryNode(string name) 
{ 
    QueryNodeRequest req = new QueryNodeRequest(); 
    req.Name = name; 

    await HubProxy.Invoke("HandleClientRequest", new object[] { req }); 
} 

на стороне сервера, я все еще получаю HubRequestMessageBase как тип сообщения параметр внутри HandleClientRequest метод вместо QueryNodeRequest .Теперь, после того, как некоторые я понял, что SignalR по умолчанию не обрабатывает полиморфизм (или сообщение не получает сериализованного/десериализованного должным образом, к типу, который я ожидал бы - в этом случае QueryNodeRequest, который наследует от HubRequestMessageBase).

Мой вопрос: есть ли возможность этого добиться, используя настройки JsonSerializer как на клиенте, так и на сервере? Обратите внимание, что я уже пробовал следующий код (а также некоторые варианты) без какого-либо успеха (на сервере):

GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), 
               () => JsonSerializer.Create(new JsonSerializerSettings 
               { 
                TypeNameHandling = TypeNameHandling.All 
               })); 

Заранее спасибо!

Приветствия, CIVA

ответ

0

Вы бы осуществить IParameterResolver и зарегистрировать его. По умолчанию parameter resolver просто преобразует JValues в целевые типы параметров.

+0

Здравствуйте, Павел, большое спасибо за ответ, я попробую это и дам вам знать как можно скорее. – Civa

+0

К сожалению, этот метод не разрешил мою проблему, так как IJsonValue уже содержит интересующий тип данных. Я ожидаю: '{" $ type ":" Zenith.Network.Api.Messages.QueryNodeRequest, Zenith.Network.Api ", \t ... <Остальная часть JSON опущена для краткости>}}, и я просто не смог преобразовать ее обратно в HubRequestMessageBase (как значение в ParameterType). Я закончил писать отдельные методы для каждого типа запроса и работает как ожидалось. Однако , Я буду отмечать ваш ответ как принятый, так как это один из способов борьбы с полиморфными типами сообщений, и, возможно, кто-то найдет его полезным. – Civa