.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 发送一个事件,表明他轮到。 所有模型内容都在服务器上 运行。