내 asp.net 응용 프로그램에서 ThreadAbortException이 발생하는 이유는 무엇입니까?

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

  •  08-06-2019
  •  | 
  •  

문제

자명한 질문.

아무 문제가 없는데 왜 이것이 내 시도 캐치에 거품이 생기나요?

내 로그에 수백 번 나타나는 이유는 무엇입니까?

뉴비 질문인 건 알지만, 이 사이트가 검색 순위를 얻고 뉴비를 끌어들이려면 그들에게 물어봐야 합니다.

도움이 되었습니까?

해결책

이는 아마도 Response.Redirect 호출에서 발생하는 것 같습니다.설명을 보려면 다음 링크를 확인하세요.

http://dotnet.org.za/armand/archive/2004/11/16/7088.aspx

(대부분의 경우 Response.Redirect(url, false)를 호출하면 문제가 해결됩니다.)

다른 팁

ThreadAbortException이 발생하는 가장 일반적인 이유는 호출입니다. Response.End, Response.Redirect 또는 Server.Transfer.Microsoft는 해당 기능 대신 사용해야 하는 몇 가지 제안 기능을 게시했습니다.

다른 사람들이 말했듯이 이는 Response.End()를 호출할 때 발생합니다(false를 두 번째 매개변수로 전달하지 않고 Response.Redirect를 호출할 때 발생함).이는 설계된 대로 작동합니다.일반적으로 Response.Redirect를 호출하면 리디렉션이 즉시 발생하기를 원합니다.자세한 내용은 다음을 참조하세요.

Response.Redirect 및 ThreadAbortException

내부적으로 사용하는 API가 (적어도) 3개 있다는 것을 알고 있습니다. Thread.Abort, 이에 대해 어떻게 해야 할지 좀 더 실용적인 용어로 답변하고 싶습니다.

우리에게는 이 오류가 갑자기 기록되기 시작했습니다.무엇이 바뀌었나요?사이트맵을 처리하는 일부 데이터베이스 절차의 버그를 수정했습니다.

log4net 로그는 X-Forwarded-For 헤더(우리는 NLB 뒤에 있음)가 Googlebot의 IP 주소인 66.249.78.x임을 보여주었는데, 이는 Google이 우리 사이트를 보다 적극적으로 크롤링하여 이미지를 찾게 만드는 사이트맵 변경에 대한 내 이론을 뒷받침했습니다.

첫 번째는 왜 Googlebot만이 이 문제를 일으킬 수 있었는지 알아내는 것이었습니다.다른 클라이언트는 어떤 코드 경로를 사용하든 트리거하지 않았습니다. Response.Redirect, 또는 무엇이든.

그래서 HttpApplication.Error 처리기에서 모든 헤더와 대부분의 데이터가 포함된 추가 세부 출력을 기록하는 코드를 추가했습니다. HttpResponse 그리고 HttpContext 로그에 뿌렸습니다.

이를 통해 Googlebot이 iPhone 사용자 에이전트 문자열을 사용하고 이를 활용하여 문제가 발생했다는 점을 알 수 있었습니다. 코드베이스에서 "iPhone"을 검색하여 다음과 같은 결과를 얻을 수 있었습니다.

private void CheckIPhoneAccess() { ... }

그리고 리디렉션을 사용합니다.

어떻게 해야 할까요?

글쎄요, 이 오래된 코드베이스의 경우 모든 코드를 레트로 패치할 가치가 없습니다. Response.Redirect 호출이 있으므로 로깅 수준을 낮추겠습니다. ThreadAbortException 신청을 위해.

Googlebot 모바일 크롤러의 동작을 변경하겠습니다. ~ 아니다 우리 사이트는 첫 번째 히트 시에만 리디렉션하고 이후에는 쿠키를 읽고 이미지를 표시하기 때문에 우리 사이트가 모바일에 제공하는 것에 대한 '거짓말'로 이어집니다.Googlebot이 해당 쿠키를 캐시하지 않는 것 같습니다.

완벽하지는 않지만 사이트가 재구축될 예정입니다.아마도 다른 팀이 Scala 같은 것을 사용하고 있을 것입니다. 따라서 실용적인 측면에서는 이것이 좋은 선택이라고 생각합니다.의견을 추가하고 나중에 문제를 다시 검토하여 Response.SafeRedirect 이 조언을 캡슐화하는 확장 프로그램:

Response.Redirect가 System.Threading.ThreadAbortException을 발생시키는 이유는 무엇입니까?

루크

Response.Redirect가 이 예외를 발생시키는 이유는 asp.net이 Thread.Abort()를 사용하여 이 API를 내부적으로 구현하기 때문입니다.이 메서드가 호출되면 특별한 ThreadAbortException이 발생합니다. 이 예외는 catch 블록에서 처리되지 않습니다.각 catch 블록의 끝에서 다시 던져집니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top