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