Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 唯一标识共享会话状态的一个浏览器的两个实例?_C#_.net_Asp.net_Session_Browser - Fatal编程技术网

C# 唯一标识共享会话状态的一个浏览器的两个实例?

C# 唯一标识共享会话状态的一个浏览器的两个实例?,c#,.net,asp.net,session,browser,C#,.net,Asp.net,Session,Browser,我希望确保用户没有在两个不同的浏览器选项卡或窗口(同一个web浏览器实例)中编辑相同的表单数据。这样做的目的是防止用户在继续执行很长的表单过程时意外覆盖自己的数据。在服务器上,通过屏幕输入的持续数据被收集到会话中 假设对于任何浏览器,所有选项卡和窗口都在同一个浏览器实例中运行(即不是每个选项卡和窗口都在单独的进程中)。显然,在这种情况下,浏览器选项卡和窗口共享相同的cookie,因此,修改cookie似乎不可能找到可行的解决方案。这也是它们共享相同会话状态的原因 考虑到表单已经创建,这是最后的润

我希望确保用户没有在两个不同的浏览器选项卡或窗口(同一个web浏览器实例)中编辑相同的表单数据。这样做的目的是防止用户在继续执行很长的表单过程时意外覆盖自己的数据。在服务器上,通过屏幕输入的持续数据被收集到会话中

假设对于任何浏览器,所有选项卡和窗口都在同一个浏览器实例中运行(即不是每个选项卡和窗口都在单独的进程中)。显然,在这种情况下,浏览器选项卡和窗口共享相同的cookie,因此,修改cookie似乎不可能找到可行的解决方案。这也是它们共享相同会话状态的原因

考虑到表单已经创建,这是最后的润色之一,我如何使用ASP.NET(希望很容易)来监督这一点
“功能”?

在呈现指定页面的过程中,生成GUID并保存在会话中。编写一个通用处理程序,用于跟踪指定页面不存在两个GUID的情况

下面的数据结构将有所帮助

class MultipleOpenedPage{
    string guid;
    string pageURL;
    DateTime timeStamp;
    bool IsMultiplePageOpened(List<MultipleOpenedPage> list)
    {
    ///logic 
    }
}
类多人页{
字符串guid;
字符串pageURL;
日期时间戳;
bool IsMultiplePageOpen(列表)
{
///逻辑
}
}

您可以尝试以下方法:

将整数存储为会话[“LastRequest”]。将其放入页面上的隐藏字段中。对于每个请求,将一个添加到整数中

回发时,通过检查该请求,确保未发出任何其他请求。表单[“LastRequest”]等于会话[“LastRequest”]


如果您需要在回发发生之前检查多个实例,您应该能够使用AJAX调用进行检查。

由于web的无状态性质,我认为没有可靠的方法来区分两个浏览器窗口。但是,您可以在会话中存储一个标志,表明给定的长时间运行的进程正在进行中。这样,您就不必关心他们是否尝试从同一个浏览器窗口或多个浏览器窗口重新运行进程。诀窍是处理流程失败并且没有机会重置标志的情况,以便流程可以再次运行

您无法区分同一页面的两个http帖子,即使它们来自不同的选项卡

这就像著名的后退按钮问题——他们可以发布、后退和重新发布

通常的解决方案是隐藏跟踪字段,但很难使其可靠


如果这是一个向导类型的过程,那么应该很容易检测它们是否正在覆盖已经输入的字段,并显示一条警告。

每次呈现表单时,将某个隐藏字段的值设置为随机字符串。在会话状态中存储相同的字符串。当用户发回时,检查这两个值是否相等。如果没有,这必须是一个重新发布。

我通过创建一个基类继承自System.Web.UI.Page,并在Page\u load/init事件中创建一个包含特定于用户实例的信息的对象来解决这个问题

也就是说,创建的每个新页面都会获取它自己的对象实例,因此可以维护不同的状态/属性,这些状态/属性可用于对同一页面上的数据进行不同的编辑


这只是一个想法,因为这是一种不同的处理方式。

如何确定请求是一个新实例,而不仅仅是用户点击F5?在GET请求的情况下,按F5行为与打开新实例相同,因为在这两种情况下,都是一个新的http GET请求,因此没有简单的检测方法。当页面卸载时,我们可以通过ajax请求进行检测,但这些ajax请求有时会失败。在后刷新的情况下,可以通过在viewstate中放置一个GUID并在回发时将viewstate GUID与会话值匹配来检测。@jdk您可以在应用程序_beginrequest中检查用户名,如果该用户的会话存在,则将用户重定向到帮助页。@Sergey M.我不明白。这如何帮助我在客户端共享会话时区分不同的浏览器选项卡?如果我正确理解了OP,他没有一个在服务器上花费很长时间的进程,而是一系列收集大量信息的页面(在会话中)这不应该由第二个浏览器选项卡上的页面重新初始化/重写。即使是这样,我仍然不相信有办法区分不同的浏览器窗口。我们正在讨论的是找到一种通过多页流程存储用户进度状态的方法。这是会话的理想用途之一。因此,与其试图检测用户是如何达到他们所处的状态,他应该简单地设计系统,以对其认为用户所处的状态作出反应。如果有人要否决投票,请提供他们的理由。