Quando um System.Web.HttpResponse.End ASP.NET () é chamado, o segmento atual é abortada?

StackOverflow https://stackoverflow.com/questions/365249

Pergunta

Quando um System.Web.HttpResponse.End () é chamado de System.Thread.Abort está sendo demitido, o que eu estou supondo que é (ou incêndios) uma exceção? Eu tenho algum registro e isso está sendo listado no arquivo de log ...

A primeira chance

exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll
12/14/2008 01:09:31::
Error in Path :/authenticate
Raw Url :/authenticate
Message :Thread was being aborted.
Source :mscorlib
Stack Trace :   at System.Threading.Thread.AbortInternal()
   at System.Threading.Thread.Abort(Object stateInfo)
   at System.Web.HttpResponse.End()
   at DotNetOpenId.Response.Send()
   at DotNetOpenId.RelyingParty.AuthenticationRequest.RedirectToProvider()
   at MyProject.Services.Authentication.OpenIdAuthenticationService.GetOpenIdPersonaDetails(Uri serviceUri) in C:\Users\Pure Krome\Documents\Visual Studio 2008\Projects\MyProject\Projects\Services\Authentication\OpenIdAuthenticationService.cs:line 108
   at MyProject.Mvc.Controllers.AuthenticationController.Authenticate() in C:\Users\Pure Krome\Documents\Visual Studio 2008\Projects\MyProject\Projects\MVC Application\Controllers\AuthenticationController.cs:line 69
TargetSite :Void AbortInternal()
A first chance exception of type 'System.Threading.ThreadAbortException' occurred in Ackbar.Mvc.DLL
An exception of type 'System.Threading.ThreadAbortException' occurred in Ackbar.Mvc.DLL but was not handled in user code

É este o comportamento normal e é possível graciosamente abort em vez de (o que parece ser) um abort abrupta repentina?

Atualização

Até agora, o censo comum que é por design . Então, eu estou querendo saber se é possível que poderia levar esta questão e ver se poderíamos ajustar o código para torná-lo não sinto que nós estamos terminando o segmento prematuramente e graciosamente saída ... Possível? exemplos de código?

Foi útil?

Solução

Sim, esta é realmente por design. Microsoft tem ainda documentado isto. Quanto mais você parar o resto do seu programa de execução?

Outras dicas

Não existe tal coisa como um abort "graciosa". Você poderia simplesmente flush () a resposta, porém, em vez de acabar com ela e deixar o quadro cuidar de fechar a conexão para você. Estou assumindo que, neste caso, que deseja que a resposta enviada para o cliente, ou seja, o caso típico.

De acordo com a MSDN , chamando Response .End () lança a ThreadAbortException quando a resposta termina prematuramente. Você realmente só deve chamar Response.End () quando você quer a exceção levantada.

Não há nada inerentemente deselegante sobre uma exceção recursivo até sua pilha para parar a execução atual. Certamente não mais do que você lançar uma exceção e captura-lo em algum lugar mais baixo na sua exceção.

Eu olhava para filtrá-la de seu registro. Se você estiver usando a saúde ASP.Net monitoramento Você pode configurar / mapear cada exceção a um determinado prestador (log de eventos, e-mail, etc) para controlar se você receber uma notificação para ThreadAbort exceções ou não. Se é log personalizado, em seguida, eu tinha acabado de adicionar um caso para verificar se há-lo.

Note que você não pode comer um ThreadAbortException por isso mesmo se o seu código de registro está fazendo algo como catch(Exception e) { // log exception and then do not throw again } o ThreadAbortException ainda será levantada novamente pela estrutura uma vez que suas saídas bloco catch.

Não use método Response.End () porque ele usa Application.End () e interromper o aplicativo. Pedido de mais uso HTTP ou resposta violar página do Ciclo de Vida. Use HttpContext.Current.Response.Close () ou HttpContext.Current.ApplicationInstance.CompleteRequest ();

Eu usei todas as alterações acima, mas ainda eu estava ficando mesmo problema no meu aplicativo web.

Em seguida, entrei em contato com a minha hospedagem fornecer e pediu-lhes para verificar se algum software ou antivírus bloqueando nossos arquivos para transferência via HTTP. ou ISP / rede não está permitindo que arquivo para transferir.

Eles checaram as configurações do servidor e de desvio do "Centro Firewall Shared Data" para o meu servidor e agora o nosso aplicativo foi iniciado para baixar o arquivo.

Hope esta resposta vai ajudar someone.This é o que funcionou para mim

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