2013-06-04 5 views
1

유지 관리 프로세스 중에 웹 응용 프로그램을 종료해야합니다. 이미 app_offline.htm을 루트 디렉토리에두고, 런타임을 비활성화하거나 서버를 통해 수동으로 비활성화하는 등 여러 가지 방법을 통해 이미 구현해야합니다. 이 과정을 완전히 자동화하는 것입니다.웹 응용 프로그램 종료

내가 가지고있는 것은 해당 날짜에 응용 프로그램을 종료해야하는지 여부와 해당 날짜에 대한 종료 및 플래그의 시작 날짜와 종료 날짜입니다.

이미 가지고있는 해결책은 root 디렉토리에서 app_offline.htm 파일을 생성하고 삭제하는 SQL Server 에이전트에서 작업을 생성하는 것이지만 문제는 내 루트 디렉토리에 대한 정적 경로를 제공해야한다는 것입니다. 내가 원하지 않는 응용 프로그램.

+0

어떤 IIS 버전을 사용하고 있습니까? 고정 경로를 제공하는 대신 정확한 경로를 얻기 위해 IIS를 검사 할 수 있습니다. – AlwaysAProgrammer

+0

나는 IIS 7.5를 사용하고 있는데, SQL Server에서 iis를 프로브해야하는데, 어떻게 수행 할 수 있는지 모르겠다. 가능한 한 나를 안내 해주십시오. –

+0

응용 프로그램 풀을 프로그래밍 방식으로 중지 할 수 있습니다. 그것이 귀하의 요구 사항인지 확실하지 않습니다. 응용 프로그램의 실제 경로를 얻으려면 내 대답을 참조하십시오. – AlwaysAProgrammer

답변

1

IIS의 사이트 관리를 위해 appcmd 명령 줄 유틸리티를 사용할 수 있습니다. 그것은 %systemroot%\system32\inetsrv\APPCMD에 있습니다. IIS v7 이상에서만 사용할 수 있다고 생각합니다. 이전 버전의 IIS를 사용하고 있는지 확실하지 않습니다. 중지하고 사이트를 시작하려면

,이 명령은 모양을 다음

%systemroot%\system32\inetsrv\APPCMD stop site <Your Site's Name> 

%systemroot%\system32\inetsrv\APPCMD start site <Your Site's Name> 
APPCMD 명령어 유틸리티에 대한

더 많은 정보는 여기에 있습니다 : 당신이 여기있는 http://www.iis.net/learn/get-started/getting-started-with-iis/getting-started-with-appcmdexe

0

한 가지 문제가 웹 응용 프로그램입니다 요청에 따라 작업하십시오. 당신은 요청을하고, 요청은 처리되고 반환됩니다. 따라서이 원칙에 의존하여 응용 프로그램을 종료해도 작동하지 않습니다. 필요한 것은 Application_Start에 데이터베이스의 값에 따라 자체적으로 구성하는 일부 유형의 스케줄러를 등록하는 것입니다. 어떤 스케줄링 메커니즘이 적절한 지 모르지만 Timer (가비지 수집으로 인해이 오브젝트에 대한 참조를 유지해야 함) 또는 System.Threading.Tasks namespace의 작업 스케줄러를 보길 원할 수 있습니다.

수업 선택에 문제가있을 수 있지만 이는 출발점 일 수 있습니다.

이제 결정을 내리면 완전히 피할 수 있습니다. 웹 응용 프로그램이 app_offline.html을 만들거나 파일 이름을 바꾸면 수동으로 파일을 제거해야 서버를 온라인 상태로 되돌릴 수 없습니다. 대신 데이터베이스를 쿼리하고 오프라인으로 전환하여 다시 온라인 상태로 되돌릴 수있는 유지 관리 Windows 서비스를 만드는 것이 어떻습니까? 자동으로 웹 응용 프로그램을 온라인 상태로 만드는 것에 신경 쓰지 않으면 자동으로 오프라인 상태로 만들지 않아도됩니다.

고려해야 할 또 다른 사항은 응용 프로그램이 오프라인 상태가되는 시간을 구성하는 데있어 사람이 실수하는 것입니다. 시간을 잘못 구성하면 응용 프로그램이 너무 빨리 또는 너무 늦게 종료 될 수 있습니다. 웹 응용 프로그램을 중단시키고 다시 가져올 수있는 일괄 스크립트 또는 PowerShell 스크립트를 만든 경우 더 쉽지 않을까요? PowerShell 스크립트를 사용하면 실제 위치를 지정하지 않고도 응용 프로그램에 대해 IIS를 쿼리 할 수 ​​있습니다.

1

이것은 실제 경로를 얻기 위해 IIS를 탐색하는 응답의 일부입니다. 약간의 조정이 필요할 수도 있습니다.

  //eg of site = 'Default Web Site' 
     //eg of Application = 'MySite' 
     var appName = "MySite"; 
     //Initializes a new instance of the ServerManager class by using the default path of the ApplicationHost.config file. 
     ServerManager mgr = new ServerManager(); 
     var applications = mgr.Sites.Cast<Site>().SelectMany(s => s.Applications); 

     var app = applications.SingleOrDefault(a => a.Path.Equals("/" + appName)); 

     IList<string> physicalPaths = app.VirtualDirectories.Cast<VirtualDirectory>().Select(v => v.PhysicalPath).ToList(); 

     //Calling dispose manually. Per MSDN, cannot wrap the ServerManager instance in 'Using' as it causes memory leaks 
     mgr.Dispose(); 

     //Releasing the reference to the Server Manager, per MSDN guidance 
     mgr = null; 
     return physicalPaths; 
+0

'mgr'은'using' 블록에 있어야하며'null'로 설정할 필요는 없습니다. –

+0

@ John MSDN 당, 사용중인 블록에서 관리자를 래핑하면 메모리 누수가 발생합니다 – AlwaysAProgrammer

+0

메모리 누수가 발생했다는 링크를 게시하십시오. Dispose는 똑같은 일을하기 때문에 이해가되지 않습니다. –