C# 如何控制ASP.NET网页中的多个连接

C# 如何控制ASP.NET网页中的多个连接,c#,asp.net,web,concurrency,C#,Asp.net,Web,Concurrency,我有网页index.aspx和相应的服务器端代码index.aspx.cs。这个C#代码有一个方法,如果多个客户端连接到我的网站,该方法无法并行执行。我如何限制这一点 下面是该方法的作用。它创建一个文件夹,压缩它,让用户可以下载。我的要求是,当一个用户执行此方法时,其他用户不应执行此操作,因为它将再次创建相同的文件夹,从而导致数据损坏 我尝试使用会话对象。但我知道会话对象是按客户机存储的 有人能给我一些解决方案吗?应用程序上下文或静态类是应用程序范围的。因此,您可以存储一个标志,指示进程已启动。

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

下面是该方法的作用。它创建一个文件夹,压缩它,让用户可以下载。我的要求是,当一个用户执行此方法时,其他用户不应执行此操作,因为它将再次创建相同的文件夹,从而导致数据损坏

我尝试使用会话对象。但我知道会话对象是按客户机存储的


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

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

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

在您的情况下,静态类将是一个更好的解决方案,因为应用程序上下文的存在似乎只是为了与经典asp兼容:


我的直接建议是:为每个请求创建一个随机文件夹名,这将允许您同时运行它们。但是,如果这不是一个选项,那么您将需要使用类似于
lock
Mutex
的东西进行同步。但是,只有当您返回当前请求的结果时,这才有效,而不是在一个请求中压缩结果,然后让他们在下一个请求中下载

坦白地说,我认为你应该在请求拉链时做拉链。实际上,除非文件很大,否则您甚至不需要触摸文件系统-您可以使用
MemoryStream
和任何zip编码器(例如
system.IO.Packaging.ZipPackage
)在内存中创建zip,然后将
MemoryStream
中的数据交给客户端即可


如果您使用的是MVC,这只是返回文件(contents,contentType)。使用vanilla ASP.NET,您需要一个。

如果您使用经典ASP.NET会话,则无需执行任何操作,因为会话all ready会锁定来自多个用户的页面运行

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

关于会话锁:




你需要重新思考你的问题。所有用户都想要相同的压缩文件吗?否则,您应该创建(可能是随机文件夹)文件夹,并在调用代码中保留文件夹名称的引用。如果不想更改压缩文件的创建方式,请使用缓存来存储限制变量,而不是会话。所有用户都不想要相同的压缩文件。根据用户在UI上的选择,软件包会有所不同。@RaviChandra为什么不推迟zip的创建,直到他们尝试下载它,然后在内存中完成?没有争用,也没有浪费精力为什么不给每个文件一个唯一的名称呢?最简单的是GUID。应用程序上下文只不过是静态变量。Kai,谢谢你的回答,这将有助于解决我的问题Session不会同时阻止页面的多次运行(当然不会针对不同的用户,但通常也不会针对同一用户);asp.net天生乐于运行同一个文件的多个副本page@MarcGravell也许我写得不对?如果代码来自页面的内部调用,则会锁定它们,并且不会并行运行代码。
static object mutex= new object();

lock(mutex)
{
   //Do the work
}