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

Nar*_*gir 5 c# signalr asp.net-core asp.net-core-signalr

我想通过 Signalr 传递附加参数而不进行任何重大更改。

正在使用的 SignalR 集线器 web api 端信号器 nuget 包是“Microsoft.AspNetCore.SignalR”版本=“1.0.3”。正在使用的客户端 nuget 包是 "Microsoft.AspNetCore.SignalR.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;
}
Run Code Online (Sandbox Code Playgroud)

客户端的初始代码-

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

当他想要更新 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;
}
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

SendResponse2 方法在客户端的更改 -

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

请让我知道我该如何解决这个问题。对我来说最重要的事情是我的最终用户无论是否更新了客户端代码都应该可以正常工作。

And*_*rse 4

不幸的是,您现在无法安全地添加参数。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)
{
}
Run Code Online (Sandbox Code Playgroud)

然后,当您需要添加参数时,您可以向此类添加属性 ( Param4)。如果较旧的客户端出现并调用该方法而不提供Param4,则该值将简单地保留为默认值(即null对于引用类型,0对于 ,int等等)。