C# 如何在web应用程序中获取和设置持久变量服务器端
我试图在服务器端保存一个简单的int,然后任何用户都可以登录并更新它。我认为这将是一个简单的任务,并开始尝试使用设置设计器,但我无法将范围从“应用程序”更改为“用户”,因为应用程序设置是只读的 我知道我可以在XML文件中保存和更改变量,但我认为必须有一种更简单的方法 我尝试过使用用户配置文件,但是没有任何想法?(我还使用了Context.Profile。)C# 如何在web应用程序中获取和设置持久变量服务器端,c#,asp.net,visual-studio-2010,C#,Asp.net,Visual Studio 2010,我试图在服务器端保存一个简单的int,然后任何用户都可以登录并更新它。我认为这将是一个简单的任务,并开始尝试使用设置设计器,但我无法将范围从“应用程序”更改为“用户”,因为应用程序设置是只读的 我知道我可以在XML文件中保存和更改变量,但我认为必须有一种更简单的方法 我尝试过使用用户配置文件,但是没有任何想法?(我还使用了Context.Profile。) 尽量避免设置,因为它们要求您的配置文件是可修改的,而且ASP.NET中的“用户设置”概念也不存在,因为应用程序总是在W3C工作进程的用户上下
尽量避免设置,因为它们要求您的配置文件是可修改的,而且ASP.NET中的“用户设置”概念也不存在,因为应用程序总是在W3C工作进程的用户上下文下运行,.NET设置API不知道ASP.NET成员身份或“用户”的其他概念 最好的选择是使用DBMS、
应用程序
状态或应用程序中的静态字段(如果它不需要在w3wp.exe
的生命周期之外持久化)或磁盘上的文件,您不必使用XML序列化,您可以手动将其写入(只需确保先锁定文件,因为ASP.NET应用程序是多线程的)
在我的应用程序中,我只将连接字符串和最低限度的初始化设置存储在web.config
中,将每个用户的设置存储在数据库表中,并为此编写一个简单的API层(通常使用应用程序设置和继承或“EffectiveSettings
”)。请注意,这是完全不同的(就实现而言)来自.NET的设置API,出于各种原因,包括本答案中已经公布的原因,我完全避免使用该API
有关IIS w3wp.exe寿命的说明:
IIS将因各种原因随时终止或“回收”w3wp.exe,这就是为什么ASP.NET应用程序必须在最近的时间持久保存到长期存储,并且任何内存中状态都将丢失的原因。原因包括:
- 不活动。如果应用程序池工作进程在至少45分钟(或更长时间)内未处理请求,IIS将关闭该进程
- IIS采取先发制人的措施,通过每90分钟左右(或者可能是29小时,我不确定)终止并重新启动工作进程来防止工作进程泄漏资源
- 无响应。IIS给工作进程一个严格的超时时间来响应传入的请求,我认为默认值是60秒。如果没有响应发送到客户端,则进程将重新启动
- 达到内存限制。与上述基于时间的自动循环类似,如果工作进程达到内存限制,IIS将重新启动它(这就是为什么管理资源很重要)
- 达到请求限制。同样,与基于时间的自动循环类似,IIS将在里程表读取X多个请求后重新启动工作进程。这在默认情况下是禁用的,但您的ISP可能已启用它
session
对象在以后的情况下更有意义)。我正在尝试让用户更改配置值。基本上,此值将是上次上载的图像的编号,以便下次上载的图像编号将是上次的+1。因此,即使用户会话过期,此编号也将保留。您可能根本不应保存此信息-将其缓存到应用程序范围内,或者更好地将所有文件扫描到查找下一个免费号码。如果您愿意,请不要忘记有多个用户正在上载。w3wp.exe的寿命是多少?这个整数不能丢失。如果丢失,它会破坏图像链,如果重置/丢失,页面将调用错误的图像。我已用w3wp.exe寿命的信息更新了我的答案。我需要更持久的东西。可能是w将其写入数据库或XML文件是唯一的答案。它是所有用户共享的值。我认为会有一种更简单的方法来存储常量变量。并不是说将其写入数据库或XML很困难,只是看起来应用程序需要更大的劳动强度,并且需要更多的编码。
<profile>
<providers>
<clear/>
<add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
</providers>
<properties>
<add name="FilmNumber" type="int" allowAnonymous="true" defaultValue="2"/>
</properties>
</profile>
//********Get poster Number*******
int LastPosterNumber=0;
LastPosterNumber = (int)HttpContext.Current.Profile.GetPropertyValue("FilmNumber");
string strFileName;
strFileName = FileField.PostedFile.FileName;
string c = (LastPosterNumber + 1).ToString();
string dirPath = System.Web.HttpContext.Current.Server.MapPath("~") + "/Images/FilmPosters/" + c + ".jpg";
FileField.PostedFile.SaveAs(dirPath);
//******Save new poster number*******
HttpContext.Current.Profile.SetPropertyValue("FilmNumber", int.Parse(c));
HttpContext.Current.Profile.Save();