0

每当我在 IIS 上更新我的 Web 应用程序时,当前使用它的任何用户都会看到该页面没有响应,并且在他们刷新浏览器之前它不会再次工作。(更新过程持续约 30 秒)

我想显示一个通知,例如 javascript 警报,让用户知道页面正在更新,请尝试在 30 秒后刷新页面等。

我试图在 Global.ascx 中捕获异常,但在这种情况下没有引发异常。

4

3 回答 3

0

大男孩如何做到这一点:

您需要有一种在页面上发布警报的方法。通常这是通过在数据库中为这些警报创建一个表来完成的。基本上,您只是在其中存储一些文本,例如“嘿,该站点将在上午 8:00 到上午 8:01 之间进行维护”..

在每次页面加载时,您都会检查该表并显示在显眼位置(如顶部)找到的任何消息。

在推送更新之前,您添加警报,同时给他们足够的时间来总结他们正在做的任何事情。

推送完成后,您清除警报表。

老实说,您遇到的主要问题只是安排更新和与用户沟通即将发生的事情之一。你想以一种并不令人惊讶的方式这样做。也就是说,您可以考虑启用optimizeCompilations标志,以便在推送更新后首次点击网站时尝试加快网站的编译时间。

于 2013-08-21T20:51:51.280 回答
0

考虑使用app_offline.htm。该页面会导致客户端将您的 IIS 应用程序视为已关闭。当您完成更新时,只需删除该页面。

于 2013-08-20T18:16:17.690 回答
0

您可以在 global.ascx 中创建一个FileSystemWatcher然后在更新文件时冒泡(例如更新 js)一个异常。你可以从这个开始:

using System.IO;

namespace WebApplication1
{
    public class Global : System.Web.HttpApplication
    {
        FileSystemWatcher watcher;

        void Application_Start(object sender, EventArgs e)
        {
            // Code that runs on application startup
            watcher = new FileSystemWatcher(this.Context.Server.MapPath("/"));
            watcher.Changed += new FileSystemEventHandler(watcher_Changed);
        }

        void watcher_Changed(object sender, FileSystemEventArgs e)
        {
            //set a value in js file
            FileInfo jsFilesChanged = new FileInfo(Path.Combine(this.Context.Server.MapPath("/"), "scripts", "files_changed.js"));
            using (StreamWriter jsWriter = (!jsFilesChanged.Exists) ? new StreamWriter(jsFilesChanged.Create()) : new StreamWriter(jsFilesChanged.FullName, false))
            {
                jsWriter.WriteLine("var changed_file = \"" + e.Name + "\";");
            }
        }

        //.......
    }
}

然后在客户端代码中包含files_changed.js并创建一个定期超时调用来检查var changed_file. 另外,请确保watcher不会收集垃圾。

一些参考资料:http: //msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

http://www.developerfusion.com/article/84362/extending-filesystemwatcher-to-aspnet/

于 2013-08-20T18:13:15.047 回答