我正在尝试使用ASP.NET和Angular运行一个简单的客户端/服务器应用程序。我有一些功能可以使客户端通过POST调用服务器并返回数据,然后通过Angular将其显示给用户。
该应用程序本身将是一个聊天室应用程序。我刚刚尝试开始工作的一件事是让用户维护已“登录”到聊天室的临时用户列表。最终,我将获得一个用于更持久存储的数据库,但现在在运行时存储就足够了。
我有一个MessageController
类,其中包含一个List<string> _userList
对象,该对象用于存储我的临时用户名列表,还有一个POST方法,用户可以使用该方法将用户名注册到服务器。
public class MessageController : Controller
{
private List<string> _userlist;
public MessageController()
{
_userlist = new List<string>();
}
[HttpPost, Route("")]
public string Post([FromBody]Message msg)
{
if (!_userlist.Contains(msg.User))
{
_userlist.Add(msg.User);
}
}
}
这可以正常工作,并且用户名可以毫无问题地添加到列表中。但是,如果我尝试第二次调用该方法,我会惊讶地发现我的Arraylist包含0个元素。似乎存储在Arraylist中的先前用户名已丢失。
我能想到的唯一解释是Arraylist已重新实例化,丢失了先前存储的数据。令人惊讶的是,我以为我在运行服务器时会在启动时实例化一次控制器类,然后将其保存在内存中,以便在每次调用端点时都可以访问它们。似乎控制器类是在每次调用端点时实例化的,而不是在启动时实例化的。我以为是正确的吗?
答案 0 :(得分:2)
是的,他们每次都会被重新实例化。 HTTP应用程序设计为无状态。每次向服务器发出新请求时(就像是ASP.NET框架,有几个小例外),就像您从未运行过代码一样。服务器基本上不存储先前的活动。
也不知道您是否真的要发出任何进一步的请求,或者直到发出请求才需要多长时间,因此为每个用户在内存中保留所有实例化类的副本将是非常低效的。 / p>
如果要在请求之间保留数据以保持状态,则需要将其存储在某个位置。如果是永久性或半永久性的,则考虑存储,例如数据库或数据文件。如果只是在用户会话期间将其保留,则使用ASP.NET会话。