我想通过 Signalr 传递额外的参数而不进行任何重大更改。
正在使用的 SignalR hub web api 端信号器 nuget 包是“Microsoft.AspNetCore.SignalR”版本 =“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.
});
请告诉我如何解决这个问题。 对我来说最重要的是,无论我的最终用户是否更新了客户端代码,他们都应该能够正常工作。
最佳答案
很遗憾,您现在无法安全地添加参数。 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
等)。
关于c# - 在不中断更改的情况下在 SignalR 方法中添加额外参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52872318/