2009-10-29 4 views
4

며칠 동안 잘 작동하지만 임의로 일부 데이터베이스 연결 문자열 예외를 throw하고 결과적으로 0 개의 레코드가 테이블에 나열되는 ASP.net 웹 응용 프로그램이 있습니다 (수백을 보여 주어야한다). 나는 많은 시간을 디버깅하는데 많은 시간을 보냈다. 메모리는 괜찮다. 데이터베이스가 존재하고 응용 프로그램을 재활용하게 만드는 모든 것을함으로써 고쳐졌다. 재현하기까지 몇 일을 기다려야합니다.programatically 동일한 풀에서 asp.net 응용 프로그램의 풀 재활용

0 레코드가 없어야한다는 것을 알기 때문에 생각하고있었습니다. 웹 응용 프로그램을 실행하는 응용 프로그램 풀이 (이 데이터베이스 예외 또는 0 레코드를 얻을 때) 어떻게 강제로 재생할 수 있습니까? 최소한이 방법으로 웹 사이트는 다음 사용자를 위해 작동하므로 수동으로 다시 시작할 필요가 없습니다.

답변

3

안녕하세요이 문서에서 당신은 또한

Restart IIS application pool from ASP.NET page

using System; 
using System.Web; 
using System.Web.UI; 
using System.Management; 
using System.DirectoryServices; 
using System.Web.UI.WebControls; 

public partial class iis : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Response.Write(System.Environment.MachineName); 
     status(); 
    } 

    protected void status() 
    { 
     string appPoolName = "dev.somesite.com"; 
     string appPoolPath = @"IIS://" + System.Environment.MachineName + "/W3SVC/AppPools/" + appPoolName; 
     int intStatus = 0; 
     try 
     { 
      DirectoryEntry w3svc = new DirectoryEntry(appPoolPath); 
      intStatus = (int)w3svc.InvokeGet("AppPoolState"); 
      switch (intStatus) 
      { 
       case 2: 
        lblStatus.Text = "Running"; 
        break; 
       case 4: 
        lblStatus.Text = "Stopped"; 
        break; 
       default: 
        lblStatus.Text = "Unknown"; 
        break; 
      } 
     } 
     catch (Exception ex) 
     { 
      Response.Write(ex.ToString()); 
     } 
    } 
    protected void stopAppPool(object sender, EventArgs e) 
    { 
     Button btn = (Button)sender; 
     string appPoolName = btn.CommandArgument; 
     string appPoolPath = @"IIS://" + System.Environment.MachineName + "/W3SVC/AppPools/" + appPoolName; 
     try 
     { 
      DirectoryEntry w3svc = new DirectoryEntry(appPoolPath); 
      w3svc.Invoke("Stop", null); 
      status(); 
     } 
     catch (Exception ex) 
     { 
      Response.Write(ex.ToString()); 
     } 
    } 

    protected void startAppPool(object sender, EventArgs e) 
    { 
     Button btn = (Button)sender; 
     string appPoolName = btn.CommandArgument; 
     string appPoolPath = @"IIS://" + System.Environment.MachineName + "/W3SVC/AppPools/" + appPoolName; 
     try 
     { 
      DirectoryEntry w3svc = new DirectoryEntry(appPoolPath); 
      w3svc.Invoke("Start", null); 
      status(); 
     } 
     catch (Exception ex) 
     { 
      Response.Write(ex.ToString()); 
     } 
    } 
} 
+0

동일한 응용 프로그램 풀에서 호출하는 경우이 기능이 작동합니까? – Tuviah

+0

@Tuviah : 코드를 실행 해보시겠습니까? 실행중인 동일한 응용 프로그램 풀에 동일한 작업을 수행해야합니다. – Tarik

+1

@ P.s : 동일한 응용 프로그램 풀에서 작동하지 않는 경우 다른 응용 프로그램 풀에서 실행되는 페이지를 만들고 해당 페이지를 실행하여 원하는 응용 프로그램 풀을 재생할 수 있습니다. 작업을 처리하는 별도의 작업자와 같습니다. – Tarik

2

내가 때문에 복잡성이 솔루션과 완전히 편안 적이 없습니다 Asp.net에서 응용 프로그램 풀을 다시 시작 관련 코드를 찾을 수 있지만, 보안 요구 사항이 명확하지 않기 때문에 (이 경우 응용 프로그램 사용자에게 권한을 부여해야한다면 이는 또 다른 구성 단계 일뿐만 아니라 보안 위험이기 때문에 응용 프로그램 사용자가 응용 프로그램 풀을 재활용 할 수있는 권한을 갖는 것처럼 보입니다 무차별 적으로, 특히 네트워크를 통해, 레버리지가 될 수있다. DOS 공격에서 ged).

내가 제한된 상황에서 재시작으로 해결할 수 있었지만 실행 중 감지 할 수 있었지만 아직 더 맛있는 코드 변경을 막을 수는 없었으며 많은 연구 끝에 몇 가지를 경험했습니다. 다른 솔루션 (OK-해킹)을 수행하십시오. 1. 새로 생성 된 스레드 인 2. Environment.Exit() 및 3. System.Web.HttpRuntime.UnloadAppDomain()에 처리되지 않은 예외를 발생시킵니다. 이것들은 진행중인 모든 요청을 종료하는 다소 불쾌한 부작용을 가지는데, 이는 끔찍한 해킹이지만, 경우에 따라 (조건에 의해 어쨌든 대다수의 요청이 올바르게 처리되지 않는 경우와 같이) 용인 될 수 있습니다.

System.Web.Hosting.HostingEnvironment.InitiateShutdown(); 

내 테스트는 를 정확히 않는다는 것을 보여 주었다 : 나는 최근 훨씬 간단하고 완전히 WMI을 방지이 작은 보석을 우연히 발견 될 때까지

이 해킹에 대한 혐오 년 동안 나와 함께 남아있다 내가 필요한 것, 그리고 나는 그것이 당신이 원했던 것이라고 믿습니다. 문서에 따르면, 그것은 .NET 2.0 이래로 주변에 있었지만, 며칠 전까지는 내 연구에서 그것을 결코 발견하지 못했습니다.

관련 문제