2013-08-20 2 views
0

Всякий раз, когда я обновляю свое веб-приложение в IIS, любой пользователь, который в настоящее время его использует, увидит, что страница не отвечает на запросы, и она не будет работать снова, пока они не обновят браузер. (Процесс обновления длится около 30 секунд)Как обнаружить, когда страница обновляется до IIS

Я бы хотел показать уведомление, такое как предупреждение javascript, для того, чтобы пользователь узнал, что страница обмазывается, и попробуйте обновить страницу через 30 секунд, и т. д.

Я попытался поймать исключение в Global.ascx, но в этом случае исключение не было.

+0

Проблема заключается в том, что сервер не реагирует на браузер. Попытка обнаружить это на сервере не помогла бы (почему бы это было быстрее). Вам нужно некоторое javascript-решение, которое может отображать что-то вроде «сервер медленно реагирует, пожалуйста, подождите некоторое время». –

+6

Что происходит, так это то, что веб-сервер перекомпилирует ваше приложение, поэтому ясно, что само приложение не может запускать серверный код, чтобы справиться с ним. –

+0

Я не возражаю, если это должен быть JavaScript или код, если они являются всплывающим msg. Не могли бы вы показать мне шаг за шагом о том, как это сделать? –

ответ

0

Вы можете создать FileSystemWatcher в global.ascx, затем закрасить (обновить 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/

+0

Просьба привести пример –

0

Рассмотрите возможность использования app_offline.htm. Это страница, которая заставит клиентов видеть ваше приложение IIS как нисходящее. Когда вы обновляете, просто удалите страницу.

0

Как большие мальчики делают это:

Вы должны иметь способ размещения оповещения на странице. Обычно это делается с помощью таблицы в вашей базе данных для этих предупреждений. В основном вы просто сохраняете какой-то текст там, например «эй, сайт идет на техническое обслуживание с 8:00 до 8:01 утра».

На каждой загрузке страницы вы проверяете эту таблицу и отображаете любые сообщения, найденные в заметное место (например, верх).

Перед тем, как нажать обновление, вы добавляете предупреждение, предоставляя им достаточно времени, чтобы завершить все, что они делают.

После завершения нажатия вы удалите таблицу предупреждений.

Честно говоря, основная проблема, которую вы имеете, - это просто одно из планирования обновлений и общения с пользователями, что должно произойти. Вы хотите сделать это таким образом, чтобы это не было неожиданностью. Тем не менее, вы можете подумать о включении флага optimizeCompilations, чтобы попытаться ускорить время компиляции вашего сайта, когда он впервые попал после нажатия обновления.