c# - session 模式 "ServerState"无法正确处理线程中的 session

标签 c# asp.net session stateserver session-state-server

我已经实现了一些工作,为线程内的 session 状态添加值。我希望这些值在 Thread 之外可用(显然)。

当 Session State 模式为“InProc”时,添加到 Session 的信息在 Session 之外可用,没有任何问题。

但是,当 session 状态模式为“StateServer”时,行为会有所不同。基本上,Thread 中设置的值有时 有时。这对我来说似乎是随机的。

这是重现问题的代码。

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void store_Click(object sender, EventArgs e)
    {
        // Set the session values to default.
        Session["Test1"] = "No";
        Session["Test2"] = "No";

        // Set the Test1 session value in the thread.
        ThreadObject threadObject = new ThreadObject() { Username = Page.User.Identity.Name, SessionState = Session };
        worker = new Thread(new ParameterizedThreadStart(Work));
        worker.Start(threadObject);

        // Set the Test2 session value in this thread just to compare.
        Session["Test2"] = "Yes";
    }

    protected void print_Click(object sender, EventArgs e)
    {
        // Print out the Session values.
        label1.Text = string.Empty;
        label1.Text += "Inside Thread: " + Session["Test1"] + ",  \n";
        label1.Text += "Outside: " + Session["Test2"] + "\n";
    }

    private static Thread worker;

    public static void Work(object threadObject)
    {
        // Retrieve the Session object and set the Test2 value.
        ThreadObject threadObject1 = (ThreadObject)threadObject;
        HttpSessionState currentSession = threadObject1.SessionState;
        currentSession["Test1"] = "Yes";
    }
}

public class ThreadObject
{
    public string Username { get; set; }
    public HttpSessionState SessionState { get; set; }
}

上面的代码在 SessionState mode="InProc"下工作正常,但在以下情况下是随机的:

<sessionState mode="StateServer"
  stateConnectionString="tcpip=localhost:42424"
  cookieless="false"
  timeout="20"/>

有什么想法吗?

编辑:根据下面的评论,线程需要在请求(主线程)完成之前完成,否则添加到 session 的任何内容都会丢失。这是因为在主线程结束时, session 被序列化并发送到数据存储(进程外,或 SQL Server)。

最佳答案

我认为这是一个时间问题 - 不能保证您的工作线程在您开始设置标签值时已经执行。创建和启动胎面需要一些 MS。到那时,您的主线程的其余部分可能已经完成。您可以通过放置调试输出并查看代码的执行顺序来对此进行测试。

如果您需要保证线程中的代码执行(这消除了对线程的需要)- 您可以使用 WaitOne() 线程方法让主线程等待工作线程返回。但是,依赖线程中设置的值在并行进程中可用是有风险的。

另外 - 恕我直言,我不会在 ASP.NET 应用程序中使用线程 - 我相信大家一致认为它们有点危险。我已经看到应用程序池因生成的线程中的错误代码而崩溃。

关于c# - session 模式 "ServerState"无法正确处理线程中的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15060751/

相关文章:

c# - 生成 AES 256 位 key 值

c# - 如何在 asp.net 中保护/加密查询字符串?

c# - 在 ASP.NET 中发布后将状态消息返回到页面

c# - 如何在 Windows 商店应用程序中实现登录注销功能?

security - 无休止的 session : any security risk?

jsp - 如何在服务器发送响应之前使用 servlet 过滤器拦截页面请求,将 jsessionid 附加到响应 URL

c# - contains 和 equal(==) 的区别

c# - stub 静态扩展方法似乎在 Rhino Mocks 中有效,除非我强制转换返回变量。为什么?

c# - 如何在新的 ASP.NET Core 中调用 Web API 非默认构造函数

asp.net - WPF 浏览器应用程序可以用作 ASP.NET 的替代品吗?