如何通过 SignalR 将 javascript 对象从一个客户端发送到另一个客户端

how to send a javascript Object from one Client to Another by SignalR

我正在开发一个 Javascript 多人游戏,我需要使用 signalR 从一个客户端向另一个客户端发送一个 Javascript 对象。到目前为止,我正在通过字符串或数组向客户端发送客户端数据。
但是我不知道如何在服务器中接收 Javascript 对象以将该对象发送给另一个客户端。

var MyInfo = {
    UserName: loginUserName,
    userid: logInUserId,
    getinfo: function() {
        return this.UserName + ' ' + this.userid;
    }
}

我应该使用哪种数据类型来接收我的集线器中的 Javascript 数据。
我正在研究 C# .NET MVC。

我认为最简单的方法是在服务器端创建一个包含与 JS 模型相同属性的 MyInfoModel,然后简单地将其传递给服务器方法。

通常,SignalR 和 ASP.NET 应该处理数据的序列化,让您发送和接收复杂的对象。 (请注意,我还没有测试它,这只是一个有根据的猜测)。由于您可以轻松地将复杂的对象从服务器发送到客户端,我认为您没有理由不能将它们从客户端发送到服务器。

如果第一种方法(在服务器上创建模型并使服务器方法接受模型)不起作用,您可以序列化对象,将其作为字符串发送并在集线器上反序列化(您仍然需要模型反序列化)。

如果这些都不起作用,请留言,等我拿到装有 VS 的电脑时,我会测试它们并分享结果。

希望对您有所帮助!祝你好运!

我得到了问题的答案...
C# 语言提供 Javascript 对象到对象数据类型的自动转换。因此,我将 Javascript 对象发送到服务器,然后以 Object 数据类型接收该对象。之后我将该对象发送到目标客户端,如下所示:

var MyInfo = {
    UserName: loginUserName,
    userid: logInUserId,
    getinfo: function() {
        return this.UserName + ' ' + this.userid;
    }
};

var MyInfo2 = {
    UserName: "",
    userid: "",
    getinfo: function() {
        return this.UserName + ' ' + this.userid;
    }
};

var chessR = $.connection.gameHub;
var myConnectionID;
chessR.client.testObject = function(temp) {
    MyInfo2.UserName = temp.UserName;
    MyInfo2.userid = temp.userid;
    alert(MyInfo2.getinfo());
}
$.connection.hub.start().done(function() {
    chessR.server.testObject(MyInfo);
});

我在 signalR 集线器上写道:

public class GameHub : Hub
{
    public void testObject(Object MyInfo)
    {
        Clients.Caller.testObject(MyInfo);
    }
}

现在问题解决了。

您的解决方案适用于在 JS 客户端之间发送对象,但如果您想在 C# 基础服务器上使用该对象或进行一些输入(通常是理想的),那么您可以创建一个与 JS 匹配的 C# 模型对象。

并且根据您使用的信号器 Json 序列化大小写选项,您可以使用属性来指定 C# 对象应该如何 de/serialized:

using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;

    public class MyInfoModel
    {
        [Required]
        [JsonPropertyName("userId")]
        public string UserId { get; set; }

        [Required]
        [JsonPropertyName("userName")]
        public string UserName { get; set; }
    }

JS 客户端(打字稿)

type UserInfo = {
  userName: string;
  userId: string;
};

const myInfo: UserInfo = {
  userName: loginUserName,
  userId: logInUserId,
};

await $.hubConnection.send("HubMethodWithTypedParam", myInfo);

现在可以使用类型化参数声明 hub 方法,如下所示:

public class GameHub : Hub
{
    public void HubMethodWithTypedParam(MyInfoModel myInfo)
    {
        ...
    }
}