C# 在不中断更改的情况下,在信号器方法中添加额外参数

C# 在不中断更改的情况下,在信号器方法中添加额外参数,c#,asp.net-core,signalr,asp.net-core-signalr,C#,Asp.net Core,Signalr,Asp.net Core Signalr,我想通过信号器传递附加参数,而不需要任何中断更改 正在使用的SignalR hub web api side SignalR nuget包是“Microsoft.AspNetCore.SignalR”Version=“1.0.3”。 正在使用的客户端nuget包是“Microsoft.AspNetCore.signar.Client”Version=“1.0.3”/> 信号集线器web api端的初始代码如下所示- public async Task<bool> SendRespon

我想通过信号器传递附加参数,而不需要任何中断更改

正在使用的SignalR hub web api side SignalR nuget包是“Microsoft.AspNetCore.SignalR”Version=“1.0.3”。 正在使用的客户端nuget包是“Microsoft.AspNetCore.signar.Client”Version=“1.0.3”/>

信号集线器web 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;
}
SendResponse2方法客户端的更改-

Connection.On<string, string, string, string, string, string, string>("SendResponse2",
    async (param1, param2, param3, param4, param5, param6, param7) =>
    {
        //code here.
    });
Connection.On(“SendResponse2”,
异步(参数1、参数2、参数3、参数4、参数5、参数6、参数7)=>
{
//代码在这里。
});
请让我知道如何解决此问题。
对我来说,最重要的是,如果最终用户是否更新了客户端代码,他们应该可以正常工作。

不幸的是,您现在无法安全地添加参数。signar不支持完整的C#调用语义集。例如,我们不支持重载或默认参数。如果这是你感兴趣的东西,请随时提交一个问题

使此类方法可扩展的一个好方法是采用单个参数对象,而不是多个参数:

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
,等等)。

Hi@Andrew,如果我们从一开始就开始我们的项目,您的建议是最好的,但我陷入了当前的困境。我也在Git上发布了这个问题。
Exception thrown: 'System.IO.InvalidDataException' in Microsoft.AspNetCore.SignalR.Protocols.Json.dll
Invocation provides 7 argument(s) but target expects 0.
Connection.On<string, string, string, string, string, string, string>("SendResponse2",
    async (param1, param2, param3, param4, param5, param6, param7) =>
    {
        //code here.
    });
public class MyParams
{
     public string Param1 { get; set; }
     public int Param2 { get; set; }
     public double Param3 { get; set; }
}

public void MyHubMethod(MyParams p)
{
}