MohamedHassanAli Ответов: 1

Вызов концентратора signalr с типом, имеющим производные типы


Привет,

Я сталкиваюсь с проблемой, когда пытаюсь вызвать метод на сервере SignalR из клиента SignalR.

Фон:

Hub.Invoke("MethodToBeCalled", MessageType).Wait();


Тип сообщения определяется следующим образом

public class MessageType
{
  primitive type prop1;
  primitive type prop2;
  List<BaseAction> Actions {get;set;}
}


BaseAction - это базовый класс для двух производных типов: RunningAction и RowingAction.

Вопрос:
Когда я передаю CLR-объект MessageType в концентратор.Вызовите всю информацию о типе, которая теряется, когда они достигают SignalRHub, поэтому в принципе я не могу отличить RunningAction от RowingAction, потому что сериализация JSON просто рассматривает их все как BaseAction(BaseType).

Может ли кто-нибудь подсказать, есть ли способ обойти эту проблему?

Заранее спасибо:)

Что я уже пробовал:

Я уже пробовал
Hub.JsonSerializer.TypeNameHandling = TypeNameHandling.All;
на клиенте перед началом соединения. Но когда я делаю это, он всегда терпит неудачу с сервером 503.

Никаких изменений при попытке сделать то же самое на стороне сервера SignalR(OWIN) :
var myHubJsonSetting = new JsonSerializerSettings()
        {
	TypeNameHandling = TypeNameHandling.All
	};

var serializer = JsonSerializer.Create(myHubJsonSetting);

_signalR = 
WebApp.Start(
 GetStartupOptions(),
 builder =>
 {
   builder.UseCors(CorsOptions.AllowAll);
   GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), () => serializer);
   builder.MapSignalR(
		serviceName,
		new HubConfiguration
		{
		  EnableJSONP = false,
		  EnableDetailedErrors = _detailedErrors,
		  EnableJavaScriptProxies = true
		});
   builder.RunSignalR();					
  });

1 Ответов

Рейтинг:
2

Graeme_Grant

Action это указатель на метод. Вот почему это не сработает. Вам нужно сказать сериализатору, чтобы он игнорировал его.

Если вы используете JSON lib Newtonsoft, то пометьте этот метод JsonIgnore атрибут.

Если вы используете JSON-сериализатор Microsoft, то пометьте этот метод с помощью Microsoft Ignore атрибут.


MohamedHassanAli

Ой. Извините мой плохой. Это не действие, как в C# Action. Я обновил вопрос. Спасибо :)

Graeme_Grant

То, что вы просите можно с Newtonsoft же с помощью пользовательских JsonConverter