c# - 在不中断更改的情况下在 SignalR 方法中添加额外参数

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

我想通过 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/

相关文章:

c# - 使用 Entity Framework 绑定(bind)自定义属性

asp.net - Kestrel HTTPS POST 在生产时导致 400 错误请求状态代码 (ASP.NET Core 2.x)

c# - 使用 MVC4 向特定客户端发送 SignalR 推送通知

asp.net-mvc - Asp.Net MVC 信号 R 聊天消息保存在文档数据库或 Azure 表中

c# - 在虚拟主机上存储密码或私钥的最佳方式是什么?

c# - .NET 互操作是来回复制数组数据,还是固定数组?

c# - Entity Framework 4.3.1 -> 5.0 异常 : "EntityType has no key defined. Define the key for this EntityType."

c# - 具有动态端点映射的最小 Api 通用 CRUD

authentication - 如何将 Azure OpenIdConnect OWIN 中间件 Cookie 身份验证转换为 JavaScript JWT 以用于 SPA 应用程序?

asp.net - 错误: SignalRRouteExtension.Mapconnection is obsolete. use MapSignalR in Owin Startup class