如何在web应用程序中获取和设置持久变量服务器端
本文关键字:设置 变量 服务器端 获取 web 应用程序 | 更新日期: 2023-09-27 18:04:12
我试图在服务器端保存一个简单的int,然后任何用户都可以登录并更新它。我认为这将是一个简单的任务,并开始尝试使用设置设计器,但是我无法将范围从"应用程序"更改为"用户",因为应用程序设置是只读的。
我知道我可以保存和更改XML文件中的变量,但我认为必须有一个更简单的方法。
我已经尝试使用用户配置文件,但它不工作任何想法?(我也使用了Context.Profile.)
<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();
尽量避免设置,因为它们需要您的配置文件是可修改的,也是ASP中"用户设置"的概念。.NET不存在,因为应用程序总是在W3C工作进程的用户上下文中运行——.NET设置API不知道ASP。. NET会员资格或其他"用户"概念。
你最好的选择是在你的应用程序中使用DBMS, Application
状态或静态字段(如果它不需要在w3wp.exe
的生命周期之外持久化)或磁盘上的文件,你不必使用XML序列化,你可以手动写出来(只是要确保首先锁定文件,因为ASP. XML . XML . XML . XML)。. NET应用程序是多线程的)。
在我的应用程序中,我只在web.config
中存储连接字符串和最小的初始化设置,每个用户设置我存储在数据库表中,并为此编写一个简单的API层(通常使用应用程序设置和继承或"EffectiveSettings
")。请注意,这与。net的Settings API完全不同(就实现而言),由于各种原因,我完全避免使用。
关于IIS w3wp.exe寿命的说明:
IIS将终止或"回收"w3wp.exe在任何时候的各种原因,这就是为什么你的ASP. exe。. NET应用程序必须在最近的机会持久化到长期存储,任何内存中的状态都将丢失。原因包括:
- 不活动。如果应用程序池工作进程在至少45分钟内没有处理请求,IIS将关闭该进程。
- 回收。IIS通过每90分钟左右(或者可能是29小时,我不确定)终止并重新启动工作进程,采取先发制人的措施防止工作进程泄漏资源。
- 反应迟钝。IIS给工作进程一个严格的超时来响应传入的请求,我认为默认是60秒。如果没有向客户端发送响应,则进程将重新启动。
- 达到内存限制。与上面描述的基于时间的自动回收类似,如果达到内存限制,IIS将重新启动工作进程(这就是为什么管理资源很重要)。
- 达到请求限制。同样,与基于时间的自动回收类似,IIS将在工作进程的里程表读取到X个请求后重新启动工作进程。这是默认禁用的,但您的ISP可能已经启用了它。