ASP.net响应。在FileSystemWatcher事件上重定向

ASP.net响应。在FileSystemWatcher事件上重定向,asp.net,filesystemwatcher,Asp.net,Filesystemwatcher,我无法在新的FileSystemWatcher事件上使用Response.Redirect(或Response.Write) protected void Page_Load(object sender, EventArgs e) { RunFolderListener(); } private void RunFolderListener() { FileSystemWatcher fsw = new FileSystemWatcher(); fsw.P

我无法在新的FileSystemWatcher事件上使用Response.Redirect(或Response.Write)

protected void Page_Load(object sender, EventArgs e)
{
   RunFolderListener();
}

private void RunFolderListener()
{
        FileSystemWatcher fsw = new FileSystemWatcher();
        fsw.Path = Server.MapPath("~/uploaded_images/");
        fsw.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite |
                           NotifyFilters.DirectoryName | NotifyFilters.FileName;
        fsw.Changed += new FileSystemEventHandler(OnChanged);
        fsw.EnableRaisingEvents = true;
}

    private void OnChanged(object source, FileSystemEventArgs e)
    {
        Response.Redirect(....); //not working
        Response.Write (....);//not working

    }

恐怕这是行不通的--文件夹观察程序事件不属于页面生命周期的一部分--您通常会运行一些其他线程或任务来处理FSW,然后将您的状态持久化到某个位置。那么你可以说

protected void Page_Load(object sender, EventArgs e)
{
   if (myState.FileIngested) {
      Response.Redirect(....);
      Response.End();
   }
}

希望这对你有所帮助你想要的是不可能的。
FileSystemWatcher
事件由与页面线程不同的线程处理。为了说明这一点:

Page thread: |-Page_Load----...----Page_Unload-|
                 |-Start FSW
FSW thread :     |-----------------------------...--------FSW.OnChanged(...)---|
Page\u Load
中的某个地方,启动了
FileSystemWatcher
。页面生命周期以
page_UnLoad
结束,运行页面生命周期的线程返回到线程池。更重要的是,页面已呈现并完成,不能再进行任何更改

在稍后的某个时刻,可能是一秒钟,可能是十分钟,
FileSystemWatcher
生成一个事件。该页面很久以前就由浏览器呈现了,因此,当调用
Response.Redirect
时,您认为应该发生什么?由于响应已发送到浏览器,因此不会发生任何事情


此外,这最终会造成内存问题。每次请求此页面时,都会创建一个新的
FileSystemWatcher
。观察者必须维护对页面的引用,因为它必须在事件发生时调用事件处理程序。因此,页面和观察者都不能被垃圾收集。因此,每次请求此页面时,您都会实例化该页面和一个占用少量内存且从未回收的观察程序。

正如其他人所提到的,您希望执行的操作是不可能的。但是,您可以通过以下方式创建类似效果:

  • 在Global.asax的应用程序启动事件中创建新的FileSystemWatcher
  • 对于FileSystemWatcher OnChange事件,让它使用包含所需信息的对象(即LastChangeDateTime)更新缓存变量(即缓存[“UploadedImagesChanged”])
  • 在您的ASPX页面上,添加一个隐藏值以保存页面内数据的时间戳(即HiddenField_LastUpdated.value=DateTime.Now.ToString())
  • 在页面\u加载中,将当前HiddenField \u LastUpdate与缓存[“UploadedImagesChanged”]LastChangeDateTime进行比较。如果缓存的日期较新,则响应。重定向用户

  • 您还可以考虑添加一个ASP:计时器到页面和一些更新面板,如果您想让页面轮询服务器来检查更新。

    是您曾经调用的Onchange方法吗?实际上我尝试创建这个机制(FSW)。为了捕获Flash事件:用户单击我的页面上的Flash按钮上载文件。上载文件时,将调用aspx页面(图像通过表单提交到此页面)。我无法在该页面上使用重定向,因此我尝试改用FSW。因为我无法修改Flash-我需要另一种解决方案来更改Flash事件上的页面位置。我不确定我是否理解为什么不能在您将图像发布到的aspx页面上使用重定向?图像提交到的页面不是带有Flash obje的页面ct.如果这是一个同步表单提交(不是一些Ajax提交),你应该能够在你发布到的页面中进行重定向。你从哪里发布并不重要。这是我开始的地方,但由于重定向在页面上不起作用,所以图像被提交到我开始寻找替代解决方案(FSW…)。由于重定向不起作用,我是否应该假设Flash正在使用Ajax submit?重定向的其他解决方案,或者只能由Flash对象启动?由于Flash部分不是我编写的,我宁愿使用asp.net解决方案,而不是尝试修改它。FileSystemWatcher仅在页面加载后创建事件,因为是启动文件上载的页面本身(使用其中的Flash对象。请参阅我对Ronald Wildenberg的评论),因此页面加载将永远不会捕获此事件。另一方面,使用asp:Timer(我实际上从未遇到过)可能是一个解决方案(不是最优雅的解决方案,但我认为它应该可以工作)。我正在尝试使用asp:Timer,这可能是一个解决方案。问题是会导致Flash对象重新加载每个勾号,从而使其无法使用。如果将计时器放在其自己的UpdatePanel中,则不会影响页面上的Flash对象。此外,请确保页面上的任何其他UpdatePanel都设置为有条件更新。G我打了一枪。