每当我在 IIS 上更新我的 Web 应用程序时,当前使用它的任何用户都会看到该页面没有响应,并且在他们刷新浏览器之前它不会再次工作。(更新过程持续约 30 秒)
我想显示一个通知,例如 javascript 警报,让用户知道页面正在更新,请尝试在 30 秒后刷新页面等。
我试图在 Global.ascx 中捕获异常,但在这种情况下没有引发异常。
大男孩如何做到这一点:
您需要有一种在页面上发布警报的方法。通常这是通过在数据库中为这些警报创建一个表来完成的。基本上,您只是在其中存储一些文本,例如“嘿,该站点将在上午 8:00 到上午 8:01 之间进行维护”..
在每次页面加载时,您都会检查该表并显示在显眼位置(如顶部)找到的任何消息。
在推送更新之前,您添加警报,同时给他们足够的时间来总结他们正在做的任何事情。
推送完成后,您清除警报表。
老实说,您遇到的主要问题只是安排更新和与用户沟通即将发生的事情之一。你想以一种并不令人惊讶的方式这样做。也就是说,您可以考虑启用optimizeCompilations标志,以便在推送更新后首次点击网站时尝试加快网站的编译时间。
考虑使用app_offline.htm。该页面会导致客户端将您的 IIS 应用程序视为已关闭。当您完成更新时,只需删除该页面。
您可以在 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/