0

我试图在服务器端保存一个简单的 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();
4

1 回答 1

0

尽量避免设置,因为它们要求您的配置文件是可修改的,而且 ASP.NET 中的“用户设置”概念也不存在,因为应用程序始终在 W3C 工作进程的用户上下文下运行 - .NET 设置 API 不是了解 ASP.NET 成员资格或“用户”的其他概念。

您最好的选择是在您的应用程序中使用 DBMS、Application状态或静态字段(如果它不需要在生命周期之外持久化w3wp.exe)或磁盘上的文件,您不必使用 XML 序列化,您可以手动写出来(一定要先锁定文件,因为 ASP.NET 应用程序是多线程的)。

在我的应用程序中,我只将连接字符串和最少的初始化设置web.config存储在每个用户的设置中,我存储在数据库表中并为此编写一个简单的 API 层(通常使用应用程序设置和继承或“ EffectiveSettings”)。请注意,这与 .NET 的 Settings API 完全不同(就实现而言),出于各种原因,我完全避免使用它,包括已在此答案中公布的那些。

关于 IIS w3wp.exe 生命周期的注意事项:

由于各种原因,IIS 将随时终止或“回收”w3wp.exe,这就是为什么您的 ASP.NET 应用程序必须在最近的机会持久保存到长期存储,并且任何内存中的状态都将丢失。原因包括:

  • 不活动。如果应用程序池工作进程在至少 45 分钟(左右)内未处理请求,IIS 将关闭该进程。
  • 回收。IIS 通过每 90 分钟左右(或者可能是 29 小时,我不确定)终止并重新启动它们来对泄漏资源的工作进程采取先发制人的措施。
  • 反应迟钝。IIS 为工作进程提供了一个严格的超时来响应传入的请求,我认为默认值为 60 秒。如果没有向客户端发送响应,则该过程将重新启动。
  • 达到内存限制。与上述基于时间的自动回收类似,如果工作进程达到内存限制(这就是管理资源很重要的原因),IIS 将重新启动工作进程。
  • 达到请求限制。同样,类似于基于时间的自动回收,IIS 将在其里程表读取 X 多个请求后重新启动工作进程。默认情况下禁用此功能,但您的 ISP 可能已启用它。
于 2013-03-15T01:02:23.023 回答