2013-05-09 29 views
1

我有网页的index.aspx和相应的服务器端代码index.aspx.cs。如果多个客户端连接到我的网站,此C#代码的方法不能并行执行。我怎样才能限制呢?如何控制ASP.NET网页中的多个连接

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

我试过使用会话对象。但是我知道会话对象是以每个客户端为基础存储的。

任何人都可以建议我一些解决方案吗?

+3

你需要重新思考你的问题。所有用户都需要相同的压缩文件吗?如果不是那么,你应该创建(随机文件夹也许)文件夹,并保持您的调用代码中的文件夹名称的参考。如果您不想更改压缩文件的创建方式,请使用缓存来存储限制变量,而不是使用会话。 – Yahya 2013-05-09 10:28:48

+0

所有用户不需要相同的压缩文件。根据用户界面上的用户选择,包装不同。 – 2013-05-09 10:38:49

+0

@RaviChandra为什么不推迟zip的创建,直到他们尝试下载它,然后在内存中执行?没有争用,并没有浪费努力 – 2013-05-09 10:39:19

回答

1

应用程序上下文或静态类在应用程序范围内。所以你可以存储一个表明进程已经启动的标志。程序结束后,您可以删除标志。

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

应用程序上下文无非是静态变量。 http://stackoverflow.com/questions/10960695/using-static-variables-instead-of-application-state-in-asp-net/10964038#10964038 – Aristos 2013-05-09 10:32:14

+0

@Aristos你是对的!我调整了我的答案! – Kai 2013-05-09 10:36:49

+0

凯,感谢您的回答,这将有助于解决我的问题 – 2013-05-09 10:47:25

1

我立即建议是:创建一个随机文件夹每个请求的名称,这将允许你同时运行它们。但是,如果这不是一个选项,那么您将需要使用类似lockMutex的同步。但是,如果您从当前请求返回结果,而不是在一个请求中将其压缩,并让它们在下一个请求中进行下载,那么这只会起作用。

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

如果您使用的是MVC,这只是return File(contents, contentType)。用香草ASP.NET你需要一个few more steps

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

+1

会话不会*同时阻止多次运行页面(当然不是针对不同的用户,但通常不会针对同一用户); asp.net本身很乐意运行同一页面的多个副本 – 2013-05-09 10:37:54

+0

@MarcGravell也许我没有把它写得正确?如果代码来自页面内部,则锁定它们并且不会并行运行代码。 – Aristos 2013-05-09 10:39:43