후우… 이건 뭐 챙피도 보통 챙피가 아니네요.
아무리 해봐도 퍼가기에서 애플리케이션이 동작을 안하길래 1시간 동안 별 쌩쑈를 다 했는데… 결국 서버에 해줘야 할 가장 기본적인 설정을 안해줘서 생긴 문제였어요.

이 기회에 실버라이트 서비스를 위해 필요한 서버측의 준비 사항을 정리해봅니다.

 

[필수]

올바른 MIME-TYPE 등록과 Content-type 응답

먼저 서버에는 반드시 다음과 같이 XAP에 대한 MIME-TYPE이 등록되어 있어야 해요.

확장자 : XAP
MIME-TYPE : application/x-silverlight-app

IIS6의 경우 MIME-TYPE이 없을 경우 애초에 다운로드부터 실패하므로 비교적 원인을 빨리 찾을 수 있는데요,
Tomcat 등으로 돌린 호스트는 MIME-TYPE을 등록하지 않더라도 기본적으로 다운로드를 허용하죠. 그래서 웹 디버깅 툴로 HTTP 200 떨어지는 걸 보고는 MIME-TYPE 문제는 아닐 것이다…라고 안심하고 다른 곳에서 삽질한거죠.

또한 실버라이트 2에서는 서버가 XAP에 응답할 때에는 반드시 올바른 Content-Type을 헤더에 포함하고 있어야 해요.

예)
HTTP/1.1 200 OK
Content-Length: 321175
Content-Type: application/x-silverlight-app
…생략…

자 외쳐봅시다!

프로젝트 시작하면 MIME-TYPE 등록!
다운되는 XAP도 다시 보자!

(참고로 고맙게도 IIS7에서는 XAP에 대한 올바른 MIME-TYPE이 처음부터 등록되어 있어요)

[크로스 도메인에 따른 옵션]

크로스 도메인에 대한 리소스 접근 허용시 clientaccesspolicy.xml 등록

만약 실버라이트 애플리케이션이 크로스 도메인을 넘어 서버에 리소스를 요청할 때에는 반드시 해당 도메인의 최상위 경로에 clientaccesspolicy.xml이 있어야 해요. 물론 크로스 도메인 접근을 허용하지 않는다면 없어도 되겠죠.

참고 : http://timheuer.com/blog/archive/2008/04/06/silverlight-cross-domain-policy-file-snippet-intellisense.aspx
참고 : http://msdn.microsoft.com/en-us/library/cc197955(VS.95).aspx

 

크로스 도메인에서 실버라이트 실행시 스크립트 사용 허용

만약 실버라이트 애플리케이션이 크로스 도메인 영역에서 실행되고 있다면 기본적으로 스크립트 관련 기능이 사용 불가능 상태가 되는데요, 코드에 따라 다음의 설정들이 필요할 수 있어요.

  • AppManifest.xml에 설정 추가

모든 스크립트 관련 기능을 사용하려면 다음 그림과 같이 실버라이트 애플리케이션 프로젝트의 Properties 아이템을 확장해보면 AppManifest.xml 파일이 보이는데요, 여기에 아래의 설정을 추가해 줘야 해요.

 <Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    ExternalCallersFromCrossDomain="ScriptableOnly">
    <Deployment.Parts>
    </Deployment.Parts>
</Deployment>

  • enableHtmlAccess 설정

HtmlPage 클래스에서 호스트 HTML 페이지에 접근하려면 실버라이트 <object>태그의 <param>중에 다음의 설정을 추가해야 해요.

<param name="enableHtmlAccess" value="true" />

 

  • allowHtmlPopupWindow 설정

HtmlPage.PopupWindow 메서드를 사용하여 팝업을 할 필요가 있다면 실버라이트 <object>태그의 <param>중에 다음의 설정을 추가해야 해요.

<param name="allowHtmlPopupWindow" value="true" />

 

이런 설정들이 없을 때 나오는 증상은 대체로 화면이 허옇게 나오면서 아무것도 안나오거나, Alert이나 Popup이 안되거나, 휠 마우스가 안된다거나, Scriptable로 등록한 JavaScript 오브젝트와의 통신이 안된다거나 하는 현상이에요. 이런 현상을 겪더라도 쫄지마시고 순서대로 짚어 보세요.

저작자 표시 동일 조건 변경 허락
신고
Posted by gongdo
경험있는 개발자라면 절대로 해서는 안될 말 중에 ‘어? 제 PC에서는 되던데요…’가 있죠. 저도 평소에 절대로 이런 말을 하지 않으려고 노력하지만 이번에 또 저질러 버렸네요.

아마 실버라이트 개발 해봤다면 localhost에서는 잘 되었던 애플리케이션이 웹 서버에만 올리면 잘 안되었던 경험이 있을 거에요. 99.9% 이상의 확률로 명백하게 개발자의 실수인데요, 보통은 하드 코딩된 URI나 크로스 도메인, 혹은 웹 서버의 세팅 문제 등이죠.

하지만 이번에 제가 겪었던 것은 절대로 그런 문제가 아니었어요. 모든 URI는 세팅 파일을 통해 완전하게 컨트롤 되고 있고 크로스 도메인에 있는 리소스는 clientaccesspolicy.xml 파일을 통해 올바로 가져올 수 있으며 웹 서버의 세팅도 완벽했죠. 그런데 이상하게 제 PC에서는 되고 고객사의 PC에서는 안되는 거였어요.

기억을 더듬어 가능성이 있는 모든 설정이나 세팅, 코드를 수 차례 확인 했지만 역시 찾을 수 없었는데 한 가지 특이한 사항이라면 심지어 깨끗하게 새로 설치한 시스템에서도 해당 애플리케이션이 잘 돌아가는 걸 확인 했는데 유독 고객사의 PC에서만 그런 현상이 일어난거죠.

바로 이런 경우라면 십중 팔구 고객사의 네트워크 환경이나 특정 설정 등에 문제가 있다고 봐도 좋아요.

여튼 문제 해결을 위해 삽질도 좀 하고 다른 개발자들과 수다를 떨면서토의을 하면서 알아낸 것은!

 

 

바로 고객사의 PC에서는 해당 크로스 도메인 사이트를 ‘신뢰할 수 있는 사이트’에 등록해뒀던 거였어요. 왜 보통 자기 회사 사이트는 이것저것 보안 경고 뜨는 것도 귀찮고 해서 신뢰할 수 있는 사이트에 등록할 때도 있잖아요. 그게 문제였던 거죠.
(문제 해결에 큰 도움을 준 훈스닷넷 서동진 시삽님에게 감사^^)

그게 왜 문제나고요? 한번 다음의 애플리케이션을 통해 알아보죠.

이 애플리케이션은 Shiverlight.net에 있는 XAP파일을 받아서 실행되고 Hugeflow.com에 있는 이미지 파일을 가져오게 되어 있어요. 전형적인 크로스 도메인 시나리오죠.

아마도 휴즈플로우의 로고가 보일거에요. 자, 이제 hugeflow.com을 익스플로러의 도구->인터넷 옵션->보안->신뢰할 수 있는 사이트->사이트 버튼을 눌러 등록해 보세요. 그리고 브라우저를 새로 고침 해보세요.

아마도 이젠 이미지를 가져오는데 실패했다는 에러 메시지가 뜰거에요.

하지만 반대로 shiverlight.net만 신뢰할 수 있는 사이트로 등록할 경우는 문제 없이 되는 걸 확인할 수 있죠. 정리하자면…

[인터넷 영역] --- NOT OK ---> [신뢰할 수 있는 영역]

[신뢰할 수 있는 영역] –-- OK ---> [인터넷 영역]

[신뢰할 수 있는 영역] --- OK ---> [신뢰할 수 있는 영역]

[인트라넷 영역] --- OK ---> [신뢰할 수 있는 영역]

이러한 특성은 실제로 당하게 되면 굉장히 당황할 수 있어요. 보통 웹 디버깅 때 피들러를 많이 사용하는데요, 피들러에서 위 애플리케이션을 보면…

(hugeflow.com이 신뢰할 수 있는 사이트가 아닐 때)

(hugeflow.com이 신뢰할 수 있는 사이트일 때)

보는 것 처럼 심지어 크로스 도메인의 유효성 확인을 위한 clientaccesspolicy.xml 파일 조차 요청하지 않는 것을 알 수 있죠.

이 말은 크로스 존 접근 제약은 크로스 도메인 접근 제약에 우선한다는 걸 의미해요.

여튼 오늘도 한 건 해결. 이제 다른 일 해야지.

저작자 표시 동일 조건 변경 허락
신고
Posted by gongdo


티스토리 툴바