성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Reordering on an Alpha processor ;...
[정성태] 공유 감사합니다. ^^ 참고로, WPF에서 WindowsF...
[Tom Lee] 답변 감사합니다. 나름의 해결책 연구해보고 여기에도 공유해봅니다...
[정성태] 아래의 글을 보면, MoveWindow 하면 될 듯한데요. ^^...
[Tom Lee] 안녕하세요 올려주신 글 참고하여 WPF 어플리케이션 안에 Uni...
[정성태] A graphical depiction of the steps ...
[정성태] 질문을 주셔서 출판사 측에 문의를 했습니다. 약 한 달 정도 후...
[Thorondor
] @정성태 개인 블로그인데도 거의 커뮤니티 급 인 것 같아요. 요...
[정성태] Roll A Lisp In C - Reading ; https...
[정성태] Java - How to use the Foreign Funct...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>.NET Core/5+에서는 구할 수 없는 HttpRuntime.AppDomainAppId</h1> <p> AppDomainAppId는 System.Web.dll에 포함된 <a target='tab' href='https://docs.microsoft.com/en-us/dotnet/api/system.web.httpruntime'>System.Web.HttpRuntime</a>의 정적 속성으로,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > HttpRuntime.AppDomainAppId Property ; <a target='tab' href='https://docs.microsoft.com/en-us/dotnet/api/system.web.httpruntime.appdomainappid'>https://docs.microsoft.com/en-us/dotnet/api/system.web.httpruntime.appdomainappid</a> </pre> <br /> IIS w3wp.exe에서 호스팅되는 경우 다음과 같은 유형으로 (AppPool이 아닌) 웹 애플리케이션의 고유 경로를 반환합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > /LM/W3C/<site id>/<servicename> </pre> <br /> 물론 다른 호스팅 환경에서는 저게 별 의미가 없지만, 그래도 IIS에서 활성화되는 경우라면 AppPool은 환경 변수를 통해 구할 수 있고, 그 AppPool에 활성화되는 Web Application의 고유 경로를 구할 수 있으므로 .NET Core/5+ 환경에서도 나름 의미가 있습니다.<br /> <br /> 문제는, HttpRuntime 클래스 자체가 오직 .NET Framework에서만 사용할 수 있다는 점입니다. .NET Core/5+에서는 BCL에서 누락됐으므로 당연히 그것과 관련된 모든 멤버를 사용할 수 없습니다. 이에 대해 아래의 답글을 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > AppDomainAppId in .NET Core? ; <a target='tab' href='https://stackoverflow.com/questions/52891211/appdomainappid-in-net-core'>https://stackoverflow.com/questions/52891211/appdomainappid-in-net-core</a> </pre> <br /> <a target='tab' href='https://referencesource.microsoft.com/#System.Web/HttpRuntime.cs'>HttpRuntime.cs</a> 소스 코드로부터 AppDomainAppId의 값을 구하는 방법이 나옵니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > _appDomainAppId = GetAppDomainString(<span style='color: blue; font-weight: bold'>".appId"</span>); public static String AppDomainAppId { get { return _theRuntime._appDomainAppId; } } private static String GetAppDomainString(String key) { Object x = <span style='color: blue; font-weight: bold'>Thread.GetDomain().GetData(key);</span> return x as String; } </pre> <br /> AppDomain 컨텍스트에 ".appId"라는 키로 값이 보관돼 있군요. 그나저나... 그럼 이 값은 언제 설정이 되는 걸까요? 아쉽게도 이것은 추적이 되지 않습니다. 나름대로 조사를 해봤는데, ".appId" 값이 설정되는 시기는 "PipelineRuntime.InitializeApplication" 호출이었는데요, 이때의 호출 스택을 보면 .NET Framework이 아닌 Native DLL에서 호출되고 있습니다. <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > > System.Web.dll!System.Web.Hosting.PipelineRuntime.InitializeApplication(System.IntPtr appContext) Unknown Non-user code. Skipped loading symbols. [AppDomain Transition] Annotated Frame [Native to Managed Transition] Annotated Frame webengine4.dll!W3_MGD_APP_CONTEXT::InitializeMgdApplication(void) Unknown Non-user code. Symbols loaded. webengine4.dll!W3_MGD_APP_CONTEXT::OnApplicationResolveModules(class IHttpApplicationResolveModulesProvider *,void *) Unknown Non-user code. Symbols loaded. webengine4.dll!CMgdEngGlobalModule::OnGlobalApplicationResolveModules(class IHttpApplicationResolveModulesProvider *) Unknown Non-user code. Symbols loaded. iiscore.dll!W3_SERVER::GlobalNotify() Unknown Non-user code. Symbols loaded. iiscore.dll!W3_APPLICATION::ResolveModules(void) Unknown Non-user code. Symbols loaded. iiscore.dll!W3_APPLICATION::SetupNotificationContext() Unknown Non-user code. Symbols loaded. iiscore.dll!W3_CONTEXT::SetupStateMachinePhase2() Unknown Non-user code. Symbols loaded. iiscore.dll!W3_CONTEXT::SetupStateMachine() Unknown Non-user code. Symbols loaded. iiscore.dll!W3_MAIN_CONTEXT::OnNewRequest() Unknown Non-user code. Symbols loaded. w3dt.dll!UL_RECEIVE_CONTEXT::DoWork() Unknown Non-user code. Symbols loaded. w3dt.dll!WP_CONTEXT::OnCompletion(unsigned long,unsigned long,struct _OVERLAPPED *) Unknown Non-user code. Symbols loaded. w3tp.dll!THREAD_POOL_DATA::ThreadPoolThread(void) Unknown Non-user code. Symbols loaded. w3tp.dll!THREAD_POOL_DATA::ThreadPoolThread() Unknown Non-user code. Symbols loaded. w3tp.dll!THREAD_MANAGER::ThreadManagerThread() Unknown Non-user code. Symbols loaded. kernel32.dll!BaseThreadInitThunk() Unknown Non-user code. Symbols loaded. ntdll.dll!RtlUserThreadStart() Unknown Non-user code. Symbols loaded. </pre> <br /> 아마도 webengin4.dll이나 iiscore.dll 측에서 이미 AppDomain의 ".appId"를 설정하는 것으로 보입니다.<br /> <br /> 그 외에도 추적해 보면 System.Web.Hosting.ProcessHost.StartApplication 메서드가 불릴 때도 appId에 "/LM/W3C/<site id>/<servicename>" 형식의 ID 값이 전달되는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // System.Web!System.Web.Hosting.ProcessHost public void StartApplication(<span style='color: blue; font-weight: bold'>string appId</span>, string appPath, out object runtimeInterface) { // ...[생략]... IApplicationHost applicationHost = this.CreateAppHost(appId, appPath); LockableAppDomainContext lockableAppDomainContext = this._appManager.GetLockableAppDomainContext(appId); // ...[생략]... } </pre> <br /> 이것 역시도 호출 스택을 보면 PipelineRuntime.InitializeApplication처럼 webengine4.dll에서 호출이 됩니다. 그런 걸로 봤을 때, iis와 연동된 Native DLL 측에서 이미 AppDomainAppId에 해당하는 값이 구해졌고 어떤 식으로든 AppDomain 문맥 정보에 설정된 것으로 판단됩니다.<br /> <br /> 따라서, 굳이 AppDomainAppId 값을 구해야 한다면 현재 로딩된 응용 프로그램의 경로와 같은 여러 정황 단서를 이용해 ServerManager와 같은 개체를 활용해 직접 매칭되는 값을 구해오는 수밖에는 없습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > IIS Metabase와 ServerManager 개체 활용 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/973'>https://www.sysnet.pe.kr/2/0/973</a> </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
6707
(왼쪽의 숫자를 입력해야 합니다.)