본문 바로가기

IT 살이/04. 기술 - 프로그래밍

URL에 의한 ClickOnce 애플리케이션 구동시 문제

1 에러 상황

다음은 현재 달봉이가 투입된 프로젝트에서 발생하는 현상이다.
ClickOnce로 배포된 EXE 타입의 .NET 애플리케이션을 링크 URL 호출을 통해서 구동하는 형태의 시스템 구조이다. 문제는 URL에 첨부한 파라미터가 EXE 애플리케이션으로 전달되지 않는다는 것이다.

http://***/Container/LemContainer.application?userid=lem15

url로 넘기는 GET 파라미터 userid 값이 전달되지 않는다는 것이다. fiddler를 통해서 HTTP 요청을 캡쳐해보니 다음 그림처럼 원래의 요청외에도 계속 다른 요청이 추가되는 것이었다.
1244482260
두번째의 HTTP 요청에는 GET 파라미터가 삭제된다는 것을 확인 할 수 있었는데, 결국 문제는 두번째 요청이 왜 발생하는지에 대한 원인을 밝혀내는 것이었다.

2. 테스트

가상 디렉토리 Container 대신에 새로운 가상 디렉토리 ClickOnce를 생성해서 테스트를 해봤다. 구조는 그림과 같다.

1140340762

새로 구성된 ClickOnce 애플리케이션은 IIS에서 제공하는 거의 디폴트 세팅을 유지하고 있다. 그런 다음 ClickOnce 디렉토리의 파일을 요청했다.

http://***/lem/clickonce/Lem.Win.TestTeam.Winform.application?userid=lem15

HTTP 요청을 캡쳐한 모습은 다음과 같았다.
1365211929

달봉이가 원하는 결과였다.

3 달봉이의 추측

그럼 가상 디렉토리 세팅과 관련된 문제일까?
아니면 ClickOnce 배포 방식과 관련된 문제? 두번째 호출과 세번째 호출 .exe.manifest 호출은 언제 일어나는 것일까?

4 솔루션

달봉이의 두번째 추측이 해답이었다.
Visual Studio.NET 2005 에서는 ClickOnce 게시를 위한 프로젝트 드자이너를 제공하고 있다. Visual Studio.NET의 솔루션 탐색기에서 배포하고 싶은 프로젝트 오른쪽 클릭->속성->게시(publish)탭 을 선택하면 볼 수 있다.
1181499744

ClickOnce 게시 디자이너 폼

이 프로젝트 디자이너 폼에서 옵션 버튼을 클릭하면 다음과 같은 화면이 팝업된다.
1235807062

게시 옵션 창

그림에 표시한 것처럼 "응용 프로그램으로 URL 매개변수가 전달되도록 허용"이라는 옵션이 있는데, 이것을 체크하면 해결된다. 이렇게 하면 다음 코드처럼 배포 메너페스트 파일(.application)에 GET 파라미터를 붙여서 호출하고, 그것을 EXE 프로그램에서 받을 수 있게 된다.
http://***/lem/clickonce/Lem.Win.TestTeam.Winform.application?userid=lem15

5. 과제

문제는 해결하기 했지만, 해결하는 과정에서 ClickOnce 애플리케이션이 구동되는 정확한 메커니즘을 정리해야 겠다는 생각을 다시 한번 더 하게 됐다. 분면 .application 확장자와 관련된 MIME 타입과 MIME 필터가 관여되어 있을 것이라는 추측이다.