Я не могу найти никакого ресурса, который сказал бы, что я не могу этого сделать.

У меня есть все настройки концентратора / клиента и протестированы, когда параметр является десятичным, но как только я использую общий класс, сервер не реагирует.

SignalRMessage:

public class SignalRMessage<T>
{
    public SignalRMessage(T value, string text)
    {
        Value = value;
        Text = text ?? string.Empty;
    }
    public T Value { get; set; }
    public string Text { get; set; }
}

Хаб (OnConnected получает хит):

 public class JobHeaderHub : Hub
{
    public override Task OnConnectedAsync()
    {
        Debug.WriteLine(Clients.Caller);
        return base.OnConnectedAsync();
    }

    public async Task JobHeaderUpdated(SignalRMessage<decimal> message)
    {
        await Clients.Others.SendAsync("ReceiveJobHeaderUpdated", message);
    }

    public async Task JobHeaderCreated(SignalRMessage<decimal> message)
    {
        await Clients.Others.SendAsync("ReceiveJobHeaderCreated", message);
    }
}

Клиент:

 public class JobHeaderSingalRClient
{
    private HubConnection connection;

    public JobHeaderSingalRClient()
    {
        //  connection = new HubConnectionBuilder().WithUrl(@"").WithAutomaticReconnect().Build();
        connection = new HubConnectionBuilder().WithUrl(@"http://localhost:5000/jobheader").WithAutomaticReconnect().Build();

        connection.On<SignalRMessage<decimal>>("ReceiveJobHeaderUpdated", message => JobHeaderUpdated?.Invoke(message));
        connection.On<SignalRMessage<decimal>>("ReceiveJobHeaderCreated", message => JobHeaderCreated?.Invoke(message));
    }

    public static async Task<JobHeaderSingalRClient> CreateConnectedClient()
    {
        var client = new JobHeaderSingalRClient();
        await client.ConnectAsync();
        return client;
    }

    public async Task<JobHeaderSingalRClient> ConnectAsync()
    {
        await connection.StartAsync();

        return this;
    }

    public event Action<SignalRMessage<decimal>> JobHeaderUpdated;

    public async Task SendJobHeaderUpdated(decimal id, string message = null)
    {
        await connection.SendAsync("JobHeaderUpdated", new SignalRMessage<decimal>(id, message));
    }

    public event Action<SignalRMessage<decimal>> JobHeaderCreated;

    public async Task SendJobHeaderCreated(decimal id, string message = null)
    {
        await connection.SendAsync("JobHeaderCreated", new SignalRMessage<decimal>(id, message));
    }
}

Я понятия не имею, почему, когда параметр равен SignalRMessage<decimal>, методы на сервере не обрабатываются. Кто-нибудь знает? Спасибо.

1
Tomáš Filip 16 Фев 2021 в 15:17

2 ответа

Лучший ответ

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

1
Michael Mairegger 16 Фев 2021 в 12:23

Скорее всего, это связано не с signalR, а с базовой сериализацией JSON. Тип необходимо указать, чтобы можно было сериализовать объекты.

У меня были аналогичные проблемы при использовании объектов типа object в качестве параметров.

Для устранения неполадок включите verbose error messages в signalR и посмотрите, не регистрируются ли какие-либо ошибки.

services.AddSignalR(options => 
    {
        options.Hubs.EnableDetailedErrors = true;
    });
0
NoConnection 16 Фев 2021 в 12:29
66224177