在SignalR方法中添加额外的参数而不破坏更改

时间:2018-10-18 10:47:57

标签: c# asp.net-core signalr asp.net-core-signalr

我想通过Signalr传递其他参数,而无需进行任何重大更改。

正在使用的SignalalR集线器Web api侧信号器nuget包是“ Microsoft.AspNetCore.SignalR” Version =“ 1.0.3”。 正在使用的客户端nuget程序包是“ Microsoft.AspNetCore.SignalR.Client” Version =“ 1.0.3” />

下面给出了Signalr Hub 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;
}

客户端的初始代码-

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是使用这些代码更改更新的中心Web 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 :(得分:2)

很遗憾,您现在不能安全地添加参数。 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的情况下调用方法 ,则该值将保留为默认值(即对于引用类型{{1 }} null等。