Como posso obter ASP.NET para reiniciar quando um arquivo é alterado?

votos
1

Tenho uma aplicação ASP.NET que é parte de um sistema muito maior; ele lê a maior parte de sua configuração de arquivos que estão acima do nível de raiz da aplicação web.

Como o aplicativo já está escrito e o formato dos arquivos de configuração foi escolhida para facilitar a edição por clientes que não podem fazer uso da solução em “arquivos de configuração compartilhados em .NET”.

Estou esperando ASP.NET tem uma API que pode chamar no momento da inicialização para dizer-lhe qual arquivo para assistir. (Eu poderia escrever isso da maneira mais difícil usando um “FileSystemWatcher” e captura de eventos, em seguida, fazendo o reinício me, no entanto, que seria uma pena como ASP.NET já tem o código para assistir a ficheiros e reiniciar quando eles são alterados.)

Também o API ASP.NET faço para ligar para obter ASP.NET para reiniciar em uma maneira agradável?

Estes são alguns links que eu encontrei que podem ajudar: Usando o FileSystemWatcher de ASP.NET e Estendendo FileSystemWatcher para ASP.NET


Em um caso I em cache a configuração no cache ASP.NET e definir um CacheDependency para o arquivo. No outro caso que precisava de um acesso mais rápido, eu usei um FileSystemWatcher e atualizado um campo estático quando a configuração alterada.

(Eu nunca fiz descobrir como reiniciar ASP.NET a partir do código de uma forma razoável.)

Publicado 19/05/2009 em 15:49
fonte usuário
Em outras línguas...                            


5 respostas

votos
4

  static FileSystemWatcher ConfigWatcher;

  static void StartWatchConfig() {

     ConfigWatcher = new FileSystemWatcher("configPath") {
        Filter = "configFile"
     };

     ConfigWatcher.Changed += new FileSystemEventHandler(ConfigWatcher_Changed);
     ConfigWatcher.EnableRaisingEvents = true;
  }

  static void ConfigWatcher_Changed(object sender, FileSystemEventArgs e) {
     HttpRuntime.UnloadAppDomain();
  }
Respondeu 06/10/2011 em 20:16
fonte usuário

votos
4

Se você sabe que seu aplicativo nunca vai acessar a configuração fora de uma HttpContext, considere cache sua configuração e adicionando um CacheDependency para o arquivo. Se o arquivo for alterado, a configuração do cache é removido e você pode adicioná-lo novamente com os valores atualizados.

Algo como:

public MyConfigObj GetConfig()
{
    var config = Cache["configkey"] as MyConfigObj;
    if(config == null)
    {
        var configPath = Server.MapPath("myconfigpath");
        config = GetConfigFromFile(configPath);
        Cache.Insert("configkey", config, new CacheDependency(configPath));
    }
    return config;
}
Respondeu 19/05/2009 em 16:19
fonte usuário

votos
1

Para a segunda parte, você pode usar o seguinte pedaço de código para acionar uma reciclagem AppPool (que é o mesmo que IIS reiniciar, apenas em nível de aplicativo em vez de todo o servidor).

using System.DirectoryServices;

public void RecycleAppPool(string machine, string appPoolName) 
{
    string path = "IIS://" + machine + "/W3SVC/AppPools/" + appPoolName;
    DirectoryEntry w3svc = new DirectoryEntry(path);
    w3svc.Invoke("Recycle", null);
}

(a partir de aqui )

Respondeu 27/08/2009 em 10:06
fonte usuário

votos
-1

resposta estúpida, talvez, mas você sempre pode 'tocar' (adicionar algum espaço em branco ou algo assim) seu arquivo web.config e que irá desencadear um reinício. É iisreset do homem pobre =)

(Eu quero mais uma vez salientar que esta não é uma solução ideal para reinício geral de sites ou redefinir IIS)

Respondeu 20/05/2009 em 05:30
fonte usuário

votos
-1

Eu acho que você vai precisar para criar um serviço que usa FileSystemWatcher para monitorar mudanças nos arquivos de configuração fora do diretório do aplicativo web - e então, quando for detectada uma alteração, faça uma alteração não significativa para web.config do aplicativo web arquivo e salvá-lo, o que irá reiniciar o aplicativo.

Respondeu 19/05/2009 em 16:18
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more