【问题标题】:Add extra parameter in SignalR method without breaking changes在 SignalR 方法中添加额外参数而不破坏更改
【发布时间】:2019-03-23 03:53:50
【问题描述】:

我想通过 Signalr 传递额外的参数而不做任何重大更改。

正在使用的 SignalR 集线器 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.
    });

请告诉我如何解决此问题。 对我来说最重要的是,我的最终用户无论是否更新了客户端代码都应该可以正常工作。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 嗨@Andrew,如果我们从头开始我们的项目,你的建议是最好的,但我被困在目前的情况下。我还在 Git github.com/aspnet/SignalR/issues/3157 上发布了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2015-11-17
    • 1970-01-01
    相关资源
    最近更新 更多