Hoje, criamos um aplicativo de console para executar as tarefas agendadas em nosso site ASP.NET. Mas acho que essa abordagem é um pouco propensa a erros e difícil de manter. Como você executa sua tarefa agendada (em um ambiente Windows / IIS / ASP.NET)
Atualizar:
Exemplos de tarefas:
- Enviando email de uma fila de email no banco de dados
- Removendo objetos desatualizados do banco de dados
- Recuperando estatísticas do Google AdWords e preencha uma tabela no banco de dados.
asp.net
windows
iis
scheduled-tasks
Niels Bosma
fonte
fonte
Respostas:
Todas as minhas tarefas (que precisam ser agendadas) para um site são mantidas no site e chamadas a partir de uma página especial. Em seguida, escrevi um serviço simples do Windows que chama essa página de vez em quando. Depois que a página é executada, ele retorna um valor. Se eu sei que há mais trabalho a ser feito, eu corro a página novamente, imediatamente, caso contrário eu corro daqui a pouco. Isso funcionou muito bem para mim e mantém toda a minha lógica de tarefas com o código da web. Antes de escrever o serviço simples do Windows, usei o agendador do Windows para chamar a página a cada x minutos.
Outra maneira conveniente de executar isso é usar um serviço de monitoramento como o Pingdom . Aponte a verificação http para a página que executa seu código de serviço. Faça com que a página retorne resultados que podem ser usados para acionar o Pingdom para enviar mensagens de alerta quando algo não estiver certo.
fonte
Essa técnica de Jeff Atwood para Stackoverflow é o método mais simples que já encontrei. Ele se baseia no mecanismo de retorno de chamada "item de cache removido" incorporado ao sistema de cache do ASP.NET
Atualização: o Stackoverflow superou esse método. Funciona apenas enquanto o site está sendo executado, mas é uma técnica muito simples que é útil para muitas pessoas.
Verifique também o Quartz.NET
fonte
No, we’ve switched to a dedicated task. We definitely outgrew this technique. I do think it’s fine for small sites though!
- Jeff AtwoodCrie um serviço personalizado do Windows .
Eu tinha algumas tarefas críticas configuradas como aplicativos de console agendados e achava difícil mantê-las. Criei um serviço do Windows com um 'batimento cardíaco' que verificaria uma agenda no meu banco de dados a cada dois minutos. Funcionou muito bem.
Dito isto, ainda uso aplicativos de console agendados para a maioria das minhas tarefas de manutenção não críticas. Se não estiver quebrado, não conserte.
fonte
Eu achei isso fácil para todos os envolvidos:
Usando essa metodologia, toda a lógica de negócios está contida no aplicativo da Web, mas você tem a confiabilidade do gerenciador de tarefas do Windows ou de qualquer outro gerenciador de tarefas comercial para iniciar e registrar qualquer informação de retorno, como um relatório de execução. Usar um serviço da Web em vez de postar em uma página tem uma vantagem, porque é mais fácil obter dados de retorno de um serviço da Web.
fonte
Por que reinventar a roda, use as classes Threading e Timer.
fonte
Use o Windows Scheduler para executar uma página da web.
Para impedir que o usuário malicioso ou as aranhas do mecanismo de pesquisa executem, quando você configura a tarefa agendada, basta chamar a página da Web com uma string de consulta, ou seja: mypage.aspx? From = scheduletask
Em seguida, no carregamento da página, basta usar uma condição: if (Request.Querystring ["from"] == "scheduletask") {// executetask}
Dessa forma, nenhum mecanismo de busca ou usuário mal-intencionado poderá executar sua tarefa agendada.
fonte
Request.IsLocal
>> apenas o próprio servidor pode executar as tarefas agendadas, mais ninguém.Esta biblioteca funciona como um encanto http://www.codeproject.com/KB/cs/tsnewlib.aspx
Ele permite que você gerencie tarefas agendadas do Windows diretamente através do seu código .NET.
fonte
Além disso, se seu aplicativo usa o SQL SERVER, você pode usar o SQL Agent para agendar suas tarefas. É aqui que geralmente colocamos códigos recorrentes que são orientados por dados (lembretes por email, manutenção agendada, limpezas, etc ...). Um ótimo recurso incorporado ao SQL Agent são as opções de notificação de falha, que podem alertá-lo se uma tarefa crítica falhar.
fonte
Não sei ao certo que tipo de tarefas agendadas você quer dizer. Se você quiser coisas como tarefas a cada hora, atualize foo.xml, use o sistema Tarefas agendadas do Windows. (O comando "at" ou por meio do controlador.) Execute um aplicativo de console ou solicite uma página especial que inicie o processo.
Editar: devo acrescentar que esta é uma maneira OK de também executar o aplicativo IIS em pontos agendados. Portanto, suponha que você queira verificar seu banco de dados a cada 30 minutos e enviar lembretes por e-mail aos usuários sobre alguns dados, você pode usar tarefas agendadas para solicitar esta página e, portanto, obter o IIS processando as coisas.
Se suas necessidades forem mais complexas, considere criar um serviço do Windows e executá-lo em um loop para fazer o processamento necessário. Isso também tem o benefício de separar o código para fins de dimensionamento ou gerenciamento. No lado negativo, você precisa lidar com os serviços do Windows.
fonte
Se você possui o servidor, use o agendador de tarefas do Windows. Use AT /? na linha de comando para ver as opções.
Caso contrário, em um ambiente baseado na Web, talvez você precise fazer algo desagradável, como configurar uma máquina diferente para fazer solicitações para uma determinada página em um intervalo de tempo.
fonte
Eu usei o Abidar com sucesso em um projeto ASP.NET (aqui estão algumas informações básicas ).
O único problema com esse método é que as tarefas não serão executadas se o aplicativo Web do ASP.NET for descarregado da memória (ou seja, devido ao baixo uso). Uma coisa que tentei é criar uma tarefa para acessar o aplicativo da Web a cada 5 minutos, mantendo-o ativo, mas isso não parecia funcionar de maneira confiável, então agora estou usando o agendador do Windows e o aplicativo básico do console para fazer isso.
A solução ideal é criar um serviço do Windows, embora isso possa não ser possível (por exemplo, se você estiver usando um ambiente de hospedagem compartilhado). Isso também facilita um pouco as coisas da perspectiva da manutenção para manter as coisas dentro do aplicativo da web.
fonte
Aqui está outra maneira:
1) Crie um script da web de "pulsação" que seja responsável por iniciar as tarefas se elas estiverem DEVIDAS ou atrasadas para serem ativadas.
2) Crie um processo agendado em algum lugar (de preferência no mesmo servidor da web) que atinja o script da web e o force a executar em um intervalo regular. (por exemplo, o Windows agenda tarefas que silenciosamente iniciam o script heatbeat usando IE ou whathaveyou)
O fato de o código da tarefa estar contido em um script da Web é apenas para manter o código dentro base de código do aplicativo da Web (a suposição é de que ambos dependem um do outro), o que seria mais fácil para os desenvolvedores da Web gerenciarem .
A abordagem alternativa é criar um script / programa de servidor executável que faça todo o agendamento funcionar sozinho e execute o executável como uma tarefa agendada. Isso pode permitir a dissociação fundamental entre o aplicativo Web e a tarefa agendada. Portanto, se você precisar que suas tarefas agendadas sejam executadas mesmo que o aplicativo / banco de dados da web esteja inativo ou inacessível, siga essa abordagem.
fonte
Você pode criar facilmente um Serviço do Windows que executa o código em intervalos usando o método 'ThreadPool.RegisterWaitForSingleObject'. É realmente liso e muito fácil de configurar. Esse método é uma abordagem mais simplificada do que usar qualquer um dos Timers no Framework.
Dê uma olhada no link abaixo para obter mais informações:
Executando um processo periódico no .NET usando um serviço do Windows:
http://allen-conway-dotnet.blogspot.com/2009/12/running-periodic-process-in-net-using.html
fonte
Também usamos aplicativos de console. Se você usar ferramentas de log como o Log4net, poderá monitorar adequadamente sua execução. Além disso, não tenho certeza de como eles são mais difíceis de manter do que uma página da Web, pois você pode compartilhar algumas das mesmas bibliotecas de código entre as duas, se ela tiver sido projetada corretamente.
Se você é contra a execução periódica dessas tarefas, você pode ter uma página da web na seção administrativa do site que atua como uma fila. O usuário solicita a execução da tarefa, insere um registro de carimbo de data / hora em branco na tabela MyProcessQueue e sua tarefa agendada verifica todos os X minutos para um novo registro em MyProcessQueue. Dessa forma, ele só é executado quando o cliente deseja que ele seja executado.
Espero que essas sugestões ajudem.
fonte
Uma opção seria configurar um serviço do Windows e fazer com que ele chamasse sua tarefa agendada.
Nas winforms que usei Timers, não acho que isso funcionaria bem no ASP.NET
fonte
Uma nova biblioteca de classes do Agendador de tarefas para .NET
Nota: Desde que essa biblioteca foi criada, a Microsoft introduziu um novo agendador de tarefas (Task Scheduler 2.0) para Windows Vista. Esta biblioteca é um invólucro para a interface do Agendador de Tarefas 1.0, que ainda está disponível no Vista e é compatível com o Windows XP, Windows Server 2003 e Windows 2000.
http://www.codeproject.com/KB/cs/tsnewlib.aspx
fonte