代码之家  ›  专栏  ›  技术社区  ›  Narendra Jangir

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

  •  3
  • Narendra Jangir  · 技术社区  · 7 年前

    正在使用的SignalR hub web api side SignalR nuget包是“Microsoft.AspNetCore.SignalR“版本=“1.0.3”。 正在使用的客户端nuget包是“Microsoft.AspNetCore.SignalR.Client“Version=”1.0.3“/>gt;

    SignalerHubWebAPI端的初始代码如下所示-

    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包和它的on-application所有者共享。

    为了满足这一要求,我在信号机集线器侧做了如下代码更改-

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

    Exception thrown: 'System.IO.InvalidDataException' in Microsoft.AspNetCore.SignalR.Protocols.Json.dll
    Invocation provides 7 argument(s) but target expects 0.
    

    客户端response2方法的更改-

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

    请告诉我如何解决这个问题。 对我来说最重要的一点是,如果我的最终用户更新了客户端代码,他们应该可以正常工作。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Andrew Stanton-Nurse    7 年前

    不幸的是,现在不能安全地添加参数。signal不支持完整的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 ). 如果一个老客户机出现并调用该方法 没有 提供 ,则该值将保留为默认值(即。 null 0 为了一个 int 等等)。