2012-03-20 4 views
3

Мы динамически загружаются сборки при запуске и при добавлении их в качестве ссылки:Очистка файлов температуры ASP.NET по применению перезапустить

BuildManager.AddReferencedAssembly(assembly); 

Приложение поддерживает установку новых плагинов во время выполнения. Следуя действию установки/удаления, мы перезапускаем веб-приложение. Я пробовал:

HostingEnvironment.InitiateShutdown(); 

и

System.Web.HttpRuntime.UnloadAppDomain(); 

Однако, новая версия плагина не загружается - я считаю, что это происходит из-за того, как ASP.NET агрессивно кэшировать ссылки сборки - особенно ASP Контроллеры .NET MVC.

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

Как мы можем принудительно очистить файлы temp asp.net, либо программно, либо используя событие post build?

Одним из решений является «прикосновение» к global.asax, но это кажется немного взломанным для меня.

+0

Мы сделали что-то подобное и в конце концов обосновался на: http://stackoverflow.com/questions/407713/how-to-restart-asp-net-application-besides-modifying-web-config – dash

ответ

1

Я использовал следующий фрагмент кода для сброса пула приложений по требованию. (Просто подключите это к Action Controller).

Примечание: поскольку это пул приложений, вы можете проверить влияние на другие приложения, запущенные в том же пуле приложений.

public class IisManager 
{ 
    public static string GetCurrentApplicationPoolId() 
    { 
     // Application is not hosted on IIS 
     if (!AppDomain.CurrentDomain.FriendlyName.StartsWith("/LM/")) 
      return string.Empty; 
     // Application hosted on IIS that doesn't support App Pools, like 5.1 
     else if (!DirectoryEntry.Exists("IIS://Localhost/W3SVC/AppPools")) 
      return string.Empty; 

     string virtualDirPath = AppDomain.CurrentDomain.FriendlyName; 
     virtualDirPath = virtualDirPath.Substring(4); 
     int index = virtualDirPath.Length + 1; 
     index = virtualDirPath.LastIndexOf("-", index - 1, index - 1); 
     index = virtualDirPath.LastIndexOf("-", index - 1, index - 1); 
     virtualDirPath = "IIS://localhost/" + virtualDirPath.Remove(index); 
     var virtualDirEntry = new DirectoryEntry(virtualDirPath); 
     return virtualDirEntry.Properties["AppPoolId"].Value.ToString(); 
    } 


    public static void RecycleApplicationPool(string appPoolId) 
    { 
     string appPoolPath = "IIS://localhost/W3SVC/AppPools/" + appPoolId; 
     var appPoolEntry = new DirectoryEntry(appPoolPath); 
     appPoolEntry.Invoke("Recycle"); 
    } 

    public static void RecycleApplicationPool(string appPoolId, string username, string password) 
    { 
     string appPoolPath = "IIS://localhost/W3SVC/AppPools/" + appPoolId; 
     var appPoolEntry = new DirectoryEntry(appPoolPath, username, password); 
     appPoolEntry.Invoke("Recycle"); 
    } 

} 

Переопределенный метод для удовлетворения тех случаев, когда вы хотите явно передать пользователь с правами администратора на машине/сервере, который размещен экземпляр IIS.

И действие контроллера может быть чем-то вроде;

public string ResetAppPool() 
    { 
     var appPoolId = IisManager.GetCurrentApplicationPoolId(); 
     if (appPoolId.Equals(string.Empty)) 
      return "Application is not running inside an App Pool"; //May be not IIS 6 onwards 
     try 
     { 
      IisManager.RecycleApplicationPool(appPoolId); //Can only be used by Admin users 
      return string.Format("App pool {0} recycled successfully", appPoolId); 
     } 
     catch (Exception ex) 
     { 
      Logger.Error("Failed to recycle app pool : " + ex.StackTrace); 
      return string.Format("App pool {0} recycle failed", appPoolId); 
     } 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^