Добавить дополнительный параметр в методе SignalR без внесения изменений - PullRequest
0 голосов
/ 18 октября 2018

Я хочу передать дополнительный параметр через Signalr без каких-либо критических изменений.

Используемый пакет nuget сигнализатора стороны веб-интерфейса концентратора SignalR - "Microsoft.AspNetCore.SignalR" Version = "1.0.3".Используемый клиентский пакет nuget: "Microsoft.AspNetCore.SignalR.Client" Version = "1.0.3" />

Исходный код на стороне веб-API-концентратора-сигнализатора приведен ниже -

public async Task<bool> SendResponse(string uniqueId, string param1, string param2, string param3, string param4, string param5, string param6)
{
    await HubContext.Clients.Group(uniqueId).SendAsync("SendResponse", param1, param2, param3, param4, param5,param6);
    return true;
}

Исходный код на стороне клиента -

Connection.On<string, string, string, string, string, string>("SendResponse",
async (param1, param2, param3, param4, param5, param6) =>
{
    //code here.
});

Этот код на стороне клиента передается всем через пакет nuget и его владельцу приложения, когда он хочет обновить пакет nuget.

Дотеперь все работает нормально, изменилось требование (передайте новый параметр с ответом).

Чтобы выполнить это требование, я сделал ниже приведенные изменения кода на стороне концентратора-сигнализатора -

public async Task<bool> SendResponse(string uniqueId, string param1, string param2, string param3, string param4, string param5, string param6, string param7)
{
    //send 6 parameters in old method so that client code can continue his work without updating client side code changes.
    await HubContext.Clients.Group(uniqueId).SendAsync("SendResponse", param1, param2, param3, param4, param5, param6);
    //Send 7 parameters in new method.
    await HubContext.Clients.Group(uniqueId).SendAsync("SendResponse2", param1, param2, param3, param4, param5, param6, param7);    
    return true;
}

SignalRЭто сервис веб-API-концентратор обновлен с этими изменениями кода и после этого возникают проблемы.Клиентские приложения со старым клиентским кодом SignalR начинают получать ошибки -

Exception thrown: 'System.IO.InvalidDataException' in Microsoft.AspNetCore.SignalR.Protocols.Json.dll
Invocation provides 7 argument(s) but target expects 0.

Изменения на стороне клиента для метода SendResponse2 -

Connection.On<string, string, string, string, string, string, string>("SendResponse2",
    async (param1, param2, param3, param4, param5, param6, param7) =>
    {
        //code here.
    });

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

1 Ответ

0 голосов
/ 18 октября 2018

К сожалению, вы не можете безопасно добавить параметр прямо сейчас.SignalR не поддерживает полный набор семантики вызовов C #.Например, мы не поддерживаем перегрузки или параметры по умолчанию.Если это то, что вас заинтересует, пожалуйста, не стесняйтесь подавать проблему на https://github.com/aspnet/SignalR/issues!

Хороший способ сделать такие методы расширяемыми - это взять объект с одним параметром вместонесколько параметров:

public class MyParams
{
     public string Param1 { get; set; }
     public int Param2 { get; set; }
     public double Param3 { get; set; }
}

public void MyHubMethod(MyParams p)
{
}

Затем, когда вам нужно добавить параметр, вы можете добавить свойство к этому классу (Param4).Если приходит более старый клиент и вызывает метод без , обеспечивающий Param4, то это значение просто останется по умолчанию (т. Е. null для ссылочного типа, 0 для intи т. д.).

...