programing

응답 이유.리디렉션으로 인해 시스템이 발생합니다.스레드화.스레드 중단 예외?

lastcode 2023. 5. 7. 11:30
반응형

응답 이유.리디렉션으로 인해 시스템이 발생합니다.스레드화.스레드 중단 예외?

응답을 사용할 때.양식을 새 페이지로 리디렉션하려면 리디렉션(...) 다음 오류가 발생합니다.

의 첫 입니다.System' 유형의 첫 번째 기회 예외입니다.mscorlib에서 'threadAbortException'이(가) 했습니다.
입니다.System' 유형의 예외입니다.에서 'threadAbortException이(가) .'ThreadAbortException'(으) mscorlib입니다.dll에서 발생했지만 사용자 코드에서 처리되지 않았습니다.

이것에 대한 제 이해는 웹 서버가 response.redirect가 호출된 페이지의 나머지 부분을 중단함으로써 오류가 발생하고 있다는 것입니다.

두 는 두번매변다추수있습다니가할음에에 할 수 .Response.RedirectendResponse 고다니합라이를 response다니.endResponse 로 True 설 정 하 면 류 로 False 않 지 하 습 만 니 가 생 속 지 다 발 그 계 렇 면 하 정 오 설 를 response ▁if 로 ▁true ▁but 니 습 않 다 ▁the ▁i 지 ▁true end ▁error ▁end 렇 ▁if ▁to ▁not 하하지만 그것은 웹 서버가 제가 리디렉션한 페이지의 나머지 부분을 실행하고 있다는 것을 의미합니다.최소한으로 표현하기에는 비효율적인 것 같습니다.이것을 하는 더 좋은 방법이 있습니까? 것른것이 아닌 다른 것.Response.Redirect할 수 있는 ?ThreadAbortException?

올바른 패턴은 endResponse= false로 Redirect 오버로드를 호출하고 제어를 반환하면 EndRequest 단계로 바로 이동해야 한다고 IIS 파이프라인에 알리는 전화를 거는 것입니다.

Response.Redirect(url, false);
Context.ApplicationInstance.CompleteRequest();

Thomas Marquardt의 이 블로그 게시물은 Application_Error 처리기 내에서 리디렉션되는 특수한 경우를 처리하는 방법을 포함하여 추가 세부 정보를 제공합니다.

단순하고 우아한 솔루션은 없습니다.RedirectASP의 문제입니다.Net 웹 양식.더티 솔루션과 더티 솔루션 중 하나를 선택할 수 있습니다.

더티:Response.Redirect(url)" " "라는 메시지를 .ThreadAbortedException현재 스레드를 종료합니다.따라서 Redirect()-call 이후에는 코드가 실행되지 않습니다.例단:를 죽이는 을 미칩니다.이러한 스레드를 죽이는 것은 잘못된 관행이며 성능에 영향을 미칩니다.또한.ThreadAbortedExceptions예외 로깅에 표시됩니다.

지루함:권장되는 방법은 전화하는 것입니다.Response.Redirect(url, false)그리고 나서.Context.ApplicationInstance.CompleteRequest()그러나 코드 실행은 계속되고 페이지 수명 주기의 나머지 이벤트 핸들러는 여전히 실행됩니다. (예: Page_Load에서 리디렉션을 수행하면 나머지 핸들러가 실행될 뿐만 아니라 Page_PreRender 등도 호출됩니다. 렌더링된 페이지는 브라우저로 전송되지 않습니다.페이지에 플래그를 설정하는 등의 방법으로 추가 처리를 피할 수 있으며, 처리를 수행하기 전에 후속 이벤트 처리기가 이 플래그를 확인하도록 할 수 있습니다.

문서의 내용은 다음과 같습니다.)CompleteRequest"ASP를 일으킵니다.HTTP 파이프라인 실행 체인의 모든 이벤트필터링을 바이패스하는 NET".이것은 쉽게 오해받을 수 있습니다.추가 HTTP 필터 및 모듈을 바이패스하지만 현재 페이지 수명 주기의 추가 이벤트는 바이패스하지 않습니다.)

더 깊은 문제는 WebForms가 추상화 수준이 부족하다는 것입니다.이벤트 핸들러에 있을 때는 이미 출력할 페이지를 작성하는 중입니다.다른 페이지를 생성하기 위해 부분적으로 생성된 페이지를 종료하기 때문에 이벤트 핸들러에서 리디렉션하는 것은 보기 흉합니다.뷰와 에 이 에 단순히 "를.RedirectAction보기를 생성하지 않고 컨트롤러에 있습니다.

제가 늦었다는 것은 알지만, 이런 오류가 발생한 적은 단 한 번도 없었습니다.Response.Redirect에 있습니다.Try...Catch블록으로 막다

응답을 입력하지 않습니다.시도로 리디렉션...블록을 잡습니다.그것은 나쁜 습관입니다.

응답을 입력하는 대신 사용할 수 있습니다.시도...로 리디렉션캐치 블록, 방법/기능을 두 단계로 나눕니다.

  1. 시도 안에...캐치 블록은 요청된 액션을 수행하고 액션의 성공 또는 실패를 나타내는 "결과" 값을 설정합니다.

  2. 시도 밖에서...캐치 블록은 "결과" 값에 따라 리디렉션(또는 리디렉션하지 않음)합니다.

이 코드는 완벽과는 거리가 멀고 테스트하지 않았기 때문에 복사해서는 안 됩니다.

public void btnLogin_Click(UserLoginViewModel model)
{
    bool ValidLogin = false; // this is our "result value"
    try
    {
        using (Context Db = new Context)
        {
            User User = new User();

            if (String.IsNullOrEmpty(model.EmailAddress))
                ValidLogin = false; // no email address was entered
            else
                User = Db.FirstOrDefault(x => x.EmailAddress == model.EmailAddress);

            if (User != null && User.PasswordHash == Hashing.CreateHash(model.Password))
                ValidLogin = true; // login succeeded
        }
    }
    catch (Exception ex)
    {
        throw ex; // something went wrong so throw an error
    }

    if (ValidLogin)
    {
        GenerateCookie(User);
        Response.Redirect("~/Members/Default.aspx");
    }
    else
    {
        // do something to indicate that the login failed.
    }
}

Response.Redirect()예외를 던져 현재 요청을 중단합니다.

이 KB 문서에서는 이 동작에 대해 설명합니다.Request.End()그리고.Server.Transfer()방법)을 선택합니다.

위해서Response.Redirect()오버로드가 있습니다.

Response.Redirect(String url, bool endResponse)

endResponse=false를 전달하면 예외가 발생하지 않습니다(그러나 런타임은 현재 요청을 계속 처리합니다).

endResponse=true(또는 다른 오버로드가 사용되는 경우)인 경우 예외가 발생하고 현재 요청이 즉시 종료됩니다.

다음은 문제에 대한 공식 라인입니다(최신 버전을 찾을 수는 없지만 이후 버전의 .net에 대해서는 상황이 바뀌지 않았다고 생각합니다).

이것이 바로 방법입니다.Response.Redirect(url, true)효과가 있습니다. 그것은 그것을 던집니다.ThreadAbortException스레드를 중단합니다.▁you▁. (당신이 보는 인 것 (당신이 본 곳은 글로벌 오류 처리기/로거인 것 같습니다.)

관련된 흥미로운 토론이 유해하다고 간주됩니까?

또한 다른 솔루션을 시도해 보았지만 리다이렉트 후 일부 코드가 실행되었습니다.

public static void ResponseRedirect(HttpResponse iResponse, string iUrl)
    {
        ResponseRedirect(iResponse, iUrl, HttpContext.Current);
    }

    public static void ResponseRedirect(HttpResponse iResponse, string iUrl, HttpContext iContext)
    {
        iResponse.Redirect(iUrl, false);

        iContext.ApplicationInstance.CompleteRequest();

        iResponse.BufferOutput = true;
        iResponse.Flush();
        iResponse.Close();
    }

따라서 리디렉션 후 코드 실행을 방지해야 하는 경우

try
{
   //other code
   Response.Redirect("")
  // code not to be executed
}
catch(ThreadAbortException){}//do there id nothing here
catch(Exception ex)
{
  //Logging
}

저는 스레드에서 수동으로 중단을 수행할 경우를 대비하여 이것을 피하려고도 했지만, 오히려 "CompleteRequest"로 남겨 두고 계속 진행합니다. 어쨌든 제 코드는 리디렉션 후에 반환 명령을 가집니다.그래서 이것은 할 수 있습니다.

public static void Redirect(string VPathRedirect, global::System.Web.UI.Page Sender)
{
    Sender.Response.Redirect(VPathRedirect, false);
    global::System.Web.UI.HttpContext.Current.ApplicationInstance.CompleteRequest();
}

제가 하는 일은 이 예외를 다른 가능한 예외와 함께 잡는 것입니다.이것이 누군가에게 도움이 되기를 바랍니다.

 catch (ThreadAbortException ex1)
 {
    writeToLog(ex1.Message);
 }
 catch(Exception ex)
 {
     writeToLog(ex.Message);
 }

저도 그런 문제가 있었어요.

사용해 보십시오.Server.TransferResponse.Redirect

나를 위해 일했습니다.

언급URL : https://stackoverflow.com/questions/2777105/why-response-redirect-causes-system-threading-threadabortexception

반응형