IIS7 ASP.NET会话在几秒钟内下降

时间:2010-03-18 22:40:50

标签: asp.net session iis-7 timeout

为了测试我有一个隔离的页面 - 没有主人,控件,....我的会话在大约30秒后丢失。我已经尝试在web.config中设置超时,在web.config中,两者都没有。尝试使用超时和Windows身份验证进行表单身份验证更改后回收AppPool。

我可以从Session_Start响应。但是我从来没有得到任何来自Session_End的响应。

我尝试过的一些事情:

<sessionState mode="InProc"
  stateConnectionString="tcpip=127.0.0.1:42424"
  sqlConnectionString="data source=127.0.0.1;"
   cookieless="false"
   timeout="20" />

<sessionState mode="InProc" cookieless="false" timeout="20"/>

<sessionState mode="InProc" timeout="20"/>

<sessionState timeout="20"/>

没有运气。

我的运行时设置为:

<httpRuntime useFullyQualifiedRedirectUrl="true" 
maxRequestLength="204800" 
requestLengthDiskThreshold="204800" 
executionTimeout="600" />

我不知道这会有什么相关性,但我想不出任何其他事情要发布!

谢谢!

2 个答案:

答案 0 :(得分:1)

如果你正在进行inproc会话(代码片段说明你是这样)并且某些东西一直在触摸虚拟文件夹或其下面的任何内容,那么它就会准备好丢失很多会话。

如果是这种情况,这就是修复:

'This is supposed to turn off the monitoring for directory deletes
'See https://connect.microsoft.com/VisualStudio/feedback/Workaround.aspx?FeedbackID=240686
'This incurrs the penelty of an IISRESET or manually restarting the containing AppPool after every upgrade.
Dim pi As PropertyInfo
Dim o As Object
Dim m As MethodInfo
pi = GetType(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Static)
o = pi.GetValue(Nothing, Nothing)
m = o.GetType().GetMethod("Stop", BindingFlags.Instance Or BindingFlags.NonPublic)
m.Invoke(o, New Object() {})

答案 1 :(得分:0)

你怎么知道你的会话丢失了?您是否在浏览器中启用了Cookie?

修改
这是一个更简单,更简单的测试页面:

<body>
    <form id="form1" runat="server">
    <div>
        Session value is: <%= Session["testvalue"] %><br />
        <asp:TextBox ID="txtText" runat="server"></asp:TextBox>
        <asp:Button ID="btnSet" runat="server" Text="Set" OnClick="btnSet_Click" /><br />
        <asp:Button ID="btnRefresh" runat="server" Text="Refresh" />
    </div>
    </form>
</body>

背后的代码:

public partial class SessionTest : System.Web.UI.Page
{
    protected void btnSet_Click(object sender, EventArgs e)
    {
        Session["testvalue"] = txtText.Text;
    }
}

另一种可能性是由于App域重新启动而导致会话丢失。将某种日志记录输出添加到Application_Start。