【问题标题】:How do I migrate existing code inside a .net socket server into Asp.net REST web api?如何将 .net 套接字服务器中的现有代码迁移到 Asp.net REST web api?
【发布时间】:2015-05-29 21:54:30
【问题描述】:

我正在尝试将逻辑从基于 .NET 的实时套接字服务器迁移到基于 RESTful 的 ASP.net Web api。原因是我们的游戏设计发生了变化,我们不再需要对套接字服务器进行任何实时处理。

为了迁移,我需要做以下事情,但我没有使用 Asp.net 的经验,所以希望有人能指出我正确的方向:

1) 在套接字服务器中,当玩家建立连接时,我们将该玩家的所有数据从数据库加载到 Player 类的实例中,例如玩家的库存。我们在服务器端的连接对象上保持这个实例处于活动状态,这样只要 tcp 套接字连接处于活动状态,这个 Player 对象就相当于在内存中保存玩家数据的缓存。但我不知道将这个 Player 实例放在 Asp.net Web API 中的等效位置是什么,这会是会话状态吗?

2) 游戏具有可供所有连接的客户端使用的静态数据,例如武器造成的伤害量。我们将这些数据从数据库加载到服务器应用程序实例上的 StaticData 对象中。在 Asp.net web api 中保存应用程序范围数据的位置是什么?

3) 我们不使用 MVC 架构,目前我们在客户端和服务器之间进行通信的方式是我们发出请求(例如出售商品),服务器验证并处理请求,并将更新后的状态发送回客户端通过将更新的数据序列化到 object[] 数组中。似乎对于 asp.net MVC,很多事情都是“自动的”,相当于在 asp.net 中执行“向服务器发送请求 -> 服务器进程并发送回更新的状态 -> 客户端反序列化状态” Web API 世界?

【问题讨论】:

  • 如果您尝试更新旧的基于套接字的应用程序,而不是 WebAPI,您实际上可能正在寻找 SignalR。
  • 感谢您的建议-我们之所以要使用web api是因为我们不再需要实时通信的功能,所以我们认为RESTful是最好的方式?
  • 在处理 REST 时要记住的是,它是有目的的无状态的。这不仅仅是在 Microsoft 实现中,它是适当 REST API 的核心属性。在正确开发的 REST API 中,PUTPOST 将是幂等的,GET 将是无效的,根本不做任何更改。

标签: c# asp.net asp.net-mvc sockets photon


【解决方案1】:

1) 是的,您可以将其存储在Session

2) 类似于Session,ASP 有Application

3) 抱歉,这个问题太宽泛了,无法回答。 MVC 模式并不神奇,您仍然需要编写代码。您向服务器发送请求。它由控制器处理,控制器可以操作模型,模型反过来更新视图,即整个过程的输出。试试这个tutorial 开始并更好地了解 ASP.net 中的 MVC 模式。

最后但并非最不重要的一点是,您应该意识到,如果您将数据存储在 Application 中,您可能会在以后遇到一些问题。随着您的用户数量级越来越大,您可能希望使用多个 IIS 工作进程运行您的应用程序。这些工作进程中的每一个都有自己的 Application 对象。根据静态数据占用的内存量,您可能会遇到内存问题。您应该考虑使用 memcached、redis 等作为共享缓存。 Session 数据也是如此。

【讨论】:

  • 非常感谢您的回答!关于 Application 对象的内存问题,如果 Application 中存储的静态数据永远不会改变,我们还需要担心这个问题吗?在我们的游戏中,静态数据始终保持不变,并在服务器启动并从数据库读取时填充。我们从不以任何方式操纵这些静态数据,它也永远不会改变。
  • 不客气(如果您觉得有帮助,请接受答案:))。这里的问题不是你是否更新数据,而是它消耗了多少内存。一方面,每次应用程序池回收(IIS 应用程序池中的配置设置)时,数据都必须重新加载到内存中,这会影响性能。其次,它会增加内存消耗。在不了解您的应用程序的情况下,我会说几个 MiB 应该不是问题。如果我们在谈论 GiB,请考虑使用不同的缓存方法。
  • 我已经接受了答案。它不是很多数据,不超过10mb。 .我不知道服务器会回收该内存。如果我把它放在启动脚本中,这是否意味着它会定期从数据库中读取并填充该对象?
  • 在这种情况下,你应该没问题的消费。如果您还没有这样做,请将文件 Global.asax 添加到您的项目中。在文件Global.asax.cs 后面的代码中,您现在可以在Application_Start 方法中定义这些读取和填充步骤。每次您的应用程序启动(或重新启动)时,都会执行这些步骤。
猜你喜欢
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
相关资源
最近更新 更多