성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <div style='font-family: 맑은 고딕, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>IIS Express를 NT 서비스로 변경</div> <br /> 지난번 글에서, IIS Express를 이용하여 서비스할 수 있는 기본 조건을 살펴보았습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > IIS Express - localhost 이외의 호스트 이름으로 접근하는 방법 ; <a target='_tab' href='http://www.sysnet.pe.kr/2/0/1030'>http://www.sysnet.pe.kr/2/0/1030</a> </pre> <br /> 하지만 아직 한 가지가 더 남았지요? 예를 들어, "IIS"처럼 "IIS Express"를 사용하기 위해서는 시스템 시작 시 구동되는 동작이 가능해야 합니다. 즉, "NT 서비스" 형식이어야 합니다.<br /> <br /> 현재, "iisexpress.exe"는 스스로 "NT 서비스"로 동작되는 방법은 제공하지 않기 때문에 직접 만들어야 합니다. 대략 3가지 방법이 떠오르는 군요.<br /> <br /> <ul> <li><a target='tab' href='https://github.com/winsw/winsw'>일반 EXE를 NT 서비스로 실행시켜 주는 공개 프로그램</a>을 사용</li> <li>작업 스케쥴러에 등록</li> <li>iisexpress를 제어하는 전용 NT 서비스 프로그램을 제작</li> </ul> <br /> 저는 개발자이므로, ^^ 여기서는 IIS Express를 위한 전용 NT 서비스를 만드는 방법에 대해 살펴보겠습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> C#의 "Windows Service" 유형으로 새로운 프로젝트를 만들면 거의 완료된 것이나 다름없습니다.<br /> <br /> 기본 제공되는 뼈대에 OnStart/OnStop이 제공되는데요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > protected override void OnStart(string[] args) { } protected override void OnStop() { } </pre> <br /> 우선, OnStart부터 살펴볼까요?<br /> <br /> 서비스를 시작한다는 것은 "iisexpress /config:..." 명령어를 실행하는 것으로 해결될 수 있습니다. 따라서 다음과 같은 순서로 코드를 만들어가면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > string filePath = @"C:\Program Files\IIS Express\iisexpress.exe"; string configPath = @"C:\temp\web\applicationHost.config"; ProcessStartInfo procInfo = new ProcessStartInfo(); procInfo.FileName = filePath; procInfo.Arguments = "/config:\"" + configPath + "\""; Process process = Process.Start(procInfo); </pre> <br /> 끝이군요. ^^ 단지 iisexpress.exe가 위치한 폴더를 하드 코딩하는 것을 레지스트리를 통해서 읽어내도록 하는 개선만 하면 될 것 같습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > // x64의 경우, @"SOFTWARE\Wow6432Node\Microsoft\IISExpress\7.5" string regPath = @"SOFTWARE\Microsoft\IISExpress\7.5"; try { RegistryKey regKey = Registry.LocalMachine.OpenSubKey(regPath); return regKey.GetValue("InstallPath") as string; } catch (Exception ex) { System.Diagnostics.Trace.WriteLine(ex.ToString()); } </pre> <br /> <br /> 문제는 OnStop입니다. 현재 공식적으로 IIS Express를 종료하는 방법은 해당 프로세스가 실행된 명령행 윈도우에서 'Q' 키를 누르는 방법밖에 없습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > C:\Program Files (x86)\IIS Express>iisexpress /config:c:\temp\web\applicationHost.config Starting IIS Express ... Failed to add localhost binding to binding ':8500:' Successfully registered URL "http://*:8500/" for site "Development Web Site" application "/" Registration completed for site "Development Web Site" IIS Express is running. Enter 'Q' to stop IIS Express </pre> <br /> NT 서비스가 실행해 주기 때문에 세션의 차이로 인해 데스크톱에 나타나지도 않는 명령행 창에 'Q' 키를 입력하는 방법은 묘연합니다. ^^ 사실, 'Q' 키를 에뮬레이트 한다고 해도 그다지 'professional'하지 않습니다.<br /> <br /> 그냥, Process를 Terminate 하는 것도 어쩌면 좋은 방법일지 모릅니다. 그런데 분명 'Q' 키를 누를 때는 '우아한 종료'를 위한 작업이 이뤄지는 것만큼은 분명한 것 같습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Enter 'Q' to stop IIS Express <b style='COLOR: blue'>Stopping IIS Express ...</b> IIS Express stopped. </pre> <br /> 고민이군요. IIS 7을 기준으로 검색해 보니 appcmd를 이용하는 방법이 제공됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Start or Stop a Web Site (IIS 7) ; <a target='_tab' href='https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc772137(v=ws.10)'>https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc772137(v=ws.10)</a> appcmd stop site /site.name:contoso </pre> <br /> 아쉽게도, IIS Express에 포함된 appcmd.exe는 "stop site" 명령을 제공하지 않습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 이런 경우, MSDN 문서에 아직은 빈약하게 소개된 <a target='_tab' href='https://learn.microsoft.com/en-us/iis/extensions/express-api-reference/version-manager-api-iis-express'>Version Manager API (IIS Express)</a>를 사용하면 되는데, 이 중에서 iisexpress 종료를 할 수 있는 COM 개체가 바로 IIISExpressProcessUtility입니다. 이에 대해서는 다음의 글에서 설명해 두었으니 참고하십시오.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > IISExpress - "IIS Installed Versions Manager Interface"의 IIISExpressProcessUtility 구하는 방법 ; <a target='_tab' href='http://www.sysnet.pe.kr/2/0/1031'>http://www.sysnet.pe.kr/2/0/1031</a> </pre> <br /> 그래서 IIISExpressProcessUtility의 "void StopProcess(uint dwPid);" 메서드를 호출하면 되는데, 호출 결과가 다소 실망스럽습니다. 아래는 이미 실행 중인 iisexpress.exe에 대해 StopProcess로 종료한 것을 보여줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > C:\Program Files (x86)\IIS Express>iisexpress Starting IIS Express ... Successfully registered URL "http://localhost:8081/" for site "ManagementWeb" ap Registration completed for site "ManagementWeb" IIS Express is running. Enter 'Q' to stop IIS Express C:\Program Files (x86)\IIS Express> </pre> <br /> 뭔가 차이가 느껴지시나요? 정상적으로 'Q' 키를 눌러서 종료한 경우에는 원래 다음과 같은 문구가 뜹니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Enter 'Q' to stop IIS Express <b style='COLOR: blue'>Stopping IIS Express ... IIS Express stopped.</b> </pre> <br /> 과연... IISExpressProcessUtility.StopProcess 메서드가 단순히 TerminateProcess Win32 API를 부른 것에 불과한지? 'Q' 키 종료와 동일한데 메시지가 없는 것인지? 에 대해서는 알 수 없으나,,, 어느 방법을 쓰던지 선택은 여러분들의 몫입니다. ^^<br /> <br /> 이렇게 해서 OnStart/OnStop에서 구현되어야 할 코드가 완료되었군요. 이제는 예의 NT 서비스와 다름없이 등록해 주고 사용하면 끝!<br /> <br /><br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
6852
(왼쪽의 숫자를 입력해야 합니다.)