Pergunta

Eu trabalho em uma faculdade e têm vindo a desenvolver um site ASP.NET com muitos, muitos relatórios sobre os alunos, estatísticas de atendimento ... A base para os dados é um servidor de DB MSSQL que é o back-end para o nosso sistema de gestão de estudante . Isto tem um período de manutenção regular na quinta-feira de manhã por um período de tempo desconhecido (dependente do que tem que ser feito).

A maioria dos funcionários estão cientes disso, mas os usuários menos regulares parecem estar sempre a tocar-me. Qual é a maneira mais fácil de desativar o site durante a manutenção, obviamente, eu só posso tentar uma consulta DB para testar se ele é para cima, mas tenho certeza da melhor forma de, por exemplo, redirecionamento todos os usuários a um "O site está em manutenção" mensagem, tendo em mente que eles poderiam ter iniciado uma sessão prévia para o site indo para baixo.

Esperamos que algo pode ser implementado globalmente em vez de por página.

Foi útil?

Solução

Eu sugeriria fazê-lo em Application_PreRequestHandlerExecute em vez de depois de ocorrer um erro. Geralmente, seria melhor não entrar processamento normal, se você sabe que seu banco de dados não está disponível. Eu normalmente uso algo como abaixo

void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
{
 string sPage = Request.ServerVariables["SCRIPT_NAME"];
 if (!sPage.EndsWith("Maintenance.aspx", StringComparison.OrdinalIgnoreCase))
 {
  //test the database connection
  //if it fails then redirect the user to Maintenance.aspx
  string connStr = ConfigurationManager.ConnectionString["ConnectionString"].ConnectionString;
  SqlConnection conn = new SqlConnection(connStr);
  try
  {
   conn.Open();
  }
  catch(Exception ex)
  {
   Session["DBException"] = ex;
   Response.Redirect("Maintenance.aspx");
  }
  finally
  {
   conn.Close();
  }
 }
}

Outras dicas

Gota um arquivo HTML chamado "app_offline.htm" na raiz do seu diretório virtual. Simples como isso.

Scott Guthrie sobre o assunto e amigável erros.

Você pode exibir uma mensagem para as pessoas que se conectaram em dizer "o site estará em manutenção em minutos xxx", em seguida, executar um serviço para registrar todos para fora após minutos de xxx. Em seguida, defina a algum lugar flag que cada página de acesso a lata, e no topo de cada página (ou apenas a página template) você testar se esse sinalizador é definido, se for, enviar um cabeçalho de redirecionamento para um site está em página de manutenção.

O que acontece agora, quando o site está em baixo e alguém tenta atingi-lo? Faz ADO.NET lançar uma exceção específica você pode pegar e, em seguida, redirecionar para o "website down" página?

Você pode adicionar um arquivo "Global.asax" para o projecto, e em seu código-behind adicionar um manipulador de eventos "Application_Error". Seria dispara sempre que uma exceção é lançada e vai uncaught, de qualquer lugar em seu aplicativo web. Por exemplo, em C #:

protected void Application_Error(object sender, EventArgs e)
{
    Exception e = Server.GetLastError().GetBaseException();
    if(e is SqlException)
    {    
        Server.ClearError();
        Server.Transfer("~/offline.aspx");
    }
} 

Você também pode verificar a propriedade Número de exceção, embora eu não tenho certeza de qual número (s) indicaria que era incapaz de se conectar ao servidor de banco de dados. Você pode testar isso enquanto é baixo, encontrar o número de erro SQL e procurá-lo on-line para ver se é especificamente o que você realmente quer ser a verificação de.

EDIT:. Eu vejo o que você está dizendo, petebob

A página "offline.html" não vai funcionar se o usuário já estava navegando dentro do site, ou se ele está acessando o site a partir de um link de marcador / externo para uma página específica.

O uso solução I é criar um segundo site com o mesmo endereço (IP ou host cabeçalho (s)), mas tê-lo desabilitado por padrão. Quando o site está em baixo, um script desativa o "real" web site e permite que o website "manutenção" em seu lugar. Quando se trata de volta online, outro script muda de volta para o "real" web site.

A "manutenção" web site está localizado em um diretório raiz diferente, com uma única página com a mensagem (e quaisquer imagens requeridas / css)

Para ter a mesma mensagem mostrada em qualquer página, a "manutenção" web site está configurado com um manipulador de erro 404 que irá redirecionar qualquer solicitação para mesmo o "site está em manutenção" página.

Uma versão ligeiramente mais elegante do cheque DB em cada página seria fazer o check-in o arquivo Global.asax ou para criar uma página mestra que todas as outras páginas herdam.

A sugestão de ter um site on-line e um site off-line é realmente bom, mas realmente só se aplica se você tem um número limitado de locais para gerir no servidor.

EDIT: Droga, as outras respostas com estas sugestões surgiu depois que eu carregar a página. I precisa se lembrar de atualizar antes de responder:)

James esquece de código para fechar a ligação, provavelmente deve ser:

try
{
   conn.Open();
}
catch(Exception ex)
{
   Session["DBException"] = ex;
   Response.Redirect("Maintenance.aspx");
}
finally
{
   conn.Close();
}

Obrigado pelas respostas até agora gostaria de salientar que eu não sou o único que faz a manutenção nem tenho acesso o tempo todo para IIS. Além disso, eu prefiro opções de onde eu não fazem nada como como todos os programadores que eu sou um pouco preguiçoso.

Eu sei que é uma maneira de verificar uma bandeira em cada página, mas eu estou esperando para evitá-lo. Eu não poderia fazer algo com a página global.asax, na verdade, eu acho postagem se envolveu meu cérebro:

Pense eu poderia colocar em Application_BeginRequest um pouco de código para verificar o estado de SQL, em seguida, redirecionar:

HttpContext context = HttpContext.Current;
     if (!isOnline())
     {
        context.Response.ClearContent();
        context.Response.Write("<script language='javascript'>" + 
"top.location='" + Request.ApplicationPath + "/public/Offline.aspx';</scr" + "ipt>");
     } 

Ou algo assim pode não ser perfeito ainda não testado como eu não estou no trabalho. Comentários apreciado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top