在 SignalR 方法中添加额外的参数,而不进行中断性更改



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

正在使用的 SignalR hub Web API 端 Signalr nuget 包是"Microsoft.AspNetCore.SignalR" Version="1.0.3"。 正在使用的客户端 nuget 包是"Microsoft.AspNetCore.SignalR.Client" 版本="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;
}

客户端的初始代码-

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.
});

请让我知道如何解决此问题。 对我来说最重要的是,我的最终用户是否更新了客户端代码,他们应该可以正常工作。

很遗憾,您现在无法安全地添加参数。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等(。

最新更新