2012-07-04 149 views
3

如何一次仅访问一个用户来限制页面。使用asp.net,我可以使用global.asax,有没有其他的方式来限制,如果一个用户访问该页面,另一个用户无法访问该页面。我们必须提供一个用户正在访问该页面的消息。可能吗。你能帮助我还是给一些参考。ASP.NET:如何限制只有一个用户访问页面?

+3

你能分享这背后的原因,你的问题吗?也许我们可以用另一种方法来解决根本原因 – Jupaol

+0

这取决于你如何定义*访问*(当服务器正在处理页面?直到用户加载页面后的x分钟?) – McGarnagle

+2

它很难检查用户是否离开页面 –

回答

1

在此基础上:

对没错,jupaol,它是依赖于账户,在我的web应用程序,一个报告有只批准一个用户,但有两个用户的批准权限。如果他们同时访问同一页面并批准,它将大混乱。在这里我没有使用数据库。

问题与并发有关,有几种方法可以面对这样的问题,例如最简单的方法是使用optimistic concurrency。即使你没有为此使用数据库,你也可以模拟它。

你应该在什么地方存储审批的结果,为了纪念报告批准,考虑到这一点,你应该能够做这样的事情:

  1. 之前渲染页面获得最新报告状态
  2. 如果报告未获批准,使正常
  3. 如果报告被批准之前秒,使其在只读模式报告谁批准它(或类似的方法)
  4. 验证添加到您的ChangeStatus方法,该方法执行以下操作:
    1. 获取当前报告
    2. 如果报告仍然未通过验证,那么阻塞线程的最新状态(你可以使用Mutex或类似),并将报告标记为验证它
    3. 如果报告已经验证它,请引发域异常并在页面中正确处理它(也许以只读模式呈现页面,说明报告已经验证它)

如果你想要一个更敏感的应用(RIA),你可能要考虑以下方法:

  • 或许,这将是最糟糕的做法,但它仍然是一个选项,你可以保持一个日志跟踪当用户请求你的页面时,然后在后续请求中检查日志是否仍然有效,如果不是,则重定向到另一页面,指示页面正在使用,否则允许访问该页面。我相信这是一个容易出错的方法,因为你会为了防止在您的系统不一致,除了你将有轮询问题在下面的办法

  • 使用AJAX来描述靠这个简单的验证轮询来自服务的数据,检查报告是否已被批准。也许,这是实现这个最简单的方法,但不建议这样做,因为你会轮询服务器不断,最终你将有可扩展性问题

  • 你可以使用Comet得到通知浏览器(客户端)每当发生服务器事件时,在这种情况下,您的报告已获批准。这种方法的问题是,你必须保持与服务器的打开连接才能得到通知。

  • 最后的办法,最值得推荐的,这些天是使用Web Sockets,这是StackOverflow的用于实时获取通知的技术。

2

尽管可能有很多更好的方法来处理这类问题,但我会假设你确实需要这样做。

我会怎么做:

使得加载页面时让你的应用程序(当它不“锁定”),它记录对加载页面和“锁定”它的数据库。在实际的页面中,我会使用某种AJAX来每隔5-15秒不断轮询Web服务器,以告知应用程序用户仍在页面上。然后使其成为在上一次AJAX调用保存到数据库的5到15秒后页面解锁。

同样,我真的很怀疑,周围有这样一个问题,一个更好的办法,但是这是一个直接的答案

+0

不幸的是,“硬锁”有点难以处理;他们必须被创建,发布和获得... – 2012-07-04 18:47:50

相关问题