Фон
У меня есть три класса:
- "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();
}
}
}