실버라이트가 HTTPS 프로토콜을 통해 WCF를 이용할 때, 다음 파일들의 설정에 의해 성패가 좌우됩니다.
1. Web.config (서버측)
2. clientaccesspolicy.xml (서버측)
3. ServiceReference.ClientConfig (클라이언트측 - 실버라이트 프로젝트에 포함)
그러면 순서대로 하나하나 살펴 보겠습니다.
1. Web.config
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="SelfServiceTypeBehaviors">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="SelfServiceTypeBehaviors"
name="Foo.MyProduct.Service.SelfServicee">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="secureHttp"
bindingNamespace="http://foo.com/Service.SelfService/"
contract="Foo.MyProduct.Service.SelfService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="userHttp">
<!-- this is for demo only. Https/Transport security is recommended -->
<security mode="None"/>
</binding>
<binding name="secureHttp">
<!-- this is for demo only. Https/Transport security is recommended -->
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<!-- this is needed since this service is only supported with HTTP protocol -->
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
WCF 서비스를 HTTPS프로토콜로 지원하기 위해서는 보안 바인딩을 사용해야 하는데요.
기본으로 생성되어 있는 binding을 수정하여 사용해도 되고, 해당 웹서버에서 서비스에 따라 HTTP와 HTTPS를 선택적으로 지원해야 한다면 새 binding을 추가합니다.
위에 보시면, Foo.MyProduct.Service.SelfServicee란 서비스는 secureHttp란 binding을 새로 만들어서 사용하고 있는
것이 보이실 것입니다. <transport clientCredentialType="None"/>는 생략하셔도 무방합니다.
2. clientaccesspolicy.xml
실버라이트 클라이언트에 대해서 접근권한을 정의해 놓은 파일입니다.
이 파일은 기본적으로 아래와 같은 내용입니다.
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
domain uri를 *를 설정해 놓았으니 프로토콜에 관계없이 open이 될 것 같습니다만 그렇지 않구요.
다음과 같이 변경해 주셔야 합니다.
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="http://*"/>
<domain uri="https://*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
3. ServiceReference.ClientConfig
이 파일은 실버라이트 프로젝트에 '서비스 참조(Service Reference)'가 최초로 추가되는 순간 자동으로 생성되어,
서비스 참조에 대한 설정을 담고 있습니다.
앞서 1. Web.config의 설정이 HTTPS에 맞게 잘 되어있으면 정상적인 설정 값이 생성됩니다.
HTTP프로토콜을 이용하는 서비스와 다른 부분을 굵은 글자로 표시하였습니다.
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_SelfService" maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647">
<security mode="Transport" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://foo.com/Service/SelfService.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_SelfService"
contract="Service.SelfService" name="BasicHttpBinding_SelfService" />
</client>
</system.serviceModel>
서버 측의 Web.config 설정 이상으로 해당 서비스가 HTTPS 프로토콜을 지원하지 않으면,
서비스 참조시 endpoint address에는 http://로 시작하는 주소가 등록되고, 이에 대한 binding security mode가 자동으로 None으로 설정되니 이때는 서버측을 확인해 보시기 바랍니다.
그리고 간혹 서비스 참조 시 주소로 정확하게 https://foo.com/... 이렇게 입력했는데, 설정파일에는 https://foo-server/... 등으로 변경되어 등록되는 경우가 있어서 확인 및 수정이 필요합니다.
(여기서 foo-server로 가정한 것은 서버의 호스트 이름입니다.)
이런 일은 IIS에서 웹사이트를 생성할 때 도메인을 특정하지 않은 경우(도메인명을 비워두는 경우) 일어날 수 있습니다.
감사합니다.
[출처] 실버라이트 네이버 카페