繁体   English   中英

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

[英]How to control multiple connections in ASP.NET web page

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

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

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

谁能建议我一些解决方案?

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

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

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

在您的情况下,静态类将是一个更好的解决方案,因为似乎应用程序上下文仅出于与经典asp兼容的目的而存在:在ASP.NET中使用静态变量而不是Application状态

static object mutex= new object();

lock(mutex)
{
   //Do the work
}

我的直接建议是:为每个请求创建一个随机的文件夹名称,这将允许您同时运行它们。 但是,如果不是这样,则需要使用lockMutex类进行同步。 但是,只有当您从当前请求中返回结果而不是将其压缩到一个请求中,然后让他们下载下一个请求时,此方法才能很好地工作。

坦率地说,我认为您应该在zip 请求中进行压缩 确实,除非文件很大,否则您甚至不需要接触文件系统-您可以使用MemoryStream和任何zip编码器(例如System.IO.Packaging.ZipPackage )创建一个zip内存中的文件-然后只需向客户端发送来自MemoryStream的数据即可。

如果使用的是MVC,则仅return File(contents, contentType) 使用香草ASP.NET,您还需要一些步骤

如果使用经典的asp.net会话,则无需执行任何操作,因为所有会话都可以锁定来自多个用户的页面运行。

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

关于会话锁:
在共享同一会话时处理另一个Web应用程序时,Web应用程序被阻止
jQuery Ajax对Web服务的调用似乎是同步的
ASP.NET Server不会异步处理页面
完全取代ASP.Net的会话

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM