C# 如何在web应用程序中获取和设置持久变量服务器端

C# 如何在web应用程序中获取和设置持久变量服务器端,c#,asp.net,visual-studio-2010,C#,Asp.net,Visual Studio 2010,我试图在服务器端保存一个简单的int,然后任何用户都可以登录并更新它。我认为这将是一个简单的任务,并开始尝试使用设置设计器,但我无法将范围从“应用程序”更改为“用户”,因为应用程序设置是只读的 我知道我可以在XML文件中保存和更改变量,但我认为必须有一种更简单的方法 我尝试过使用用户配置文件,但是没有任何想法?(我还使用了Context.Profile。) 尽量避免设置,因为它们要求您的配置文件是可修改的,而且ASP.NET中的“用户设置”概念也不存在,因为应用程序总是在W3C工作进程的用户上下

我试图在服务器端保存一个简单的int,然后任何用户都可以登录并更新它。我认为这将是一个简单的任务,并开始尝试使用设置设计器,但我无法将范围从“应用程序”更改为“用户”,因为应用程序设置是只读的

我知道我可以在XML文件中保存和更改变量,但我认为必须有一种更简单的方法

我尝试过使用用户配置文件,但是没有任何想法?(我还使用了Context.Profile。)


尽量避免设置,因为它们要求您的配置文件是可修改的,而且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可能已启用它

Define“persistent”-这是用户会话期间使用的变量,还是您试图让用户更改配置值?您是否有兴趣使配置文件正常工作,或者只是存储一些每个会话的数据(
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();