2009-08-06 16 views
5

关于动态存储临时图像并在Web服务器的文件系统上处理其清理的主题:(使用.NET 3.5中的C#)。global.asax的使用和范围(用于应用程序结束后的文件清理)

有人建议我使用global.asax文件来处理这个问题。

我只是不明白这个东西是如何工作的。

我有两个单独的应用程序...

我已经想通了,在Global.asax应该是在网站的根目录下。

问题:

1)如何我得到的global.asax火的只有这两个特定的应用程序。

2)两个应用程序都需要创建一个字符串列表(文件位置),然后在应用程序终止时删除它们。我是否在应用程序中实例化这个数组,或者在global.asax

我的代码看起来就像这样:

List<string> fileLocations = new List<string>(); 
//I don't know where to put this. 

//The next line of code will be in both applications (this could 
//be called many times in one application session. The names of 
//the files are generated from the clock (milliseconds and 
//seconds combined, I might change this to use the actual 
//random class combined with sessionID) 
fileLocations.Add(file); 

void Application_End(object sender, EventArgs e) 
{ 
    // Code that runs on application shutdown 
    foreach(string file in fileLocations) 
    { 
     if(File.Exists(file)) 
      File.Delete(file); 
    }  
} 

我感到困惑在Global.asax实际上是如何工作的。它是否像界面一样使用?

回答

3

查看如何使用Global.asax的好地方是阅读ASP.NET Quickstart on it's usage。每个Web应用程序/站点都有一个。这有点像全球级事件。

请注意,在大多数服务器上,Application_End事件不会经常触发。它只会在IIS应用程序池卸载/回收,web.config修改,在/ Bin中更改程序集或Web服务器停止时的其他情况下触发。在受欢迎的网站上,可能需要数周,甚至数月才会发生。

+0

因此,没有简单的方法来检测某人完成使用应用程序并运行清理脚本的时间?我觉得这应该比它容易得多:/ – Dave 2009-08-06 19:34:31

+0

那么,如果用户登录,那么你也可以在Global.asax中使用Session_End事件。默认情况下,它是20分钟,但你可以设置自己的限制。请参阅http://stackoverflow.com/questions/621744/how-to-handle-session-end-in-global-asax和http://justgeeks.blogspot.com/2008/07/aspnet-session-timeouts.html – 2009-08-06 20:06:06

+0

啊,好的。 那么如果我在global.asax文件中声明一个List,它会为每个用户的会话实例化一个新的列表,还是我在我的程序中声明这个列表,并以某种方式global.asax访问它。 就像我说的,我对基本的问题表示歉意......我通常很擅长于自己计算这些东西,但出于某种原因,global.asax对我来说并不是很直观。 – Dave 2009-08-06 20:15:29

2

MSDN LinkWikipedia Link是开始的地方。

它不是像接口一样使用,更像是一个过滤器,它有许多不同的钩子来启动应用程序对象或Session或Request。维基百科链接有一个Global.asax可以创建的调用列表,但我建议稍后再回顾一下,以便了解Web应用程序与桌面应用程序相比如何结束。 IIS可以回收一个AppPool作为结束应用程序的一种方式,尽管还有其他的方式,所以在应用程序结束时设置清理可能不是最好的主意,如果该事件永远不会触发。

+0

我读了这两个,但这些让我更加困惑。 在我看来,这些建议global.asax是唯一使用可以从任何会话或任何应用程序访问的存储变量。这是有用的,但不是我现在正在做的。我的印象是,global.asax可以创建线程来处理单个应用程序的启动和单个应用程序的结束。 – Dave 2009-08-06 18:35:09

+0

我想你可能会误解ASP.Net中Session和Application对象的使用。每个连接的用户都有一个会话,因此如果用户A有一个存储在会话对象中的变量,除了用户A以外,任何人都无法访问该变量。相比之下,应用程序对象是真正的全局性的,因为它只有一个服务器正在运行,因此必须小心使用它,就好像要将用户A的信息存储在Application对象中一样,必须使用某种标记键的方式,以便它对该用户是唯一的。你可以在ASP中的任何地方创建一个线程。净 – 2009-08-07 13:42:02

相关问题