.net core MVC web app 集成客户端-服务器通信的实践
Practices in integrating client-server communication with .net core MVC web app
我一直在使用 knockout.js 处理客户端-服务器通信,但现在想知道我的方法是否正确,以及它在其他框架(如 Angular2 或 React)集成到 MVC web 时如何工作应用程序。
假设我们有一个游戏模型
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public double SkillRating { get; set; }
public List<Attendance> GameAttendanceHistory { get; set; }
public DateTime MemberSince { get; set; }
}
但是当我们要做一个聊天系统的时候,有些属性对于view来说并不是必须的,所以用户的viewmodel应该是这样的
public class UserViewModel
{
public UserViewModel(User user)
{
Id = user.Id;
Name = user.Name;
}
//For guest users
public UserViewModel()
{
Id = 0;
Name = "Guest";
}
public int Id { get; set; }
public string Name { get; set; }
}
还有一些 UI 型号
//One chat channel. Users can open several channels at once.
public class BoardViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public string MessageToPost { get; set; }
public virtual List<User> Users { get; set; }
public virtual List<Post> Posts { get; set; }
}
//Message to be posted to each channel. Messages will be stored in SQL database.
public class Post
{
[Key]
public int Id { get; set; }
public string Message { get; set; }
public DateTime DatePosted { get; set; }
public int PostById { get; set; }
public string PostByName { get; set; }
}
最后,控制器传递一个视图模型
public class ChatUIViewModel
{
public UserViewModel CurrentUser { get; set; }
//List of all boards to which the user belonging
public List<BoardViewModel> Boards { get; set; }
}
到视图,我让 knockout.mapping 解析数据的 json 以创建要使用的视图模型。如果用户加入一个新的频道,post或者得到一条消息,那么客户端会通过SignalR hub请求目标板的数据,或者通知来自hub的消息,并将其附加到DOM。
这里我关心的是在操作调用时向视图提供数据的必要性。
因为客户端无论如何都会与服务器通信以更新它们的状态,所以我怀疑当用户请求操作时我是否需要让控制器传递板列表。
客户端也可以在通过 WebAPI、SignalR 或其他方法加载页面时请求数据,这样就不必解析 json 数据来创建视图模型。另外,如果我放置这样一个 returns 云数据的功能,这将有利于减少我的服务器实例的负载。这个假设是否正确?
此外,我猜想在其他框架中,客户端 post/get 所有他们需要的东西 to/from 服务器是一种基本方法,但不确定。有人可以解释一下上述三个框架在聊天应用程序的客户端-服务器通信方面的区别吗?
长话短说:
- 你的服务器上应该有主模型。
- 在新客户端连接到服务器的情况下,首先客户端应该为模型的实际状态进行 GET。
- 之后服务器将更改通知客户端。
我做过一个项目,第一次get也是用signalr,因为客户端也可以在服务端用signalr调用方法。有一些开发人员认为这不是一个好的解决方案,但我不理解争论
样本:
假设您有两个玩家(玩家 X 和玩家 O)的简单井字游戏(字段 A1/A2/A3/B1/B2/B3)。首先,两个玩家都必须连接到这个播放文件。连接两个客户端后,您应该通知一个玩家(例如 Palyer X)您可以开始了。另一个客户端只看到另一个玩家在轮流。玩家 X 然后点击字段 A1。因此,您将此信息发送到服务器,例如 playerMove(gameId, playerId, fieldId)。服务器对此进行验证,如果有效,他将向两个玩家 playerMoved(gameId, playerId, fieldId) 发送一个事件。因此,两个客户都将在 A1 中绘制 X。服务器还向客户端 X 发送一个事件,表明客户端 O 轮到,并向客户端 O 发送一个事件,表明他轮到。
所有模型内容都在服务器上 运行。
我一直在使用 knockout.js 处理客户端-服务器通信,但现在想知道我的方法是否正确,以及它在其他框架(如 Angular2 或 React)集成到 MVC web 时如何工作应用程序。
假设我们有一个游戏模型
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public double SkillRating { get; set; }
public List<Attendance> GameAttendanceHistory { get; set; }
public DateTime MemberSince { get; set; }
}
但是当我们要做一个聊天系统的时候,有些属性对于view来说并不是必须的,所以用户的viewmodel应该是这样的
public class UserViewModel
{
public UserViewModel(User user)
{
Id = user.Id;
Name = user.Name;
}
//For guest users
public UserViewModel()
{
Id = 0;
Name = "Guest";
}
public int Id { get; set; }
public string Name { get; set; }
}
还有一些 UI 型号
//One chat channel. Users can open several channels at once.
public class BoardViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public string MessageToPost { get; set; }
public virtual List<User> Users { get; set; }
public virtual List<Post> Posts { get; set; }
}
//Message to be posted to each channel. Messages will be stored in SQL database.
public class Post
{
[Key]
public int Id { get; set; }
public string Message { get; set; }
public DateTime DatePosted { get; set; }
public int PostById { get; set; }
public string PostByName { get; set; }
}
最后,控制器传递一个视图模型
public class ChatUIViewModel
{
public UserViewModel CurrentUser { get; set; }
//List of all boards to which the user belonging
public List<BoardViewModel> Boards { get; set; }
}
到视图,我让 knockout.mapping 解析数据的 json 以创建要使用的视图模型。如果用户加入一个新的频道,post或者得到一条消息,那么客户端会通过SignalR hub请求目标板的数据,或者通知来自hub的消息,并将其附加到DOM。
这里我关心的是在操作调用时向视图提供数据的必要性。
因为客户端无论如何都会与服务器通信以更新它们的状态,所以我怀疑当用户请求操作时我是否需要让控制器传递板列表。
客户端也可以在通过 WebAPI、SignalR 或其他方法加载页面时请求数据,这样就不必解析 json 数据来创建视图模型。另外,如果我放置这样一个 returns 云数据的功能,这将有利于减少我的服务器实例的负载。这个假设是否正确?
此外,我猜想在其他框架中,客户端 post/get 所有他们需要的东西 to/from 服务器是一种基本方法,但不确定。有人可以解释一下上述三个框架在聊天应用程序的客户端-服务器通信方面的区别吗?
长话短说:
- 你的服务器上应该有主模型。
- 在新客户端连接到服务器的情况下,首先客户端应该为模型的实际状态进行 GET。
- 之后服务器将更改通知客户端。
我做过一个项目,第一次get也是用signalr,因为客户端也可以在服务端用signalr调用方法。有一些开发人员认为这不是一个好的解决方案,但我不理解争论
样本:
假设您有两个玩家(玩家 X 和玩家 O)的简单井字游戏(字段 A1/A2/A3/B1/B2/B3)。首先,两个玩家都必须连接到这个播放文件。连接两个客户端后,您应该通知一个玩家(例如 Palyer X)您可以开始了。另一个客户端只看到另一个玩家在轮流。玩家 X 然后点击字段 A1。因此,您将此信息发送到服务器,例如 playerMove(gameId, playerId, fieldId)。服务器对此进行验证,如果有效,他将向两个玩家 playerMoved(gameId, playerId, fieldId) 发送一个事件。因此,两个客户都将在 A1 中绘制 X。服务器还向客户端 X 发送一个事件,表明客户端 O 轮到,并向客户端 O 发送一个事件,表明他轮到。 所有模型内容都在服务器上 运行。