如何通过 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)
{
...
}
}
我正在开发一个 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)
{
...
}
}