Application_Start não está disparando?

143

Eu tenho um aplicativo ASP.NET MVC (beta) em que estou trabalhando e estou tendo problemas para descobrir se estou fazendo algo errado ou se meu Application_Start método no Global.asax.cs na verdade não está sendo acionado quando tento para depurar o aplicativo.

Coloquei um ponto de interrupção em uma linha no meu Application_Startmétodo e espero que, quando eu tentar depurar o aplicativo, o ponto de interrupção seja atingido ... mas nunca ocorre. Nem depois de redefinir o IIS, nem depois de reiniciar, nem sempre. Estou esquecendo de algo? Por que esse método nunca é chamado?

Bob Yexley
fonte
Sua página global.asax herda da classe global em que seu método está?
Eu entrei no caso em que o global.asaxarquivo estava simplesmente ausente. então isso também vale a pena conferir :-)
itsho 27/10/2015

Respostas:

85

Se estiver no IIS, o aplicativo poderá ser iniciado antes da conexão do depurador. Em caso afirmativo, não tenho certeza se você pode dormir o tempo suficiente para se conectar.

No Visual Studio, você pode anexar o depurador a um processo. Você pode fazer isso clicando em Debug >> Attach to process. Anexe ao navegador e, em seguida, clique no seu aplicativo. Para ser seguro, reinicie o IIS e acesse o site. Não estou 100% convencido de que isso resolverá o problema, mas será muito melhor do que disparar um sono de thread no App_Start.

Outra opção é hospedar temporariamente no servidor da Web incorporado até concluir a depuração do início do aplicativo.

Gregory A Beamer
fonte
21
para expandir - (no VS2010, usando o tipo de projeto MVC 3), clique com o botão direito do mouse em projeto da web> propriedades> web (guia) e verifique se "Usar o Visual Studio Development Server" está selecionado no botão de opção. Em seguida, os pontos de interrupção do Application_Start devem ser atingidos corretamente.
MemeDeveloper 5/10/11
Obrigado @MemoDeveloper !! É excelente !!
Praveen Prajapati
2
Ahhhhhh mannnnnnn, perdi algumas horas. Novamente!! Obrigado por esta resposta. :)
Samuel
Se você definir um ponto de interrupção no Visual Studio no Global.asax.cs em Application_Start () e ele não disparar, verifique seu tipo de compilação. Se você estiver executando como uma liberação, esse ponto de interrupção pode não ser acionado. Mude para Debug e deve parar.
Paul
171

Nota: uma boa alternativa fácil de usar o "Visual Studio Development Server" ou o IIS Express embutido (por exemplo, porque você está desenvolvendo no IIS e possui configurações específicas necessárias para o funcionamento adequado do seu aplicativo) é simplesmente continuar executando o IIS (I use o servidor da Web personalizado + entrada de arquivo hosts + ligação do IIS ao mesmo domínio)

  1. aguarde a sessão de depuração para iniciar ok
  2. faça uma edição de espaço em branco no web.config raiz e salve o arquivo
  3. atualize sua página (Ctrl + F5)

Seu ponto de interrupção deve ser atingido bem e você pode continuar depurando em seu habitat natural do IIS . Ótimo !

MemeDeveloper
fonte
Esta é uma brilhante conexão de reciclagem do AppDomain. Obrigado !!
precisa saber é o seguinte
Não há mais Visual Studio Development Server. stackoverflow.com/questions/19676527/…
mac10688
1
@ mac10688 true, mas ainda existe o "IIS Express", que geralmente ainda não é o ambiente de produção. Atualizado a resposta em conformidade, obrigado.
MemeDeveloper
Resposta definitiva aceita. Aponto para o meu IIS dispositivos que não permitirão a comunicação ao usar a edição do IIS Express! Isso funcionou um charme.
precisa
54

A seguir, ajuda em qualquer caso (não importa se você estiver usando o IIS, Cassini ou o que for):

  1. Defina seu ponto de interrupção em Application_Start
  2. Iniciar depuração (o ponto de interrupção provavelmente não é atingido) -> uma página é exibida no navegador
  3. Altere web.config (por exemplo, insira uma linha em branco) e salve-a
  4. Recarregue a página no navegador -> o ponto de interrupção foi atingido!

Por que isso funciona? Quando o web.config é alterado, o servidor da Web (IIS, Cassini etc.) faz uma reciclagem, mas nesse caso (por qualquer motivo), o processo permanece o mesmo, para que você se mantenha conectado ao depurador (Visual Studio )

Jochen Scharr
fonte
3
Clone, dois anos depois de stackoverflow.com/a/7655582/11635 - considerar a exclusão e colocar qualquer informação adicional em um comentário
Ruben Bartelink
na verdade, RubenBartelink, acho que essa resposta é mais clara que a outra, por causa da redação e explicações extras.
Heriberto Lugo
1
@HeribertoLugo Eu sou legal com isso - é difícil discordar totalmente de 50 votos (no entanto, eu ficaria encantado com edições na outra resposta para fechar a lacuna se alguém tiver tempo e contexto; já faz algum tempo desde que eu '' usei um depurador no IIS)!
Ruben Bartelink
eu concordo em editar o outro e remover este seria o melhor caminho .. eu vi o outro primeiro e o segui um pouco, por isso não funcionou .. quando eu vi esse depois de passar meia hora mais nele, então ele fez mais sentido .. isso é meia hora eu não necessidade de perder ..
Heriberto Lugo
22

Também estou tendo problemas com pontos de interrupção em application_start com o IIS, um aplicativo hospedado. Uma boa solução alternativa é usar Debugger.Break (); no código em vez do ponto de interrupção do VS

Flores
fonte
2
Eu acredito que não atingir o ponto de interrupção como algo relacionado à execução do pool de aplicativos no modo de pipeline integrado. Você está usando isso?
flores
9

Eu tenho apenas o mesmo problema. Renomei bastante na minha solução. Depois disso, obtive dois aplicativos da web que não estavam funcionando e vários outros aplicativos da web estavam bem. Eu recebi o erro de ter rotas erradas. Quando tentei configurar o ponto de interrupção no Application_Startmétodo e reinicie o IIS, o VS não interrompeu a execução. Com aplicações web viáveis, a quebra estava funcionando. Lembrei que "solução limpa" e "reconstruir" não excluem os assemblies que foram deixados após a renomeação. E isso foi solução! Eu limpei manualmente os bindiretórios dos meus aplicativos da web de buggy e vi um novo erro no Global.asax Inherits=""atributo que foi referenciado pela dll antiga. Eu mudei de novo e o intervalo começou a funcionar. Suponha que, durante a renomeação de Global.asax não tenha sido atualizado,

Dao
fonte
Uau, isso foi difícil de encontrar! Isso é pela dica!
Landon Poch 10/09
@Dao Realmente isto é incrível, Thanks;) Eu desperdiçado duas horas sobre isso, eu deveria ter encontrar a sua resposta antes :)
Pankaj Parkar
7

Tínhamos o mesmo problema em um projeto que assumimos depois que outro fornecedor o construiu. O problema era que, embora houvesse vários comandos escritos pelo fornecedor anterior no Global.asax.cs, o que poderia levar você a acreditar que estava em uso, na verdade estava sendo totalmente ignorado. O Global.asax não estava herdando dele, e é fácil nunca ver esse arquivo se o arquivo .cs estiver presente - você deve clicar com o botão direito do mouse em Global.asax e clicar em Exibir marcação para realmente vê-lo.

Global.asax:

<%@ Application Language="C#" %>

Precisava ser alterado para:

<%@ Application Codebehind="Global.asax.cs" Inherits="ProjectNamespace.MvcApplication" Language="C#" %>

Onde ProjectNamespace é qualquer que seja o namespace da sua classe Global.asax.cs (geralmente o nome do seu projeto).

No nosso caso, o arquivo continha vários códigos embutidos, alguns dos quais foram copiados e colados no arquivo .cs, outros não. Acabamos de despejar o código embutido no arquivo .cs e gradualmente incorporar nossas alterações.

Chris Moschini
fonte
Foi isso. Adicionei uma exceção ao início do aplicativo (conforme resposta do Prisioneiro ZERO) e ele não estava disparando, portanto, nada a ver com o depurador. A atualização da marcação Global.asax a corrigiu.
Patrick Borkowicz
5

Tente mudar o modo de pipeline gerenciado do pool de aplicativos para "Clássico" em vez de "Integrado". Isso resolveu o problema para mim. Olhando para a razão agora ...

(Os adereços para esta resposta pertencem a Flores (veja o comentário dele em sua própria resposta), eu só queria fornecer isso como uma resposta separada para chamar mais atenção)

Acezanne
fonte
Sim, funciona. Mas se você presumir que seu aplicativo deve funcionar no pool de aplicativos integrado, ele também deve ser depurado no pool integrado.
22412 Karel Kral
Meu aplicativo também não atingia pontos de interrupção depois de "F5" quando mudei de Clássico para Integrado. Você já descobriu o porquê? Não tenho nenhum requisito para usar o Integrated, mas é desanimador quando essas coisas não funcionam por nenhuma razão explicável.
CodexArcanum
5

Verifique se o arquivo global.asax não está em um subdiretório. Ele deve ser colocado no nível raiz no seu projeto.

homem das cavernas
fonte
Muito obrigado!!! Você me salvou de ficar louco! Isso foi exatamente o que estava causando o meu problema.
Yann Duran
1
Meu problema foi que acabei de criar uma classe chamada Global.asax.cse esperava que funcionasse. Você precisa criá-lo usando Add-> New Item-> Global Application Classpara que seja criado com o Global.asaxarquivo de configuração de formulários da web correspondente .
Levi Fuller
4

Tivemos um problema semelhante, em que global.asax.cs estava sendo ignorado.

Acontece que o site foi atualizado de um site .NET 2 pré-compilado para um site .NET 4.0. No servidor, o PrecompiledApp.configarquivo não havia sido excluído da pasta raiz. Após excluí-lo e reciclar o pool de aplicativos do IIS e tocar em web.config para reiniciar o aplicativo, o código no Global.asax.cs começou a funcionar bem.

Glen Little
fonte
3

Tive um problema uma vez em que o Global.asax e o Global.asax.cs não eram realmente copiados para a pasta IIS pelos scripts de implantação ... Portanto, funcionou durante a depuração no servidor de desenvolvimento, mas não no IIS.

Michael Angel
fonte
Eu tive o mesmo problema. depois que eu carreguei o Global.asax no servidor, o problema foi resolvido.
10892 Mosley Hady
3

Uma entrada tardia ...

Para testar se o Aplicativo IIS é iniciado ou não antes que o depurador tenha tempo suficiente para anexar, basta adicioná-lo à parte superior ou inferior do seu GLOBAL.ASAX Application_Start.

throw new ApplicationException("Yup, it fired");
Prisioneiro ZERO
fonte
2

Quando você diz "debug", você quer dizer realmente iniciar o aplicativo a partir do servidor da Web incorporado do Visual Studio para depuração, ou quer se associar ao processo no IIS? Se for o primeiro, você deve pressionar Application_Start, mas se for o segundo, pode ser difícil estar no processo com antecedência suficiente para detectá-lo.

Rex M
fonte
Correto, quero dizer iniciar o aplicativo do VS. Eu o tenho hospedado no IIS, então o VS está anexando a esse processo. Você está dizendo que o evento é acionado antes que o VS possa se conectar ao processo?
Bob Yexley
2

Feche o Visual Studio e exclua as pastas bine objno seu projeto da web (ou em todos os projetos da solução).

Aqui estão os comandos para excluir essas pastas de todos os seus projetos:

rm *\bin -r
rm *\obj -r
sparebytes
fonte
2

Eu fiz algumas alterações com base em "Análise de código na compilação" do Visual Studio. A análise de código sugeriu "CA1822 Marcar membros como estáticos" para Application_Start () no Global.asax. Eu fiz isso e acabei com esse problema.

Sugiro suprimir esta mensagem de análise de código e não alterar a assinatura dos métodos / classes criados automaticamente pela plataforma usada para inicializar o aplicativo. A assinatura do método Application_Start provavelmente não era estática por um motivo.

Voltei a esta assinatura de método e Application_Start () estava disparando novamente:

    protected void Application_Start()
    { ... }
toralux
fonte
2

Eu enfrentei esse problema ao usar uma página estática (por exemplo, index.html) como a página de inicialização - o Application-Start não é chamado. Descobri que exibir uma página estática não inicia o aplicativo. Solicitar uma página .aspx faz.

Senhor Cook
fonte
Foi isso que fez por mim. THX.
reekeecast 21/01/19
2

Verifique se os espaços para nome em Global.asax e Global.asax.cs são iguais. Se eles forem diferentes, não gerará nenhum erro, mas não atingirá o ponto de interrupção também porque não está executando o application_start.

Irfan
fonte
1

Acho que o evento de início do aplicativo só é acionado quando a primeira solicitação é feita. Você está acessando o site (por exemplo, está fazendo uma solicitação)?

ninj
fonte
Sim, estou fazendo uma solicitação ao aplicativo.
Bob Yexley
1

Eu tive esse problema em um projeto vs2010 de formulários da web .net 4 e tentei de tudo mencionado nesta página. Acabou removendo e adicionando global.asax realmente resolveu o problema para mim.

Wonster
fonte
1

Eu tinha o mesmo problema, não consegui pegar o Application_Start. E o motivo era que não estava disparando para um erro de correspondência no arquivo de marcação. O arquivo de marcação Global.asax estava herdando outra classe ...

lobiZoli
fonte
1

Você verificou as configurações do projeto? Eu tive esse problema e o URL de início foi para uma porta diferente da porta específica do servidor. Levei muito tempo para descobrir ...

D. Kermott
fonte
1

Depois de tentar tantas outras respostas aplicáveis ​​na minha situação e não ter sorte com nenhuma delas, entrei nas propriedades do projeto Web (o projeto do lado do servidor para um aplicativo Silverlight usando os Serviços RIA), clique no botão "Web" e alterou o servidor selecionado de "IIS local" para "IIS Express". (Observe que estou usando o VS2013.) Isso resolveu o problema. Application_Start é executado no "IIS Express", mas não no "IIS local". Interessante...

MylesRip
fonte
Está sendo executado. Você simplesmente não está conseguindo depurá-lo, pois não se conectou ao processo do IIS ou a ele depois que ele foi executado.
Uygar.raf 23/10/15
1

Eu estava tentando percorrer o código em RegisterRoutes () chamado desde o início do aplicativo e não atingindo meu ponto de interrupção. Eu determinei que Application_Start não estava sendo chamado. Eu tive que fazer uma alteração para fazer uma alteração superficial no App_start / RouteConfig.cs e salvá-lo antes que o Application_Start fosse chamado. Eu acho que esses arquivos são armazenados em cache em algum lugar e não são chamados, a menos que uma alteração seja feita.

Don Dillard
fonte
1

Meu mesmo problema foi resolvido adicionando referência de System.Web.Routingmontagem no projeto

insira a descrição da imagem aqui

Prakash Mhasavekar
fonte
0

Se você estiver usando o System.Diagnostics.Debugger.Break (); solução alternativa (que acho adequada para uso temporário) e "simplesmente não está funcionando" na sua máquina Windows 8. O motivo é um erro na depuração "Just in time" do Visual Studio.

A correção é a seguinte: corrigir a chave do "Depurador do Visual Studio Just-in-Time"

Abra o regedit e vá para HKEY_CLASSES_ROOT \ AppID {E62A7A31-6025-408E-87F6-81AEB0DC9347} para o valor do registro 'AppIDFlags', defina o sinalizador como 0x8

Mais informações aqui: http://connect.microsoft.com/VisualStudio/feedback/details/770786/just-in-time-debugging-operation-attempted-is-not-supported

ProVega
fonte
0

No meu caso, matar a instância interna do ASP.NET Development Server pela bandeja do sistema resolveu o problema.

Maciej
fonte
0

Coisas estranhas e loucas ... mas a depuração em uma máquina servidor e outro usuário deixaram o IIS Express em execução em sua sessão. Eu tive que fazer logoff desse usuário para matar seus processos em execução do IIS Express. Isso parece ter resolvido o problema!

Atualizar

Depois de passar mais de 1 hora perseguindo o que estava causando o problema ... eis o negócio: consegui digitar um sdentro da <appSettings>seção Web.config. O Visual Studio tentou me avisar na Error Listjanela com um aviso . Confesso que raramente verifique os avisos ... deve começar a verificar a partir de agora. : D Assim que removi a ofensa, so ponto de interrupção foi atingido Application_Start.

insira a descrição da imagem aqui

Leniel Maccaferri
fonte
0

Eu tive esse problema ao tentar inicializar o log4net. Eu decidi fazer apenas um construtor estático para o Global.asax

static Global(){
//Do your initialization here statically
}
Mark Procopio
fonte
0

O problema ocorre principalmente quando você tenta realocar o arquivo Global.asax para outro diretório de solução. Realoque o arquivo Global.asax novamente para o local padrão. Funcionará como esperado.

Arnab Chaudhuri
fonte
E se tudo no site for pré-compilado, incluindo Global.asax.aspx? Eu tenho arquivos pré-compilados no diretório bin. Application_Start não é acionado.
Vinh Shahrdar
0

Nenhuma das soluções descritas acima funcionou para mim. No entanto, reinstalar o pacote

Microsoft.CodeDom.Providers.DotNetCompilerPlatform 

usando nuget gui é uma solução alternativa (não muito legal)

Michele
fonte