SignalR не получает абстрактный тип - PullRequest
0 голосов
/ 02 февраля 2019

Фон

У меня есть три класса:

  • "A" абстрактный базовый класс
  • "B" класс затем расширяет "A"
  • «C» другой класс, который расширяет «A»

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

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

Сервер

using Microsoft.AspNetCore.SignalR;
using SignlR.Shared;
using System.Threading.Tasks;

namespace SignlR.Experiments.Hubs
{
    public class PolyHub : Hub
    {
        // Empty
    }

    public class PolyService
    {
        private readonly IHubContext<PolyHub> _hubContext;

        public PolyService(IHubContext<PolyHub> hubContext)
        {
            _hubContext = hubContext;
            Task.Run(Job);
        }

        private async Task Job()
        {
            A example = null;
            while (true)
            {
                example = new B();
                await _hubContext.Clients.All.SendAsync("Example", example);
                await Task.Delay(250);
                example = new C();
                await _hubContext.Clients.All.SendAsync("Example", example);
            }
        }
    }
}

Клиент

using Microsoft.AspNetCore.SignalR.Client;
using SignlR.Shared;
using System;
using System.Threading.Tasks;

namespace SignlR.Consoles
{
    class Program
    {
        static void Main(string[] args)
        {
            var connection = new HubConnectionBuilder()
                .WithUrl("https://localhost:44384/poly")
                .Build();

            connection.StartAsync().Wait();

            connection.On<A>("Example", (obj) =>
            {
                Console.WriteLine("Event" + obj.GetType().FullName);
            });

            Task.Run(async () =>
            {
                while (true)
                {
                    await Task.Delay(2000);
                    Console.WriteLine(connection.State.ToString());
                }
            });

            Console.ReadKey();
        }
    }
}
...