【问题标题】:Altering Web.Config SessionTimeout value from within application从应用程序中更改 Web.Config SessionTimeout 值
【发布时间】:2011-09-06 15:42:34
【问题描述】:

我正在尝试找出一种动态更改会话超时的方法,因为我的客户要求这是一个他们可以轻松更改的值(就好像它是一个数据库事务一样)。这是我要更改的值的截断版本:

<appSettings>
   <add key="SessionTimeout" value="20"/>
</appsettings>

我正在使用 C#/.Net 3.5 处理所有这些。

作为记录,我知道更改 web.config 文件将导致应用程序重新启动。我想要的是让程序的管理员能够即时更改超时。例如,如果他们要求人们填写的其中一张表格花费的时间超过 20 分钟,他们需要将时间延长至半小时,或者如果他们出于其他原因希望缩短时间。由于我们想让用户(包括管理员)远离代码文件,因此我们的目标是将其创建为站点管理页面的一部分。

问题是,我不知道如何做到这一点,或者是否有可能(更不用说一个好主意)。我已经让谷歌四处奔波,但一无所获。

有没有办法进行这些更改,甚至可能动态地动态更改超时(覆盖 web.config 的内容)?

感谢您的帮助。

【问题讨论】:

    标签: c# asp.net web-config timeout


    【解决方案1】:

    可以在运行时编辑 web.config,但正如您已经指出的那样,我不确定这是否是个好主意。您可以通过多种方式实际编辑此文件,但是您必须确保运行应用程序的帐户具有适当的文件系统权限才能写入应用程序目录(例如,编辑和保存 web.config 文件)。如果您处于集群环境中,我强烈建议您不要走这条路(尽管仍然可能)。

    一旦你的权限等被整理出来,下面是一个快速的方法。

    public void EditMyWebConfig(string appSettingsKey, string appSettingsValue, string         filePath)
        {
            XmlDocument xml = new XmlDocument();
            //Load current config into memory
            xml.Load(filePath);
            //Overwrite config
            using(FileStream fs = new FileStream(filePath, FileMode.Create,FileAccess.ReadWrite))
            {
                //select appSetting you want to edit
                XmlNode xmlN = xml.SelectSingleNode("//configuration/appSettings/add[@key = '" + appSettingsKey + "']");
                //assign new value
                xmlN.Attributes["value"].Value = appSettingsValue;
                //Create new web config
                xml.Save(fs);
            }
        }
    

    我希望这会有所帮助,但我认为您应该选择一个较大的会话时间,这样会更容易,并且将来造成的问题更少。

    【讨论】:

      【解决方案2】:

      与其尝试更改 web.config,不如在运行时更改代码中的 Session.Timeout 怎么样?

      更多信息:

      http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.timeout.aspx

      【讨论】:

      • 只是为了确认一下,这需要在每次页面加载时设置,还是在应用程序加载时设置?
      • 从我所见,它看起来需要为每个会话设置。似乎还有一个怪癖(至少在 ASP.NET 2.0 中),设置 Session.Timeout 似乎只有在 Session 状态集合中至少有一项时才需要。
      • (..continued) 所以在 Global.asax 的 Session_Start 事件中设置它可能是一种选择。
      【解决方案3】:

      在您需要的地方延长代码超时时间:

      Session.Timeout = 40;
      

      此外,如果您尝试在配置中更改此参数,则会导致应用程序池重新启动。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多