如何在ASP.NET网页中控制多个连接

时间:2013-05-09 10:23:37

标签: c# asp.net web concurrency

我有网页index.aspx和相应的服务器端代码index.aspx.cs。如果多个客户端连接到我的网站,这个C#代码有一个不能并行执行的方法。我该如何限制?

这是方法的作用。它创建一个文件夹,压缩它并使其可供用户下载。我的要求是,当一个用户执行此方法时,其他一些用户不应该这样做,因为它会再次创建相同的文件夹,从而导致数据损坏。

我尝试使用Session对象。但我发现会话对象是按客户端存储的。

有人能建议我一些解决方案吗?

3 个答案:

答案 0 :(得分:1)

Application上下文或静态类是应用程序范围的。因此,您可以存储一个标志,指示该进程已经启动。程序结束后,您可以删除该标志。

http://msdn.microsoft.com/en-us/library/94xkskdf(v=vs.100).aspx

在写入应用程序状态时始终使用Application.Lock,在使用静态类时始终使用lock(mutex)

在您的情况下,静态类将是更好的解决方案,因为似乎应用程序上下文仅出于与经典asp的兼容目的而存在:Using static variables instead of Application state in ASP.NET

static object mutex= new object();

lock(mutex)
{
   //Do the work
}

答案 1 :(得分:1)

我的直接建议是:为每个请求创建一个随机文件夹名称,这将允许您同时运行它们。但是,如果这不是一个选项,则需要使用lockMutex等内容进行同步。但是,如果您从当前请求返回结果,而不是在一个请求中压缩它,并让它们在下一个请求下载它,那么这只会很好。

坦率地说,我认为您应该在zip 的请求中执行zip 。实际上,除非文件很大,否则你甚至不需要触摸文件系统 - 你可以使用MemoryStream和任何一个zip编码器(例如System.IO.Packaging.ZipPackage)在内存中创建一个zip - 然后只需将客户端传递给MemoryStream

中的数据

如果您使用的是MVC,那只是return File(contents, contentType)。使用vanilla ASP.NET,您需要few more steps

答案 2 :(得分:0)

如果您使用经典的asp.net会话,则无需执行任何操作,因为会话已准备好锁定来自多个用户的页面运行。

如果你没有,那么你可以按照Marc的建议,使用Mutex

关于会话锁定:
Web app blocked while processing another web app on sharing same session
jQuery Ajax calls to web service seem to be synchronous
ASP.NET Server does not process pages asynchronously
Replacing ASP.Net's session entirely