SimpleIsBest.NET

유경상의 닷넷 블로그
이 글은 오래된 전에 작성된 글입니다. 따라서 최신 버전의 기술에 알맞지 않거나 오류를 유발할 수 있습니다. 저자는 이 글에 대한 질문을 받지 않을 것입니다. 하지만 이 글이 리뉴얼 되면 이 글에 대한 질문을 하거나 토론을 할 수도 있습니다.
어느덧 시리즈 네 번째 글이네요. 스마트 클라이언트를 이해하는데 얼마나 도움이 되는지 알 길이 없군요... 쯔읍... 이번 내용은 스마트 클라이언트 수행환경에서 생성된다는 AppDomain은 어떤 설정을 갖는지, 그리고 이 AppDomain은 어떤 configuration 파일을 사용하는지 알아 보도록 하겠습니다. 이번 포스트의 내용은 스마트 클라이언트 시나리오에서 DLL을 어디에서 다운로드 받는지를 결정하는데 중요한 역할을 수행하므로 잘 이해를 하셔야 성공적인 스마트 클라이언트 어플리케이션을 개발하실 수 있을 겁니다.

제가 단순 무식한 통 배짱으로 단언 하건 데, 이번 포스트의 내용을 잘 이해하지 않고서 성공적으로 스마트 클라이언트 어플리케이션을 구축하기 쉽지 않을 것입니다. 글의 처음 부분은 스마트 클라이언트 뿐 만 아니라 모든 닷넷 어플리케이션에도 적용되는 부분이므로 시간을 갖고 스터디 하시기 바랍니다.


시리즈 목차

Smart Client (IV) : App Base Directory & Configuration

닷넷의 모든 어플리케이션은 어플리케이션 도메인(application domain) 내부에서 작동하게 된다. 어플리케이션 도메인은 모든 닷넷 어플리케이션에 적용되는 개념이므로 여기서 간단하게 짚고 넘어가도록 하겠다. 그리고 스마트 클라이언트에서 상당히 중요하게 작용하는 어플리케이션 도메인의 어플리케이션 베이스 디렉터리가 무엇이고 스마트 클라이언트 시나리오에서 어떤 설정을 갖는지도 알아보도록 하겠다. 어플리케이션 도메인과 더불어 중요한 것은 configuration 파일이다. 닷넷 어플리케이션에 대한 다양한 설정을 수행할 수 있는 configuration 파일을 스마트 클라이언트에서는 어떻게 명시하고 사용하는지도 알아보도록 하겠다. 브라우저 임베디드 스마트 클라이언트에서 configuration 파일을 명시하는 것은 상당히 중요한 작업이며, 어플리케이션 베이스 디렉터리를 결정하는데도 아주 중요한 역할을 한다. 자... 기대하시라... -_-;

이번 포스트의 처음 부분은 좀 딱딱하게도 일반적인 닷넷 이야기가 주를 이룬다. 이들에 대한 이해 없이 스마트 클라이언트를 제대로 이해할 수 없기 때문에 지루하고 재미없는 부분이 먼저 나오게 되었다. 필자가 초기에 스마트 클라이언트에 대해 존나게 삽질할 때도 바로 닷넷 프레임워크의 기본적인 행동을 이해하지 못했기 때문에 삽질을 열나게 했던 것이다. 필자를 믿으라. 지루하더라도 읽어보라. 닷넷 CLR에 대한 기본적인 이해는 자욱한 안개와도 같은 스마트 클라이언트의 행동방식을 이해하는데 졸라 밝은 등대 역할을 해 줄 것이다. 싫음 말고... -_-;

What's Application Domain

어플리케이션 도메인은 닷넷 어플리케이션이 수행되는 가상의 수행 공간을 말한다. 어플리케이션 도메인은 고유의 어셈블리, 객체 힙, 쓰레드 공간을 갖으며, 서로 다른 어플리케이션 도메인은 엄격하게 격리되어 보호된다. 어플리케이션 도메인은 프로세스 개념과 매우 유사하다. 프로세스가 고유의 주소 공간(메모리), 운영체제 자원 등을 가지며 한 프로세스에서 수행되는 코드는 다른 프로세스의 메모리, 자원 등을 직접 액세스할 수 없다. 마찬가지로 한 어플리케이션 도메인의 코드는 다른 어플리케이션 도메인의 객체를 직접 액세스할 수 없으며, 한 어플리케이션 도메인의 오류(예외)가 다른 어플리케이션 도메인에 영향을 주지 않는 것 역시 프로세스와 비슷하다.

어플리케이션 도메인은 프로세스 내에 존재하며, 한 프로세스는 여러 어플리케이션 도메인을 가질 수 있다. 대개의 닷넷 프로그램이 수행되는 프로세스는 1개의 어플리케이션 도메인 만을 갖지만(그래서 개발자들이 소 닭보듯이 어플리케이션 도메인에 무관심한 것 같다), ASP.NET 작업 프로세스(aspnet_wp.exe 혹은 w3wp.exe 프로세스)나 스마트 클라이언트를 호스트하는 IE 브라우저(iexplore.exe 프로세스)는 2개 이상의 어플리케이션 도메인을 갖곤 한다. 닷넷 응용 프로그램이 수행되면 CLR이 구동되고 초기화 되면서 디폴트 어플리케이션 도메인(default application domain)을 생성한다. 디폴트 어플리케이션 도메인은 다른 어플리케이션 도메인과 다르게 CLR에 의해 특별하게 취급 받게 된다.

우리가 닷넷 어플리케이션을 개발할 때 매양 하는 짓이 뭣이더냐? 뭔가 좀 해보려면 항상 하는 것이 어셈블리 참조 아니던가? 어셈블리를 참조하고 그 어셈블리에 포함된 클래스를 사용하기 위해서는 그 어셈블리는 로드 되어야 한다. 어셈블리가 로드 되는 곳 역시 어플리케이션 도메인이다. Mscorlib.dll 과 같이 여러 어셈블리에 의해 공유되는 어셈블리가 있기도 하지만, 어플리케이션 도메인에 각각 따로 따로 로드 되는 경우도 있다(특히 스마트 클라이언트 시나리오에서 그렇다).


그림1. 브라우저 임베디드 스마트 클라이언트에서 다중 AppDomain 상황

그림1은 브라우저에 임베딩된 스마트 클라이언트 시나리오에서 iexplore.exe 프로세스 상에서 여러 어플리케이션 도메인이 생성될 수 있음을 보여주고 있으며 디폴트 어플리케이션 도메인 역시 자동으로 생성되었음을 보여주고 있다. 어플리케이션 도메인에 대해서 더 깊은 내용을 다루는 것은 이 글의 범위를 벗어나므로(글 쓸 때 정말 좋은 핑계다... 흐흐흐...), 다음 자료에서 MSDN에서 어플리케이션 도메인에 대한 설명을 찾을 수 있으므로 한 번쯤 읽어 보기 바란다. 한글 자료와 영문 자료를 모두 포함시켰다. 제목이 약간 다르지만 완전히 같은 내용이다. 한글을 읽다가 잘 이해가 안되면 영문 자료를 읽어보면 이해되는 경우(필자의 경우는 상당히 많았다)가 있기 때문에...

Application Base Directory in AppDomain

어플리케이션 도메인은 다양한 속성을 갖고 있다. 이들 속성들을 모두 설명할 순 없고, 관심을 갖는 부분이 바로 베이스 디렉터리(Base Directory) 속성이다. 어플리케이션 도메인의 베이스 디렉터리 속성은 닷넷 CLR(Common Language Runtime)이 어셈블리를 로드 할 때 참고하는 중요한 기준이 되기 때문에 매우 중요한 속성이라 할 수 있다.

Assembly Loading into Application Domain

어플리케이션 도메인이 어셈블리를 로드 하는 경우를 살펴보면 몇 가지로 나누어 볼 수 있다. 첫째로는 가장 많은 비율을 차지하는 것으로, 어셈블리 메니페스트(manifest)에 기록된 참조에 의한 암시적 로드이다. 졸라 어려워 보어지만 사실 간단하다. 우리가 비주얼 스튜디오에서 System.dll 이니 System.Web.Services.dll 등을 참조하면, 어셈블리 메니페스트에 이 참조 사항들이 기록되게 된다. 쫌 유식한 말로다가 정적 참조(static reference)라고 한다. 그리고 정작 이 참조된 어셈블리에 포함된 클래스가 최초로 사용하는 코드를 만나면 CLR은 암시적으로 참조된 어셈블리를 로드 하게 된다. 한가지 주의할 점은 어플리케이션이 시작될 때나 특정 시점에서 일거에 어셈블리들이 로드 되는 것이 아니라 참조된 어셈블리에 존재하는 클래스들 중 최초의 하나가 사용될 때에 어셈블리가 로드 된다는 점이다.

어플리케이션 도메인에 어셈블리가 로드 되는 두 번째 상황은 AppDomain 클래스의 Load 메쏘드나 Assembly 클래스의 Load 메쏘드 등 코드를 통해 명시적으로 특정 어셈블리를 로드 하는 경우이다. 코드에 의해 동적으로 로드 된다고 해서 동적 참조(dynamic reference)라고도 한다. Load 메쏘드는 어셈블리의 이름만을 명시할 뿐 어셈블리 파일(DLL, EXE)의 경로를 명시하지 않음에 유의해야 한다. 즉, Load 메쏘드(혹은 비슷한 메쏘드들)에 의해 어셈블리가 로드 되는 경우, CLR은 주어진 어셈블리 이름을 가지고 GAC, 로컬 디스크 등을 검색(?)하여 어셈블리를 찾는 Assembly Resolution 로직을 따르게 된다. 이 경우, Load 메쏘드에서 어떤 어셈블리를 로드 할 것인가를 명시적으로 밝히기 때문에 '참조'를 통해 메니페스트 어셈블리 참조를 기록할 필요는 없다. 즉, 비주얼 스튜디오에서 참조를 추가할 필요가 없다는 말이다.

세 번째 경우는 Assembly 클래스의 LoadFrom 메쏘드를 통해 어셈블리 DLL 파일을 명시하여 로드 하는 경우이다. Load와 LoadFrom은 그 의미가 매우 다르다. Load의 경우 어셈블리 이름을 명시하지만 LoadFrom의 경우, 어셈블리 파일 경로를 명시하는 것이다. LoadFrom이 호출되면 CLR은 주어진 경로의 어셈블리를 즉각 로드 하려 시도하고 이것이 실패하면(파일이 없다든가 등등) 곧바로 Exception을 발생한다. 이 말은 LoadFrom 호출 시 CLR은 어셈블리를 찾기 위해 Assembly Resolution 로직을 따르지 않는다는 말이다.

Assembly Resolving

암시적으로 CLR에 의해 어셈블리가 로드 되건 Load 류의 메쏘드가 호출되어 코드에 의해 명시적으로 어셈블리가 로드 되건, CLR은 주어진 어셈블리를 찾기 위해 Resolution 로직을 수행하게 된다(쓰바 Assembly Resolution 이란 용어는 한글화 하기 정말 까칠한 것 같다. 걍 원문 대로 쓰기로 해따... -_-; ). Assembly Resolution 로직이란, CLR이 주어진 어셈블리 이름(어셈블리 파일명이 아니다!!)을 통해 어셈블리를 찾는 과정을 말한다. 이 과정은 MSDN 에 아주 상세히 설명되어 있다. 한글 자료와 영문 자료를 모두 제시하는 이유는 앞서와 같다. 자신이 한 잉글리쉬 한다는 사람은 영문 자료를 보기를 바라며, 잉글리쉬에 핸디캡이 있는 사람이라도 영문자료를 보기를...

이러 저러한 과정이 아주 상세히 설명되어 있지만, 많이 적용되지 않은 상황들을 대충 제거하고 요약해 보면 이렇다. (제발 부탁이니, 이 요약 부분만 달랑 읽고 넘어가지 말고 꼭 위 자료를 읽어 보길 부탁한다. 닷넷 개발자라면 반드시 알고 있어야 할 필수 지식이니 말이다.)

  • Configuration 파일의 바인딩 설정이 있다면 이 설정을 적용하여 로드할 어셈블리를 결정한다.
  • 로드 하고자 하는 어셈블리의 이름이 Full Name 이면(어셈블리 이름, 버전, culture, public key), GAC을 먼저 찾는다. 주어진 어셈블리 이름이 Full Name 이 아니면 (달랑 어셈블리 이름만 주진 경우) GAC을 검색하지 않는다.
  • GAC에서 어셈블리를 못 찾았거나, Full Name이 주어지지 않았다면, 어플리케이션 도메인의 베이스 디렉터리를 기준으로 어셈블리 파일을 찾아 가장 먼저 일치하는 어셈블리를 로드 한다.

먼저 어셈블리 이름에 대해 약간 이야기 하자면, System.dll 은 정확히 말해서 어셈블리 이름이 아니다. 닷넷 프레임워크 1.1에 포함된 System.dll 의 어셈블리 full name은? System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 이다. 그리고 이 어셈블리의 partial name은 System 이다. 이것에 주의할 필요가 있다. 예를 들어 Assembly.Load("System") 와 같은 코드가 수행되면 CLR은 GAC에서 System 어셈블리를 찾지 않는다. 왜냐하면 어셈블리의 full name이 주어지지 않았기 때문이다. 비슷하게 비주얼 스튜디오에서 어셈블리를 참조할 때, 참조된 어셈블리가 서명되어 있다면 암시적 어셈블리 로딩 과정에서 CLR은 GAC을 먼저 찾게 된다. 그러나, 참조한 어셈블리에 서명이 없다면 CLR은 GAC을 찾지 않는다.

어셈블리 전체 이름이 주어지지 않았거나, 주어졌더라도 GAC에서 어셈블리를 찾지 못한 경우, 현재 어플리케이션 도메인의 베이스 디렉터리를 기준으로 어셈블리 파일을 찾는 과정(probing 이라 한다)을 수행한다. 그렇다. 필자는 이 말이 하고 싶어서 지금까지 어플리케이션 도메인이 뭐니 어셈블리 로딩이니 이빨을 깠던 것이다.

Application Base Directory

어셈블리가 GAC을 통해 로드 되지 않은 상황에서 CLR은 어플리케이션 베이스 디렉터리에서 어셈블리를 로드 하려고 시도한다. 대개의 exe 응용 프로그램들의 베이스 디렉터리는 exe 파일이 존재하는 디렉터리로 설정된다. 주의할 점은 작업 디렉터리(working directory)와 베이스 디렉터리(base directory)는 서로 다른 개념이라는 것이다. 작업 디렉터리는 프로세스의 현재 디렉터리를 말하는 것으로, 상대 경로의 기준 위치가 되는 WIN32 의 개념이다. 반면 베이스 디렉터리는 닷넷 어플리케이션 도메인 별로 다르며 어셈블리를 찾는 과정(probing)에서 기준 위치로 사용되는 닷넷의 개념인 것이다. 작업 디렉터리는 WIN32 API 등을 이용하여 변경이 가능하지만 어플리케이션 베이스 디렉터리는 어플리케이션 도메인이 생성될 때 설정되고 변경되지 않는다.

어플리케이션 도메인의 베이스 디렉터리를 알아내는 방법은 AppDomain 클래스의 BaseDirectory 속성을 액세스 하면 된다. 다음 코드는 현재 어플리케이션 도메인의 베이스 디렉터리를 출력하는 코드 조각이다.

Console.WriteLine("AppDomain Base Directory : {0}", AppDomain.CurrentDomain.BaseDirectory);

일반적으로 닷넷 exe 프로그램이 수행되면 베이스 디렉터리는 exe 파일이 존재하는 디렉터리로 결정된다. 이것은 exe에 포함된 작은 스텁(stub) 코드에 의해 수행된다. 반면 ASP.NET 웹 어플리케이션은 ASP.NET 엔진에 의해 웹 어플리케이션의 가상 디렉터리의 물리 경로(파일 시스템 경로)가 베이스 디렉터리로 설정된다. 그렇다면 스마트 클라이언트는 어떠할까? 이제 알아보도록 하자.

Stand-Alone Smart Client : Base Directory & Configuration File

정말 잘 참고 여기까지 읽어 온 독자에게 심심한 치하를 하는 바이다. 독립 스마트 클라이언트가 보다 간단한 구조를 가지므로 먼저 설명하도록 하겠다.

AppDomain Base Directory

앞서 스마트 클라이언트, 그것을 알려주마 (III) : 작동 원리 포스트에서 독립 스마트 클라이언트는 IEExec.exe 에 의해 어플리케이션 도메인이 생성된다고 하였다. 스마트 클라이언트를 위한 어플리케이션 도메인을 생성할 때 IEExec.exe 는 어플리케이션 도메인의 베이스 디렉터리를 해당 EXE 파일을 다운로드 받은 디렉터리를 URL을 베이스 디렉터리로 설정한다. 그렇다. 베이스 디렉터리는 반드시 로컬 파일 시스템의 경로일 필요가 없다. URL도 베이스 디렉터리로서 설정이 가능한 것이다.

그렇다면 우리의 독립 스마트 클라이언트 예제(스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 참조)의 Launcher.exe를 다시 상기해 보자. Launcher.exe를 작성할 때 우리는 ClientModule.DLL을 '참조' 했었다. 소위 말하는 정적 참조(암시적인 참조)를 수행한 것이다. 그렇다면 Laucher.exe 가 다운로드 되고 IEExec.exe 프로세스에 호스팅 되어 수행될 때, 폼이 표시됨과 동시에 CLR은 정적 참조에 의해 ClientModule 어셈블리를 로드 하려고 할 것이다(폼에서 ClientModule 어셈블리의 UIControl 클래스를 참조 했기 때문이다). 물론 ClientModule 어셈블리는 서명하지 않은 어셈블리 이므로(적어도 필자의 기억으로는 그렇다), 어플리케이션 도메인의 베이스 디렉터리에서 ClientModule 어셈블리를 로드 하려고 시도할 것이다. 그리고 베이스 디렉터리는 exe를 다운로드 받은 URL이므로 그곳에 ClientModule 어셈블리가 존재해야만 한다. 물론 우리의 테스트에서 동일 디렉터리에 Launcher.EXE 와 ClientModule.DLL을 모두 복사해 놓았으므로 코드가 작동한 것이다.

보다 구체적인 예로 설명해 보자. 지난 예제에서 Launcher.EXE 를 올려놓은 URL은 http://localhost.com/SmartClientBasic/Launcher.EXE 이였다. 이 URL을 브라우저 주소 창에 입력하거나 링크를 만들어 클릭하면 독립 스마트 클라이언트가 구동될 것이며, 이 스마트 클라이언트 어플리케이션의 베이스 디렉터리는 http://localhost.com/SmartClientBasic/ 로 설정된다. 이제 CLR이 어셈블리를 GAC이 아닌 곳에서 찾게 된다면 기준이 되는 디렉터리는 http://localhost.com/SmartClientBasic/ 가 될 것이다.

마지막으로 한 마디만 더 하자면, 어플리케이션 베이스 디렉터리 설정과 더불어 어셈블리를 찾는 추가 경로로서 bin 디렉터리를 추가한다. 소위 PrivateBinPath 경로로서 추가되는 것인데, 더 이상 길어지는 걸 두고 볼 수 없어서 이만 입을 다물도록 하겠다.

Configuration File

독립 스마트 클라이언트의 configuration 파일은 일반 EXE의 상황과 동일하다. 즉, exe.config 파일을 웹에서 다운로드 한다는 것이다. 다운로드 위치는 EXE 파일을 다운로드 한 URL로 부터 계산된다. Launcher.exe 예제를 다시 이용하여 설명하면, Launcher.exe 스마트 클라이언트 어플리케이션의 configuration 파일은 http://localhost.com/SmartClientBasic/Launcher.exe.config 가 되겠다. 간단하지 않은가?

사실 어플리케이션 도메인을 생성할 때 configuration 파일까지 임의로 설정할 수 있지만, 일반적인 EXE 파일을 수행할 때와 일관성을 유지하기 위해 IEExec.exe 가 .exe.config 를 사용하도록 배려(?) 해주는 것이다(필자의 추측이다... -_-; ).

Browser Embedded Smart Client : Base Directory & Configuration File

독립 스마트 클라이언트는 반드시 EXE를 요구하기 때문에 베이스 디렉터리나 configuration 파일이 사용되는 패턴이 일반 EXE 를 수행하는 것과 동일하기 때문에 상당히 자연스럽지만, 브라우저 임베디드 스마트 클라이언트는 대략 난감하다 아니할 수 없다. 브라우저 임베디드 스마트 클라이언트는 configuration 파일을 HTML 태그를 통해 명시적으로 주도록 되어 있으며, 이 태그에 의해 사용되는 configuration 파일이 존재하는 웹 상의 디렉터리가 어플리케이션 베이스 디렉터리로 사용되게 된다. 조급해 하지 말고 상세히 살펴보도록 하자.

Specifying Configuration File

브라우저 임베디드 스마트 클라이언트 어플리케이션의 configuration 파일을 지정하는 방법은 태그를 사용하면 된다. 스마트 클라이언트를 위한 OBJECT 태그를 포함하는 HTML (.htm이 사용되건 aspx를 쓰건 jsp를 쓰건 결과물은 HTML 이다)에 다음과 같이 configuration 파일을 명시할 수 있다.

<link href="ClientModule.dll.config" rel="Configuration">

태그를 구사할 때는 rel 속성에 반드시 Configuration을 명시하고 파일을 href 속성에 주면 된다(절대 경로건 상대 경로건 상관 없지만 다른 사이트에 대한 URL은 불가하다).

뭐 몰라도 되지만 원리는 이렇다. 지난 스마트 클라이언트, 그것을 알려주마 (III) : 작동 원리 포스트를 다시 떠올려 보자. 브라우저 임베디드 스마트 클라이언트는 IEHost.dll 모듈에 의해 스마트 클라이언트를 위한 어플리케이션 도메인이 만들어진다고 했다. 이 때 IEHost.dll 은 재미있는 행동을 한다. IEHost.dll은 OBJECT 태그가 포함된 HTML 에서 ref 속성이 "Configuration" 인 태그를 찾는다. 만약 이것을 찾으면 IEHost.dll은 어플리케이션 도메인을 생성할 때, 어플리케이션 도메인의 configuration 파일로서 찾은 태그의 href 속성이 표시하는 URL을 사용해 버린다. 재미있지 않은가? 아니면 말고... -_-;

브라우저 임베디드 스마트 클라이언트의 경우 Configuration 파일이 명시되지 않으면 IEHost.dll 은 쌩뚱맞게도 iexplore.exe.config 파일을 configuration 으로 사용하려고 시도 한다. 뭐 IE (iexplore.exe) 가 사용되므로 그렇다고 치부할 수 있지만 iexplore.exe.config 파일을 다운로드 하려고 하는 URL 은 더욱 쌩뚱맞게 사이트의 루트 URL(예: http://www.simpleisbest.net/iexplore.exe.config)을 사용한다는 점이 더욱 요상스럽다. 하지만 이러한 행동은 곧이어 설명할 어플리케이션 도메인의 베이스 디렉터리를 설정하는 IEHost.dll 의 행동을 생각 하면 또 자연스럽기도 하다.

Determining AppDomain Base Directory

IEHost.dll 은 configuration 파일을 설정함과 동시에 생성되는 어플리케이션 도메인의 베이스 디렉터리로서 configuration 파일을 다운로드 받은 웹 상의 디렉터리를 설정하는 만행(?)까지 서슴지 않는다. 독립 스마트 클라이언트와는 전혀 다르게도 브라우저 임베디드 스마트 클라이언트는 태그에 의해 configuration 파일을 설정하고 이 configuration 파일이 존재하는 웹 상의 디렉터리가 베이스 디렉터리로 설정됨을 잘 알아 두자.

스마트 클라이언트, 그것을 알려주마 (II) : 맛보기 예제 에서 ClientModule.DLL은 어떤 어셈블리도 참조하지 않았지만 만약 ClientModule.DLL이 ClientModule2.DLL을 Assembly.Load 메쏘드 호출과 같은 코드로 명시적으로 참조하거나 비주얼 스튜디오의 '참조'를 통해 암시적으로 참조했다면, CLR은 ClientModule2.DLL을 configuration 파일을 다운로드 한 웹 상의 디렉터리에서 찾게 될 것이다.

그렇다면, 지난 맛보기 예제에서 처럼 configuration 파일을 명시하지 않았다면, 즉 태그를 명시하지 않는 경우에는 어떻게 되는가? 이 경우에는 물론 적용되는 configuration 파일은 없다. 그리고 어플리케이션 베이스 디렉터리는 DLL 을 다운로드 한 사이트 루트 경로(URL)로 설정된다. 예를 들어, http://www.simpleisbest.net/Apps/SmartClientBasic/SmartClient.htm 페이지에 스마트 클라이언트를 위한 OBJECT 태그가 존재하고, 이 명시되지 않는다면 어플리케이션의 베이스 디렉터리는 http://www.simpleisbest.net/ 이 된다는 얘기 이다. Configuration 파일이 명시되지 않은 상황에서 ClientModule.dll 이 ClientModule2.dll 을 참조한다면, CLR은 http://www.simpleisbest.net/ 에서 ClientModule2.dll 을 로드하려고 시도할 것이다(물론 ClientModule2.dll이 GAC에 없을 경우이다. 일일이 이런 조건 다 얘기 하자면 졸라 빡시므로 대충 알아 듣기 바란다... -_-). 이러한 행동은 Configuration 파일이 명시되지 않으면 사이트의 루트 경로에서 iexplore.exe.config을 다운로드 하여 configuration 으로 설정하려는 IEHost.dll 의 기본 행동과도 맞아 떨어진다.

마지막으로 독립 스마트 클라이언트와 동일하게 IEHost.dll 은 어플리케이션 도메인을 생성할 때 PrivateBinPath로서 bin 디렉터리를 추가한다. 고로, 어셈블리를 한번에 찾지 못하면 추가적인 웹 서버 액세스를 수행함에 유의 하자(사실은 어셈블리를 한 번에 찾지 못한다면 찾기 위해 더 많은 웹 서버 액세스를 수행한다. 이로 인해 스마트 클라이언트의 구동시간이 느려지기도 한다)

IIS Server Setting For Configuration File

스마트 클라이언트는 웹 서버와 무관하게 작동하는 클라이언트 기술이다. 웹 서버로 IIS를 사용하건 아파치를 사용하건 아무런 관계가 없다. 다만 EXE 혹은 DLL을 웹 서버가 다운로드 해 줄 때 MIME 타입이 application/octet-stream, application/x-msdownload, application/x-complus 중 하나이기만 하면 된다(스마트 클라이언트, 그것을 알려주마 (III) : 작동 원리 참조).

스마트 클라이언트 어플리케이션이 Configuration 파일을 사용하면 IIS를 웹 서버로 사용할 때 약간(?)의 주의를 기울여야만 한다. IIS를 사용하는 웹 서버에 닷넷 프레임워크가 설치되어 있다면 .config 파일의 다운로드는 제한되곤 한다. 그 이유는 ASP.NET 웹 어플리케이션의 설정을 담는 web.config가 클라이언트에게 다운로드 되는 것을 막기 위해 ISAPI Extension 확장자 매핑이 이루어져 있기 때문이다. 이러한 설정은 IIS 관리자 MMC를 통해 손쉽게 확인할 수 있다(화면1 참조).


화면1. .config 파일의 ISAPI 매핑

.config 파일 확장자는 다시 ASP.NET의 HTTP 핸들러에 매핑 되어 있는데, 이 핸들러는 System.Web.HttpForbiddenHandler 로서 다운로드를 금지하는 핸들러이다(HTTP 403 Forbidden 오류를 유발한다). 때문에, configuration 파일을 지정할 때는 약간의 주의를 해야만 한다. 참고로, ASP.NET의 HTTP 핸들러 매핑 설정은 닷넷 프레임워크 1.1의 경우 machine.config 에 기록되어 있으며, 닷넷 프레임워크 2.0의 경우 시스템 수준의 web.config (machine.config 파일 존재하는 디렉터리에 존재한다)에 설정되어 있으므로 한 번 살펴보는 것도 좋을 것이다. 다음은 machine.config 혹은 web.config 파일에 설정된 .config 파일에 대한 HTTP 핸들러 매핑이다.

<configuration>

  <system.web>

    <httpHandlers>

      <!-- 다른 부분 생략 -->

      <add verb="GET,HEAD" path="*.dll.config" type="System.Web.StaticFileHandler" />

      <add verb="GET,HEAD" path="*.exe.config" type="System.Web.StaticFileHandler" />

      <add verb="*" path="*.config" type="System.Web.HttpForbiddenHandler" />

      <!-- 다른 부분 생략 -->

    </httpHandlers>

  </system.web>

</configuration>

리스트1. .config 파일에 대한 ASP.NET HTTP 핸들러 기본 매핑

독립 스마트 클라이언트를 사용하는 경우, configuration 파일은 .exe.config 이다. 이 경우, 친절한 마이크로 소프트 닷넷 팀이 .exe.config 파일이 클라이언트로 다운로드 될 수 있도록 이 확장자를 System.Web.HttpStaticFileHandler 로 연결해 놓았다. 고로 별다른 문제 없이 configuration 파일이 다운로드 되고 설정 파일의 역할을 수행할 것이다.

브라우저 임베디드 스마트 클라이언트의 경우, configuration 파일을 태그를 통해 임의의 파일로 명시할 수 있기 때문에 문제가 발생할 수 있다. 만약 SmartClient.config 같은 파일 이름을 사용한다면 이 파일은 HttpForbiddenHandler와 매핑되어 HTTP 403 Forbidden 오류가 발생한다. Configuration 이 다운로드 되지 않고 사용되지 않는 것은 둘째치고 스마트 클라이언트의 구동조차 되지 않으므로 주의를 기울여야 한다. 그렇다면 configuration 파일로서 Temp.txt 와 같은 쌩뚱맞은 파일명을 사용해도 될까? 그렇다 된다. 하지만 configuration 로서 확장자가 .config 가 아닌 파일을 사용한다면 대략 혼동될 가능성이 높으므로 가급적 .config로 끝나는 파일을 사용하는 것이 좋다. 좋은 권고 사항은 .dll.config 확장자를 사용하는 것이다. .dll.config 확장자는 .exe.config 확장자와 더불어 StaticFileHandler와 연결되어 있어서 다운로드가 잘 될 것이다(리스트1 참조).

StaticFileHandler를 통해 configuration 파일을 다운로드 하는 것은 그다지 좋지 않다. StaticFileHandler의 기본 행동 방식이 좀 괴짜스럽기 때문이다. 이 녀석은 파일을 다운로드 해주면서 콘텐트의 만료 시간을 24시간으로 설정하는데, 이러한 설정은 브라우저 측에 캐시 된 콘텐트가 24시간 동안 재사용된다는 말이 된다. 즉, 서버에서 콘텐트가 변경되더라도 브라우저는 24시간 동안 이 콘텐트의 다운로드를 요구하지 않는다는 얘기가 되겠다. 해결방법은 독자들이 잘 짱구를 굴려보면 될 것이다. -_-;

What's Next

이번 포스트도 기대를 져버리지 않고 졸라 빡신 포스트 였다. 스마트 클라이언트 시나리오에서 프로세스와 어플리케이션 도메인의 관계 그리고 베이스 디렉터리 설정은 상당히 중요한 개념이다. 지난 스마트 클라이언트, 그것을 알려주마 (III) : 작동 원리 포스트와 더불어 이번 포스트를 시간을 갖고 천천히 정독하여(사실 정독할 만큼 글을 잘 썼다고 생각하진 않는다) 잘 이해하기 바란다.

다음 포스트에서는 스마트 클라이언트를 구동할 때 발생하는 문제들을 해결하는 방법과 도구 그리고 팁들을 살펴보도록 하겠다. 브라우저 임베디드 스마트 클라이언트 시나리오에서 이상하게 엑박만 나타난다거나 뜬금없이 SecurityException 이 발생한다거나 DLL을 찾을 수 없다거나 하는 둥의 문제 상황에서 이들을 해결하기 위한 단서를 제공하는 여러 가지 툴, 설정 등을 살펴보도록 하겠다. 다음 포스트 역시 너무 많이 기대는 하지 않는 것이 좋다. 요즘 필자를 휘감는 엄청난 포스의 귀차니즘으로 인해 언제나 스마트 클라이언트에 대한 다음 글이 올라올지 필자도 모르겠다.



Comments (read-only)
#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / 운비 / 2006-02-07 오후 3:57:00
안녕하세요
강좌 잘 읽고 있습니다

강좌2에서 예전에 주인장님께서 예제를 보여주셨을 때 테스트해봤었는데
http://localhost 스마트웹-> 웹서비스 http://localhost끼리는 잘되지만
http://localhost.com 스마트웹 ->웹서비스 http://localhost 혹은 주인장님의 웹서비스 테스트 사이트 접속시에는
codeaccesssecurity permision에러가 나더군요
그리고 http://www.simpleisbest.net">http://www.simpleisbest.net 스마트 예제URI -> http://www.simpleisbest.net">http://www.simpleisbest.net 웹서비스 테스트는 잘되고요

결국, 스마트클라이언트를 publish하는 사이트에서 기본적으로 같은 uri로 웹서비스를 해야 기본적으로는 같은 appdomain영역으로 해야 같이 쓸 수있는 것 같군요

하지만, 대부분(?) 웹사이트와 웹서비스 사이트를 다르게 가져가는 곳은 app domain영역이 다르고 당연히(머신을 틀리게 가면 프로세스까지 다르겠죠) 서로 공유되지 않아 cas에 위반되게되는데 보통 다르게 웹사이트(스마트웹) 와 웹서비스를 다른 도메인으로
서비스 할때 어떻게 해야하나요?

제가 물어보는 것이 맞게물어보는 것인가 모르겠네요..쩝...


--테스트 환경
vs2003 .net 1.1
vs2005 .net 2.0
xp professional sp2


[에러참조]
See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.Security.SecurityException: Request for the permission of type 'System.Net.WebPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
at System.Security.CodeAccessPermission.Demand()
at System.Net.HttpWebRequest..ctor(Uri uri, ServicePoint servicePoint)
at System.Net.HttpRequestCreator.Create(Uri Uri)
at System.Net.WebRequest.Create(Uri requestUri, Boolean useUriBase)
at System.Net.WebRequest.Create(Uri requestUri)
at System.Web.Services.Protocols.WebClientProtocol.GetWebRequest(Uri uri)
at System.Web.Services.Protocols.HttpWebClientProtocol.GetWebRequest(Uri uri)
at System.Web.Services.Protocols.SoapHttpClientProtocol.GetWebRequest(Uri uri)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at ClientModule.WebService2.TestService2.GetDataSet()
at ClientModule.QueryDataForm.QueryDataForm_Load(Object sender, EventArgs e)
at System.Windows.Forms.Form.OnLoad(EventArgs e)
at System.Windows.Forms.Form.OnCreateControl()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.WmShowWindow(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WmShowWindow(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
The action that failed was:
Demand
The type of the first permission that failed was:
System.Net.WebPermission
The Zone of the assembly that failed was:
Intranet


************** Loaded Assemblies **************
mscorlib
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
System
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
ClientModule
Assembly Version: 1.0.0.0
Win32 Version: n/a
CodeBase: http://localhost.com/ClientModule.DLL
----------------------------------------
System.Windows.Forms
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
Accessibility
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Accessibility/2.0.0.0__b03f5f7f11d50a3a/Accessibility.dll
----------------------------------------
Microsoft.mshtml
Assembly Version: 7.0.3300.0
Win32 Version: 7.0.3300.0
CodeBase: file:///C:/WINDOWS/assembly/GAC/Microsoft.mshtml/7.0.3300.0__b03f5f7f11d50a3a/Microsoft.mshtml.dll
----------------------------------------
System.Web.Services
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Web.Services/2.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll
----------------------------------------
System.Data
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_32/System.Data/2.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------
System.Xml
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Configuration
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
3k8o88hp
Assembly Version: 1.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------

************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:

<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.


#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / 운비 / 2006-02-07 오후 4:26:00
하다 보니 몇가지 궁금한게 있어 추가 질문합니다.

1. 로컬인트라넷에서 해당 도메인을 추가하지 않으면 browser embed에서 윈폼을 띄우는 버튼3에서 .net security error가 나고
stand-alone에서는 말씀하신대로 다운로드하면서 실행시 에러가 나는데요 결국 로컬인트라넷에 해당 도메인을 추가하는 작업을
client가 해주어야 하는데 얼핏듣기로 cas설정을 자동으로 해주어야 하며, 닷넷프레임웍이 안깔린 컴에 닷넷프레임웍을 깔아주어야
할 것 같네요...결국 해당 스마트 클라이언트 사이트에 최초 접속시 사용자컴이 닷넷프레임웍이 안깔려 있으면
닷넷프레임웍설치 -> cas설정을 배포및 설치시에 해주어야 할 것같습니다. 어떻게 하는지요?

2. 스마트클라언트 웹이 결국 dll을 배포하는데 해당 dll의 사이즈도 문제가 될 것 같습니다. 많거나 사이즈가 크면 그만큼 느려질테니깐요...
(2-1) 버젼을 1.0.0.0으로 고정시켜놓고 수정된 dll이 계속 다운로드되는데요
(download폴더에 보면 dll이름과 버젼이 같아도 계속 다운로드 받는 것같음)
배포방식에 있어 이름과 버젼말고 다른 것도 서로 내부적으로 비교하는지요?

(2-2) 실무에서 업데이트된 dll은 그냥 xcopy하여 올려놓으시는 지 아니면 특별한 업데이트 배포방식이 필요한지요?

#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / 블로그쥔장 / 2006-02-08 오전 9:43:00
말씀하신 웹 서비스에 대한 내용은 CAS 제한 때문입니다. 시리즈 5번째 글에서 언급한 대로, 기본 CAS 설정상
DLL 이 다운로드된 사이트에 대해서만 웹 서비스 호출이 허용되기 때문입니다.
다른 사이트에 대해 웹 서비스를 호출하려면 각 클라이언트에 CAS 설정을 잡아 주어야 하며
다음(6번째 글)에서 다루게 될 것입니다.

질문하신 첫번째 내용은 여기서 답해드리기 어렵습니다. 내용이 방대할 뿐 더러, 제가 그런 내용을 컨설팅하는 것을
업으로 삼고 있기 때문에 여기서 질문 내용을 답해드린다면 회사 영업상의 기밀(?)을 말하는 것과 같습니다.
두번째 질문에 대해서... 특별한 다운로드 방법을 취할 방법이 없습니다. 스마트 클라이언트의 기본 시나리오에서
다운로드는 개발자가 제어할 수 없습니다. 다운로드 여부를 결정하는 것은 닷넷 프레임워크이며 이것을 개발자나
설정에 의해 제어할 수 없으며, 닷넷 프레임워크는 DLL의 버전 혹은 날짜를 통해 다운로드 여부를 결정합니다
이것도 내부적으로 복잡한 내용이므로 여기서 모두 설명드리기는 좀 어렵네요.

죄송합니다...
#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / 운비 / 2006-02-09 오전 11:54:00
아 그렇군요!.
쩝~~

막상, 해볼려니 여러가지 걸리는 문제들이 많은 것 같습니다.
아무튼, 좋은 강좌 많이 부탁드립니다.

혹시, 제궁금점에 대해 조언해 주실수 있다면 unbinara@dreamwiz.com으로 참고 부탁드리며..^^
#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / 한진수 / 2006-03-23 오전 11:58:00
<link href="ClientModule.dll.config" rel="Configuration">

이것만 보고 <link href="App.config" rel="Configuration">
이런식으로 파일 이름을 바꿨다가 겁나 헤맸습니다..

DLL 이나 EXE 파일 이름.config 라고 적어 주셨으면..
하지만 덕분에 쉽게 해결 했습니다

Smart Client 가 참조할 수 있는 설정 파일을 사용하지 못해서 늘 불안 했었는데
감사합니다~~ ^^
#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / 이원섭 / 2006-04-28 오후 3:27:00
상용 컴포넌트를 같이 사용시 배포는 어찌 돼는지 ?
#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / 블로그쥔장 / 2006-04-29 오후 4:49:00
상용 컴포넌트가 순수 닷넷용이라면 스마트 클라이언트 시나리오에 의해 배포가 가능합니다.
단순이 어셈블리 DLL 들을 UI DLL이 존재하는 웹 서버 디렉터리에 올려 두면됩니다.
하지만 상용 컴포넌트가 ActiveX 이거나 unmanaged DLL을 포함한다면
스마트 클라이언트 시나리오로는 자동 배포되지 않습니다.
대개 별도의 .MSI 설치를 수행하거나 ActiveX 설치 페이지를 이용하여 배포하곤 합니다만...
#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / 이승용 / 2006-09-07 오전 11:50:00
안녕하세요 강좌 너무 재밌게 보고 있습니다.
한가지 의문점이 있어서요. 쥔장님께서 말씀하신 PrivateBinPath라는 경로인데요... 어플리케이션 베이스 디렉터리 설정과 함께 bin디렉터리를 자동으로 추가를 한다면 VS2003에서 참조로 추가하면 자동경로를 통해 bin폴더에 dll이 복사되어 저장되잖아요.. 그럼 bin폴더에 들어있는 dll도 절대경로를 지정해 주지 않아도 된단 말씀이세요?
직접 해보니깐 잘 안되서 질문드리는 겁니다..
답변 부탁할께요.. 수고하십시오..
#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / 블로그쥔장 / 2006-09-07 오후 12:53:00
스마트 클라이언트가 아닌 윈폼 어플리케이션(exe)의 경우에 bin 디렉터리는 PrivateBinPath에 자동으로 추가되지
않습니다. 스마트 클라이언트의 경우만 그렇게 됩니다.
일반 윈폼 어플리케이션에 PrivateBinPath를 추가하시려면 app.config 에 다음과 같이 probing 요소를 추가하셔야 합니다.

<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2\subbin;bin3"/>
</assemblyBinding>
</runtime>
</configuration>
#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / 이승용 / 2006-09-07 오후 2:36:00
윈폼이 아닌 스마트 클라이언트도 마찬가지 인것 같은데요?
usercontrol로 만들어서 <object>선언을 했는데 마찬가지 인거 같아요..~
경로 설정도 다 맞는거 같은데...fiddler로 디버그 해보니 bin폴더로는 아예 접근을 하지 않는것 같습니다만....
혹시 다음 강좌에서 설명하신 IEHost.dll이란놈이 예외가 발생한것을 처먹어 버려서 그런가요??
죄송합니다 자꾸 귀찮게 해서....
^^
#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / noend331 / 2006-09-13 오후 9:21:00
쥔장님 덕분에 많은 공부 하고 있습니다.

처음 글을 남긴 이유는 아시겠지만 질문이 있어서 입니다 ^^;

이상한 현상이 발생하는데요.

UserControl을 생성하였습니다.

예를들어 어셈블리는 testSC.dll 이고, 네임스페이스는 testSC, 클래스는 ucTestSC입니다.

그리고 testSC.dll 은 다른 프로젝트인 DBHelper.dll을 참조합니다.

새로 웹사이트를 생성하여 위의 dll들을 루트에 복사해서

<object>태그로 감싸고 classid="testSC.dll#testSC.ucTestSC" 로 넣어서 웹페이지를 열어보니 잘 됩니다.

그런데 약간 변경을 하고 싶어서 ucTestSC의 소스를 변경 후 다시 웹사이트에 testSC.dll을 복사했습니다.

그다음부터는 X표시나네요

부랴부랴 Fiddler로 확인해보니

testSC.dll은 다운로드되구요. iexplore.exe.config 를 다운받지 못하더군요.

그래서 웹페이지에 <link href="testSC.dll.config" rel="Configuration" />추가해줬지만 못찾습니다.

testSC.dll.config는 404 not found오류가 나구요 계속 X표시 입니다.

그래서 같은 소스를 이용해서 다른 이름으로 dll을 만들어 테스트 해보니 또되네요

그리고 Fiddler로 보니 iexplore.exe.config 찾지 못하는데 잘보여집니다.

막히네요 ;


dll이름이 testSC.dll이라면 임베디드 방식으로 스마트클라이언트 작성 시에

베이스디렉토리 설정방법이 <link href="dll명.확장자.config" rel="Configuration" /> 맞는건가요?

그리고 위와같은 현상이 왜 일어나는지 궁금합니다.

바쁘시겠지만 답변 부탁드립니다.
#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / 블로그쥔장 / 2006-09-15 오후 2:51:00
먼저 .config 파일이 없어서 (그게 iexplore.exe.config 든 testSC.dll.config 든) 404 Not Found 가 나타나더라도
스마트 클라이언트 구동에는 지장이 없습니다.
configuration이 없으면 그냥 없는대로 구동됩니다. 다만 약간의 오버헤드가 있지만 말입니다.
문제의 원인은 configuration이 아닌 듯합니다.
x 표가 나오면 일단 Fiddler로 DLL이 다운로드 되는지 확인하십시요.
다운로드가 되는 상황에서 x 표가 나온다면 DebugIEHost 설정을 하시고 로그 파일에 어떤 예외가 나타나는지
확인해 보십시요.
#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / noend331 / 2006-09-15 오후 6:04:00
네 답변 감사합니다.

확인해본 결과 DLL은 다운로드 됩니다.

로그중에 예외 메시지는 없구요. 로그중 일부는 다음과 같습니다.

......
Microsoft.IE.SecureFactory: Locating domain for http://localhost:3690/">http://localhost:3690/
Microsoft.IE.IDKey: Created key
Microsoft.IE.Manager: The domain does not exist. <---- 이부분
Microsoft.IE.IDKey: Created key
Microsoft.IE.Manager: The domain does not exist. <---- 이부분
Microsoft.IE.SecureFactory: Need to create domain
Microsoft.IE.SecureFactory: Application base: http://localhost:3690/">http://localhost:3690/
......

혹시 개발툴에서 생성한 웹서버이기 때문에 그런건가요?

dll 업데이트는 자주 있을 법한 일인데 이렇게 막혀버리니 OTL

좀더 도움주셨으면 좋겠습니다.

즐거운 주말되세요~.;;
#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / 블로그쥔장 / 2006-09-15 오후 6:23:00
일단 VS.NET이 제공하는 웹 서버(WebDev.WebServer.exe)를 사용하신다는 점이 좀 의심이 가는 군요.
IIS를 사용해 보십시요.
그리고 닷넷 프레임워크 1.1을 사용하면서 80 포트가 아닌 포트를 사용하는 경우 이슈를 가지고 있습니다.
관련 문서는 http://support.microsoft.com/kb/827558/en-us 입니다.
닷넷 프레임워크 2.0이라면 좀 이상하긴 한데... WebDev.WebServer.exe 이 녀석이 캐시와 관련되서 영 믿음이
안가는 녀석인지라...
#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / noend331 / 2006-09-15 오후 7:20:00
너무나도 빠른 답변 감사합니다.

닷넷 2.0인것을 말씀 안드렸었네요.

iis를 이용해서 다시 해보고 글남길게요. 개발환경이 xp라 2003을 깔아야 겠네요 ㅠㅠ

만약 제가 겪은 문제가 2003을 사용했을 경우 깨끗히 해결된다면 참좋겠네요.

주말 잘보내세요.

후다닥~!~!~
#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / 안연준 / 2006-10-25 오후 12:34:00
유경상 님.... 질문 하나 올립니다....

제가 부족해서 블로그 내용을 이해를 잘 못하는거 같네요.. ㅠㅠ

전에도 얘기를 드렸겠지만...

배포 관련해서 열심히 삽질 중 입니다.

위의 블로그 내용을 보면서 테스트 해보고 있는데요

일단 스마트클라이언트 로드 페이지는 다음과 같습니다.

<HTML>
<HEAD>
<title>
Haroobang PROJECT (SmartClient)
</title>
<link href="cvMapInformationPage.dll.config" rel="Configuration">
</HEAD>

<BODY style="font-size:9pt;font-family:굴림">
<CENTER>
이 페이지가 정상적으로 로드 되지 않을 경우 (<a href="http://**.***.60.72/Haroobang/SettingCAS.zip">배치파일</a>)을 다운 받고 실행 하여 주십시오
<br><br>

<OBJECT id="insHaroobang" classid="http:cvMapInformationPage.dll#cvMapInformationPage.MapInformationPage" width=1025 height=912>
<PARAM name="xIsActive" value="True">
</OBJECT>
</CENTER>
</BODY>
</HTML>


그리고.........

Head 태그 안에서 Link 부분을 보시면... 이렇게 하는것이 맞는 건지 잘 모르겠습니다.

이 페이지와 동일한 폴더에 cvMapInformationPage.dll.config 에는

<configuration>

<system.web>

<httpHandlers>

<!-- 다른 부분 생략 -->

<add verb="GET,HEAD" path="*.dll.config" type="System.Web.StaticFileHandler" />

<add verb="GET,HEAD" path="*.exe.config" type="System.Web.StaticFileHandler" />

<add verb="*" path="*.config" type="System.Web.HttpForbiddenHandler" />

<!-- 다른 부분 생략 -->

</httpHandlers>

</system.web>

</configuration>


그냥 이렇게 넣었고요.. ㅡ,.ㅡ;;

하지만 실제 로그를 보면

# Result Protocol Host URL Body Caching Content-Type User-defined
134 302 HTTP 61.252.60.72 /Haroobang/ 160 private text/html; charset=utf-8
135 200 HTTP 61.252.60.72 /Haroobang/Haroobang.htm 662 text/html
136 200 HTTP 61.252.60.72 /Haroobang/cvMapInformationPage.dll 135,168 application/x-msdownload
137 200 HTTP 61.252.60.72 /Haroobang/cvMapInformationPage.dll.config 444 public Expires: Thu, 26 Oct 2006 03:17:23 GMT application/octet-stream


여기 까지 밖에 진행이 안됩니다.

즉,, 페이지가 죽어 버립니다.

이유가 뭔지 궁금 하네요..

Config 관련 때문인건 분명 한데... 흠...

일단 Link 태그는 임베디드 스마트클라이언트 로드 페이지에 넣으라는 내용 같고요..

Config 을 작성 하시라고 하시는 것 같은데..

Config 파일 안에 다운 받을 dll 경로를 설정 하라는 건지? 혹은 아무 의미가 없는 Config 인지?

^^ 제가 이해력이 느리죠?

아무트 친절한 답변 다시한번 기대할께요 ㅠㅠ
#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / 블로그쥔장 / 2006-10-25 오후 12:49:00
-_-; 스마트 클라이언트의 config는 web.config가 아닙니다. 브라우저 내부에 나타나는
스마트 클라이언트 모듈의 config 이라는 것이죠. 이 config에는 스마트 클라이언트 DLL에 대한
configuration을 넣으시면 됩니다.
스마트 클라이언트에 대해 아무런 설정이 필요 없다면 <configuration></configuration> 만 넣어 두시면 됩니다.
#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / 안연준 / 2006-10-25 오후 1:21:00
유경상 님 사랑 합니다 ^^

드디어 쓸대없는 패킷 줄이기 성공 했어요 ^^

말씀대로... Config 내용을 없앴습니다.

그리고....

링크 태그의

<link href="cvMapInformationPage.dll.config" rel="Configuration"> 를

<link href="/Haroobang/cvMapInformationPage.dll.config" rel="Configuration">

요렇게 ㅡ,.ㅡ 결국은 경로 문제네요

하니깐 전에 이 Config 처리를 하지 않던.. 때와 비교해서... 아래와 같은 차의가 납니다.

================= [처리하기 전.........] ===============================

# Result Protocol Host URL Body Caching Content-Type User-defined
1 301 HTTP **.***.60.72 /Haroobang 176 text/html
2 302 HTTP **.***.60.72 /Haroobang/ 160 private text/html; charset=utf-8
3 304 HTTP **.***.60.72 /Haroobang/Haroobang.htm 0
4 200 HTTP **.***.60.72 /Haroobang/cvMapInformationPage.dll 135,168 application/x-msdownload
5 404 HTTP **.***.60.72 /iexplore.exe.config 1,466 text/html
6 404 HTTP **.***.60.72 /cvMapInformationPage.DLL 1,466 text/html
7 404 HTTP **.***.60.72 /cvMapInformationPage/cvMapInformationPage.DLL 1,466 text/html
8 404 HTTP **.***.60.72 /bin/cvMapInformationPage.DLL 1,466 text/html
9 404 HTTP **.***.60.72 /bin/cvMapInformationPage/cvMapInformationPage.DLL 1,466 text/html
10 404 HTTP **.***.60.72 /cvMapInformationPage.EXE 1,466 text/html
11 404 HTTP **.***.60.72 /cvMapInformationPage/cvMapInformationPage.EXE 1,466 text/html
12 404 HTTP **.***.60.72 /bin/cvMapInformationPage.EXE 1,466 text/html
13 404 HTTP **.***.60.72 /bin/cvMapInformationPage/cvMapInformationPage.EXE 1,466 text/html
14 404 HTTP **.***.60.72 /cvRealTimeDataView.DLL 1,466 text/html
15 404 HTTP **.***.60.72 /cvRealTimeDataView/cvRealTimeDataView.DLL 1,466 text/html
16 404 HTTP **.***.60.72 /bin/cvRealTimeDataView.DLL 1,466 text/html
17 404 HTTP **.***.60.72 /bin/cvRealTimeDataView/cvRealTimeDataView.DLL 1,466 text/html
18 404 HTTP **.***.60.72 /cvRealTimeDataView.EXE 1,466 text/html
19 404 HTTP **.***.60.72 /cvRealTimeDataView/cvRealTimeDataView.EXE 1,466 text/html
20 404 HTTP **.***.60.72 /bin/cvRealTimeDataView.EXE 1,466 text/html
21 404 HTTP **.***.60.72 /bin/cvRealTimeDataView/cvRealTimeDataView.EXE 1,466 text/html
22 200 HTTP **.***.60.72 /Haroobang/cvRealTimeDataView.DLL 24,576 application/x-msdownload
23 404 HTTP **.***.60.72 /cvRealTimeDataView.DLL 1,466 text/html
24 404 HTTP **.***.60.72 /cvRealTimeDataView/cvRealTimeDataView.DLL 1,466 text/html
25 404 HTTP **.***.60.72 /bin/cvRealTimeDataView.DLL 1,466 text/html
26 404 HTTP **.***.60.72 /bin/cvRealTimeDataView/cvRealTimeDataView.DLL 1,466 text/html
27 404 HTTP **.***.60.72 /cvRealTimeDataView.EXE 1,466 text/html
28 404 HTTP **.***.60.72 /cvRealTimeDataView/cvRealTimeDataView.EXE 1,466 text/html
29 404 HTTP **.***.60.72 /bin/cvRealTimeDataView.EXE 1,466 text/html
30 404 HTTP **.***.60.72 /bin/cvRealTimeDataView/cvRealTimeDataView.EXE 1,466 text/html
31 404 HTTP **.***.60.72 /cvHourGraphView.DLL 1,466 text/html
32 404 HTTP **.***.60.72 /cvHourGraphView/cvHourGraphView.DLL 1,466 text/html
33 404 HTTP **.***.60.72 /bin/cvHourGraphView.DLL 1,466 text/html
34 404 HTTP **.***.60.72 /bin/cvHourGraphView/cvHourGraphView.DLL 1,466 text/html
35 404 HTTP **.***.60.72 /cvHourGraphView.EXE 1,466 text/html
36 404 HTTP **.***.60.72 /cvHourGraphView/cvHourGraphView.EXE 1,466 text/html
37 404 HTTP **.***.60.72 /bin/cvHourGraphView.EXE 1,466 text/html
38 404 HTTP **.***.60.72 /bin/cvHourGraphView/cvHourGraphView.EXE 1,466 text/html
39 200 HTTP **.***.60.72 /Haroobang/cvHourGraphView.DLL 61,440 application/x-msdownload
40 404 HTTP **.***.60.72 /cvHourGraphView.DLL 1,466 text/html
41 404 HTTP **.***.60.72 /cvHourGraphView/cvHourGraphView.DLL 1,466 text/html
42 404 HTTP **.***.60.72 /bin/cvHourGraphView.DLL 1,466 text/html
43 404 HTTP **.***.60.72 /bin/cvHourGraphView/cvHourGraphView.DLL 1,466 text/html
44 404 HTTP **.***.60.72 /cvHourGraphView.EXE 1,466 text/html
45 404 HTTP **.***.60.72 /cvHourGraphView/cvHourGraphView.EXE 1,466 text/html
47 404 HTTP **.***.60.72 /bin/cvHourGraphView.EXE 1,466 text/html
48 404 HTTP **.***.60.72 /bin/cvHourGraphView/cvHourGraphView.EXE 1,466 text/html
49 404 HTTP **.***.60.72 /cvMapService.DLL 1,466 text/html
50 404 HTTP **.***.60.72 /cvMapService/cvMapService.DLL 1,466 text/html
51 404 HTTP **.***.60.72 /bin/cvMapService.DLL 1,466 text/html
52 404 HTTP **.***.60.72 /bin/cvMapService/cvMapService.DLL 1,466 text/html
53 404 HTTP **.***.60.72 /cvMapService.EXE 1,466 text/html
54 404 HTTP **.***.60.72 /cvMapService/cvMapService.EXE 1,466 text/html
55 404 HTTP **.***.60.72 /bin/cvMapService.EXE 1,466 text/html
56 404 HTTP **.***.60.72 /bin/cvMapService/cvMapService.EXE 1,466 text/html
57 200 HTTP **.***.60.72 /Haroobang/cvMapService.DLL 577,536 application/x-msdownload
58 404 HTTP **.***.60.72 /cvMapService.DLL 1,466 text/html
59 404 HTTP **.***.60.72 /cvMapService/cvMapService.DLL 1,466 text/html
60 404 HTTP **.***.60.72 /bin/cvMapService.DLL 1,466 text/html
61 404 HTTP **.***.60.72 /bin/cvMapService/cvMapService.DLL 1,466 text/html
62 404 HTTP **.***.60.72 /cvMapService.EXE 1,466 text/html
63 404 HTTP **.***.60.72 /cvMapService/cvMapService.EXE 1,466 text/html
64 404 HTTP **.***.60.72 /bin/cvMapService.EXE 1,466 text/html
65 404 HTTP **.***.60.72 /bin/cvMapService/cvMapService.EXE 1,466 text/html
66 404 HTTP **.***.60.72 /cvWonderGrid.DLL 1,466 text/html
67 404 HTTP **.***.60.72 /cvWonderGrid/cvWonderGrid.DLL 1,466 text/html
68 404 HTTP **.***.60.72 /bin/cvWonderGrid.DLL 1,466 text/html
69 404 HTTP **.***.60.72 /bin/cvWonderGrid/cvWonderGrid.DLL 1,466 text/html
70 404 HTTP **.***.60.72 /cvWonderGrid.EXE 1,466 text/html
71 404 HTTP **.***.60.72 /cvWonderGrid/cvWonderGrid.EXE 1,466 text/html
72 404 HTTP **.***.60.72 /bin/cvWonderGrid.EXE 1,466 text/html
73 404 HTTP **.***.60.72 /bin/cvWonderGrid/cvWonderGrid.EXE 1,466 text/html
74 200 HTTP **.***.60.72 /Haroobang/cvWonderGrid.DLL 61,440 application/x-msdownload
75 404 HTTP **.***.60.72 /cvWonderGrid.DLL 1,466 text/html
76 404 HTTP **.***.60.72 /cvWonderGrid/cvWonderGrid.DLL 1,466 text/html
77 404 HTTP **.***.60.72 /bin/cvWonderGrid.DLL 1,466 text/html
78 404 HTTP **.***.60.72 /bin/cvWonderGrid/cvWonderGrid.DLL 1,466 text/html
79 404 HTTP **.***.60.72 /cvWonderGrid.EXE 1,466 text/html
80 404 HTTP **.***.60.72 /cvWonderGrid/cvWonderGrid.EXE 1,466 text/html
81 404 HTTP **.***.60.72 /bin/cvWonderGrid.EXE 1,466 text/html
82 404 HTTP **.***.60.72 /bin/cvWonderGrid/cvWonderGrid.EXE 1,466 text/html
83 404 HTTP **.***.60.72 /cvHourGraph.DLL 1,466 text/html
84 404 HTTP **.***.60.72 /cvHourGraph/cvHourGraph.DLL 1,466 text/html
85 404 HTTP **.***.60.72 /bin/cvHourGraph.DLL 1,466 text/html
86 404 HTTP **.***.60.72 /bin/cvHourGraph/cvHourGraph.DLL 1,466 text/html
87 404 HTTP **.***.60.72 /cvHourGraph.EXE 1,466 text/html
88 404 HTTP **.***.60.72 /cvHourGraph/cvHourGraph.EXE 1,466 text/html
89 404 HTTP **.***.60.72 /bin/cvHourGraph.EXE 1,466 text/html
90 404 HTTP **.***.60.72 /bin/cvHourGraph/cvHourGraph.EXE 1,466 text/html
91 200 HTTP **.***.60.72 /Haroobang/cvHourGraph.DLL 24,576 application/x-msdownload
92 404 HTTP **.***.60.72 /cvHourGraph.DLL 1,466 text/html
93 404 HTTP **.***.60.72 /cvHourGraph/cvHourGraph.DLL 1,466 text/html
94 404 HTTP **.***.60.72 /bin/cvHourGraph.DLL 1,466 text/html
95 404 HTTP **.***.60.72 /bin/cvHourGraph/cvHourGraph.DLL 1,466 text/html
96 404 HTTP **.***.60.72 /cvHourGraph.EXE 1,466 text/html
97 404 HTTP **.***.60.72 /cvHourGraph/cvHourGraph.EXE 1,466 text/html
98 404 HTTP **.***.60.72 /bin/cvHourGraph.EXE 1,466 text/html
99 404 HTTP **.***.60.72 /bin/cvHourGraph/cvHourGraph.EXE 1,466 text/html
100 404 HTTP **.***.60.72 /iexplore.exe.config 1,466 text/html
101 200 HTTP **.***.60.72 /MapService/Service.asmx 464 private, max-age=0 text/xml; charset=utf-8
102 404 HTTP **.***.60.72 /cvMapService.DLL 1,466 text/html
103 404 HTTP **.***.60.72 /cvMapService/cvMapService.DLL 1,466 text/html
104 404 HTTP **.***.60.72 /bin/cvMapService.DLL 1,466 text/html
105 404 HTTP **.***.60.72 /bin/cvMapService/cvMapService.DLL 1,466 text/html
106 404 HTTP **.***.60.72 /cvMapService.EXE 1,466 text/html
107 404 HTTP **.***.60.72 /cvMapService/cvMapService.EXE 1,466 text/html
108 404 HTTP **.***.60.72 /bin/cvMapService.EXE 1,466 text/html
109 404 HTTP **.***.60.72 /bin/cvMapService/cvMapService.EXE 1,466 text/html
110 404 HTTP **.***.60.72 /cmCommonClass.DLL 1,466 text/html
111 200 HTTP **.***.60.72 /MapService/Service.asmx 1,388,420 private, max-age=0 text/xml; charset=utf-8
112 404 HTTP **.***.60.72 /cmFileUpDown.DLL 1,466 text/html
113 404 HTTP **.***.60.72 /cmCommonClass/cmCommonClass.DLL 1,466 text/html
114 404 HTTP **.***.60.72 /cmFileUpDown/cmFileUpDown.DLL 1,466 text/html
115 404 HTTP **.***.60.72 /iexplore.exe.config 1,466 text/html
116 404 HTTP **.***.60.72 /bin/cmCommonClass.DLL 1,466 text/html
117 404 HTTP **.***.60.72 /bin/cmFileUpDown.DLL 1,466 text/html
118 404 HTTP **.***.60.72 /iexplore.exe.config 1,466 text/html
119 404 HTTP **.***.60.72 /bin/cmCommonClass/cmCommonClass.DLL 1,466 text/html
120 404 HTTP **.***.60.72 /bin/cmFileUpDown/cmFileUpDown.DLL 1,466 text/html
121 404 HTTP **.***.60.72 /ko-KR/mscorlib.resources.DLL 1,466 text/html
122 404 HTTP **.***.60.72 /cmCommonClass.EXE 1,466 text/html
123 404 HTTP **.***.60.72 /cmFileUpDown.EXE 1,466 text/html
124 404 HTTP **.***.60.72 /ko-KR/mscorlib.resources/mscorlib.resources.DLL 1,466 text/html
125 404 HTTP **.***.60.72 /cmCommonClass/cmCommonClass.EXE 1,466 text/html
126 404 HTTP **.***.60.72 /cmFileUpDown/cmFileUpDown.EXE 1,466 text/html
127 404 HTTP **.***.60.72 /bin/ko-KR/mscorlib.resources.DLL 1,466 text/html
128 404 HTTP **.***.60.72 /bin/cmCommonClass.EXE 1,466 text/html
129 404 HTTP **.***.60.72 /bin/cmFileUpDown.EXE 1,466 text/html
130 404 HTTP **.***.60.72 /bin/ko-KR/mscorlib.resources/mscorlib.resources.DLL 1,466 text/html
131 404 HTTP **.***.60.72 /bin/cmCommonClass/cmCommonClass.EXE 1,466 text/html
132 404 HTTP **.***.60.72 /bin/cmFileUpDown/cmFileUpDown.EXE 1,466 text/html
133 404 HTTP **.***.60.72 /ko-KR/mscorlib.resources.EXE 1,466 text/html
134 200 HTTP **.***.60.72 /Haroobang/cmCommonClass.DLL 16,384 application/x-msdownload
135 200 HTTP **.***.60.72 /Haroobang/cmFileUpDown.DLL 28,672 application/x-msdownload
136 404 HTTP **.***.60.72 /ko-KR/mscorlib.resources/mscorlib.resources.EXE 1,466 text/html
137 404 HTTP **.***.60.72 /cmCommonClass.DLL 1,466 text/html
138 404 HTTP **.***.60.72 /cmFileUpDown.DLL 1,466 text/html
139 404 HTTP **.***.60.72 /bin/ko-KR/mscorlib.resources.EXE 1,466 text/html
140 404 HTTP **.***.60.72 /cmCommonClass/cmCommonClass.DLL 1,466 text/html
141 404 HTTP **.***.60.72 /bin/ko-KR/mscorlib.resources/mscorlib.resources.EXE 1,466 text/html
142 404 HTTP **.***.60.72 /cmFileUpDown/cmFileUpDown.DLL 1,466 text/html
143 404 HTTP **.***.60.72 /bin/cmCommonClass.DLL 1,466 text/html
144 404 HTTP **.***.60.72 /ko-KR/System.Windows.Forms.resources.DLL 1,466 text/html
145 404 HTTP **.***.60.72 /bin/cmFileUpDown.DLL 1,466 text/html
146 404 HTTP **.***.60.72 /bin/cmCommonClass/cmCommonClass.DLL 1,466 text/html
147 404 HTTP **.***.60.72 /ko-KR/System.Windows.Forms.resources/System.Windows.Forms.resources.DLL 1,466 text/html
148 404 HTTP **.***.60.72 /bin/cmFileUpDown/cmFileUpDown.DLL 1,466 text/html
149 404 HTTP **.***.60.72 /cmCommonClass.EXE 1,466 text/html
150 404 HTTP **.***.60.72 /bin/ko-KR/System.Windows.Forms.resources.DLL 1,466 text/html
151 404 HTTP **.***.60.72 /cmFileUpDown.EXE 1,466 text/html
152 404 HTTP **.***.60.72 /cmCommonClass/cmCommonClass.EXE 1,466 text/html
153 404 HTTP **.***.60.72 /bin/ko-KR/System.Windows.Forms.resources/System.Windows.Forms.resources.DLL 1,466 text/html
154 404 HTTP **.***.60.72 /cmFileUpDown/cmFileUpDown.EXE 1,466 text/html
155 404 HTTP **.***.60.72 /bin/cmCommonClass.EXE 1,466 text/html
156 404 HTTP **.***.60.72 /ko-KR/System.Windows.Forms.resources.EXE 1,466 text/html
157 404 HTTP **.***.60.72 /bin/cmFileUpDown.EXE 1,466 text/html
158 404 HTTP **.***.60.72 /bin/cmCommonClass/cmCommonClass.EXE 1,466 text/html
159 404 HTTP **.***.60.72 /ko-KR/System.Windows.Forms.resources/System.Windows.Forms.resources.EXE 1,466 text/html
160 404 HTTP **.***.60.72 /bin/cmFileUpDown/cmFileUpDown.EXE 1,466 text/html
161 200 HTTP **.***.60.72 /MapService/Service.asmx 464 private, max-age=0 text/xml; charset=utf-8
162 404 HTTP **.***.60.72 /cmCommonClass.DLL 1,466 text/html
163 404 HTTP **.***.60.72 /bin/ko-KR/System.Windows.Forms.resources.EXE 1,466 text/html
164 404 HTTP **.***.60.72 /cmCommonClass/cmCommonClass.DLL 1,466 text/html
165 200 HTTP **.***.60.72 /MapService/Service.asmx 1,178,998 private, max-age=0 text/xml; charset=utf-8
166 404 HTTP **.***.60.72 /bin/ko-KR/System.Windows.Forms.resources/System.Windows.Forms.resources.EXE 1,466 text/html
167 404 HTTP **.***.60.72 /bin/cmCommonClass.DLL 1,466 text/html
168 404 HTTP **.***.60.72 /bin/cmCommonClass/cmCommonClass.DLL 1,466 text/html
169 404 HTTP **.***.60.72 /cmCommonClass.EXE 1,466 text/html
170 404 HTTP **.***.60.72 /cmCommonClass/cmCommonClass.EXE 1,466 text/html
171 404 HTTP **.***.60.72 /bin/cmCommonClass.EXE 1,466 text/html
172 404 HTTP **.***.60.72 /bin/cmCommonClass/cmCommonClass.EXE 1,466 text/html
173 404 HTTP **.***.60.72 /cvEtcInformation.DLL 1,466 text/html
174 404 HTTP **.***.60.72 /cvEtcInformation/cvEtcInformation.DLL 1,466 text/html
175 404 HTTP **.***.60.72 /bin/cvEtcInformation.DLL 1,466 text/html
176 404 HTTP **.***.60.72 /bin/cvEtcInformation/cvEtcInformation.DLL 1,466 text/html
177 404 HTTP **.***.60.72 /cvEtcInformation.EXE 1,466 text/html
178 404 HTTP **.***.60.72 /cvEtcInformation/cvEtcInformation.EXE 1,466 text/html
179 404 HTTP **.***.60.72 /bin/cvEtcInformation.EXE 1,466 text/html
180 404 HTTP **.***.60.72 /bin/cvEtcInformation/cvEtcInformation.EXE 1,466 text/html
181 200 HTTP **.***.60.72 /Haroobang/cvEtcInformation.DLL 28,672 application/x-msdownload
182 404 HTTP **.***.60.72 /cvEtcInformation.DLL 1,466 text/html
183 404 HTTP **.***.60.72 /cvEtcInformation/cvEtcInformation.DLL 1,466 text/html
184 404 HTTP **.***.60.72 /bin/cvEtcInformation.DLL 1,466 text/html
185 404 HTTP **.***.60.72 /bin/cvEtcInformation/cvEtcInformation.DLL 1,466 text/html
186 404 HTTP **.***.60.72 /cvEtcInformation.EXE 1,466 text/html
187 404 HTTP **.***.60.72 /cvEtcInformation/cvEtcInformation.EXE 1,466 text/html
188 404 HTTP **.***.60.72 /bin/cvEtcInformation.EXE 1,466 text/html
189 404 HTTP **.***.60.72 /bin/cvEtcInformation/cvEtcInformation.EXE 1,466 text/html
190 404 HTTP **.***.60.72 /cvSensorInformation.DLL 1,466 text/html
191 404 HTTP **.***.60.72 /cvSensorInformation/cvSensorInformation.DLL 1,466 text/html
192 404 HTTP **.***.60.72 /bin/cvSensorInformation.DLL 1,466 text/html
193 404 HTTP **.***.60.72 /bin/cvSensorInformation/cvSensorInformation.DLL 1,466 text/html
194 404 HTTP **.***.60.72 /cvSensorInformation.EXE 1,466 text/html
195 404 HTTP **.***.60.72 /cvSensorInformation/cvSensorInformation.EXE 1,466 text/html
196 404 HTTP **.***.60.72 /bin/cvSensorInformation.EXE 1,466 text/html
197 404 HTTP **.***.60.72 /bin/cvSensorInformation/cvSensorInformation.EXE 1,466 text/html
198 200 HTTP **.***.60.72 /Haroobang/cvSensorInformation.DLL 36,864 application/x-msdownload
199 404 HTTP **.***.60.72 /cvSensorInformation.DLL 1,466 text/html
200 404 HTTP **.***.60.72 /cvSensorInformation/cvSensorInformation.DLL 1,466 text/html
201 404 HTTP **.***.60.72 /bin/cvSensorInformation.DLL 1,466 text/html
202 404 HTTP **.***.60.72 /bin/cvSensorInformation/cvSensorInformation.DLL 1,466 text/html
203 404 HTTP **.***.60.72 /cvSensorInformation.EXE 1,466 text/html
204 404 HTTP **.***.60.72 /cvSensorInformation/cvSensorInformation.EXE 1,466 text/html
205 404 HTTP **.***.60.72 /bin/cvSensorInformation.EXE 1,466 text/html
206 404 HTTP **.***.60.72 /bin/cvSensorInformation/cvSensorInformation.EXE 1,466 text/html


================ [Config 처리 후] ====================================

# Result Protocol Host URL Body Caching Content-Type User-defined
247 302 HTTP **.***.60.72 /Haroobang/ 160 private text/html; charset=utf-8
248 304 HTTP **.***.60.72 /Haroobang/Haroobang.htm 0
249 304 HTTP **.***.60.72 /Haroobang/cvMapInformationPage.dll 0
250 304 HTTP **.***.60.72 /Haroobang/cvMapInformationPage.DLL 0
252 304 HTTP **.***.60.72 /Haroobang/cvRealTimeDataView.DLL 0
253 304 HTTP **.***.60.72 /Haroobang/cvHourGraphView.DLL 0
254 304 HTTP **.***.60.72 /Haroobang/cvMapService.DLL 0
255 304 HTTP **.***.60.72 /Haroobang/cvWonderGrid.DLL 0
256 304 HTTP **.***.60.72 /Haroobang/cvHourGraph.DLL 0
257 200 HTTP **.***.60.72 /Haroobang/cvMapInformationPage.dll.config 0 public Expires: Thu, 26 Oct 2006 04:09:56 GMT
258 200 HTTP **.***.60.72 /MapService/Service.asmx 464 private, max-age=0 text/xml; charset=utf-8
259 304 HTTP **.***.60.72 /Haroobang/cmCommonClass.DLL 0
260 200 HTTP **.***.60.72 /MapService/Service.asmx 1,388,420 private, max-age=0 text/xml; charset=utf-8
261 304 HTTP **.***.60.72 /Haroobang/cmFileUpDown.DLL 0
262 404 HTTP **.***.60.72 /Haroobang/ko-KR/mscorlib.resources.DLL 1,466 text/html
263 404 HTTP **.***.60.72 /Haroobang/ko-KR/System.Windows.Forms.resources.DLL 1,466 text/html
264 404 HTTP **.***.60.72 /Haroobang/ko-KR/mscorlib.resources/mscorlib.resources.DLL 1,466 text/html
265 404 HTTP **.***.60.72 /Haroobang/ko-KR/System.Windows.Forms.resources/System.Windows.Forms.resources.DLL 1,466 text/html
266 404 HTTP **.***.60.72 /Haroobang/bin/ko-KR/mscorlib.resources.DLL 1,466 text/html
267 404 HTTP **.***.60.72 /Haroobang/bin/ko-KR/System.Windows.Forms.resources.DLL 1,466 text/html
268 404 HTTP **.***.60.72 /Haroobang/bin/ko-KR/mscorlib.resources/mscorlib.resources.DLL 1,466 text/html
269 404 HTTP **.***.60.72 /Haroobang/bin/ko-KR/System.Windows.Forms.resources/System.Windows.Forms.resources.DLL 1,466 text/html
270 404 HTTP **.***.60.72 /Haroobang/ko-KR/mscorlib.resources.EXE 1,466 text/html
271 404 HTTP **.***.60.72 /Haroobang/ko-KR/System.Windows.Forms.resources.EXE 1,466 text/html
273 404 HTTP **.***.60.72 /Haroobang/ko-KR/mscorlib.resources/mscorlib.resources.EXE 1,466 text/html
274 404 HTTP **.***.60.72 /Haroobang/ko-KR/System.Windows.Forms.resources/System.Windows.Forms.resources.EXE 1,466 text/html
275 404 HTTP **.***.60.72 /Haroobang/bin/ko-KR/mscorlib.resources.EXE 1,466 text/html
276 404 HTTP **.***.60.72 /Haroobang/bin/ko-KR/System.Windows.Forms.resources.EXE 1,466 text/html
278 404 HTTP **.***.60.72 /Haroobang/bin/ko-KR/mscorlib.resources/mscorlib.resources.EXE 1,466 text/html
279 404 HTTP **.***.60.72 /Haroobang/bin/ko-KR/System.Windows.Forms.resources/System.Windows.Forms.resources.EXE 1,466 text/html
280 304 HTTP **.***.60.72 /Haroobang/cvEtcInformation.DLL 0
281 304 HTTP **.***.60.72 /Haroobang/cvSensorInformation.DLL 0



그리고 각각의 컴포넌트 dll 마다는 생성자에 아래와 같은 코드를 추가 했어요

무슨 위성 어셈블리 탐색을 없애 주는 거라고 하던데요

System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("");

요렇게 넣어 줬어요... 그래도 몇개의 404가 보이네요 이정도면 구동하는게 크게 지장이 없겠죠?

#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / 이재현 / 2006-12-02 오후 6:17:00
fiidller로는 성공적으로 닫았습니다.
vs 2005로 사용하여 실행하면 계속 X표만 나옵니다.
sdk디버그인 fuslogvw를 돌리면 다음과 같은 메세지가 나옵니다.

작업을 수행하지 못했습니다.
바인딩 결과: hr = 0x80070002. 지정된 파일을 찾을 수 없습니다.

다음 위치에서 어셈블리 관리자 로드: D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
다음 실행 파일에서 실행: C:\Microsoft Visual Studio 8\Common7\IDE\devenv.exe
--- 자세한 오류 로그가 아래에 표시됩니다.

=== 미리 바인딩된 상태 정보 ===
로그: 사용자 = LEEZEN\lsc
로그: DisplayName = Microsoft.VisualStudio.Web, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
(Fully-specified)
로그: Appbase = file:///D:/Documents and Settings/lsc/My Documents/Visual Studio 2005/WebSms/
로그: 초기 PrivatePath = D:\Documents and Settings\lsc\My Documents\Visual Studio 2005\WebSms\bin
로그: 동적 베이스 = D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\websms\1b44e3eb
로그: 캐시 베이스 = D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\websms\1b44e3eb
로그: AppName = e11a1568
호출 어셈블리: (Unknown).
===
로그: 이 바인딩은 default 로드 컨텍스트에서 시작됩니다.
로그: 응용 프로그램 구성 파일 D:\Documents and Settings\lsc\My Documents\Visual Studio 2005\WebSms\web.config을(를) 사용합니다.
로그: D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config에서 컴퓨터 구성 파일을 사용합니다.
로그: 사후 정책 참조: Microsoft.VisualStudio.Web, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
로그: 동일한 바인딩이 이미 있어 hr = 0x80070002과(와) 함께 오류가 발생했습니다.
오류: 사전 다운로드 확인을 수행하는 동안 복구할 수 없는 오류가 발생했습니다(hr = 0x80070002).

이 놈의 에러때문에 2주일째 헤메고 있습니다.
#re: 스마트 클라이언트, 그것을 알려주마 (IV) : App Base Directory & Configuration / 블로그쥔장 / 2006-12-04 오후 2:01:00
이재현님... 저는 당췌 무슨 말씀이신지 정확히 이해가 안됩니다만...
vs 2005로 사용하여 실행한다는 말씀이 무슨 말씀이신지 모르겠습니다만...
보여주신 로그 정보는 스마트클라이언트에 대한 로그가 아닌 ASP.NET 웹 어플리케이션의 로그 정보로 보입니다만...
무슨 에러를 말씀하지는지도 전혀 이해가 안갑니다.
추가적인 질문이 있으시다면 메일로 해주시기 바랍니다.
이곳은 제 글에 대한 의견을 말하는 곳이지 질문을 하는 곳이 아님을 양지해 주십시요.