상세 컨텐츠

본문 제목

[WCF] URI ~에 대한 요청을 만드는 동안 오류가 발생했습니다.

Web Development/Web Service

by thankee 2009. 10. 11. 02:18

본문

 

에러 메시지는 ‘URI 'http://localhost:19982/MyWCF.Service/serviceForSilverlight.svc'에 대한 요청을 만드는 동안 오류가 발생했습니다. 적절한 상호 도메인 정책 없이 상호 도메인 경로의 서비스에 액세스하려고 했거나 SOAP 서비스에 적합하지 않은 정책을 사용하려고 했기 때문일 수 있습니다. 서비스 소유자에게 문의하여 상호 도메인 정책 파일을 게시하고 SOAP 관련 HTTP 헤더가 전송될 수 있도록 할 수 있습니다. 이 오류는 InternalsVisibleToAttribute 특성을 사용하지 않고 웹 서비스 프록시에서 내부 형식을 사용해서 발생한 문제일 수도 있습니다. 자세한 내용은 내부 예외를 참조하십시오.’ 입니다.

해결

  1. 보통 눈치가 빠른 분들은 금방 알아 차리셨겠지만, 위에서 예를 든 에러는 주소를 잘못 입력해서 나타나는 경우입니다. 위의 주소만 봐도 ‘localhost:19982’가 눈에 뛰는데요, 보통 VisualStudio Development Server로 WCF를 페이지로 띄어보고 그 주소를 그대로 Silverlight 또는 ASP.NET에서 사용한 경우에 발생합니다. 위의 에러가 나면 먼저 주소가 제대로 되었는지 다시 한번 확인해 보는 것이 필요합니다.
  2. WCF를 사용하면서 접하게 되는 가장 당혹스러운 일은 WebService참조를 추가하고 업데이트를 하다보면은 주소가 자동으로 localhost로 바뀌는 버그가 있다는 점입니다. 예를 들어 WebService 주소를 "http://192.168.0.20:88/Service.svc?wsdl"로 설정하였더라도, 가끔식 주소가 "http://localhost:88/Service.svc?wsdl"로 변경되버립니다. 따라서 에러가 발생하면 주소를 확인하고 주소를 원하는 주소로 다시 되돌리시면 됩니다.
  3. 마지막으로 많이 발생하는 경우가 바로 ‘상호 도메인 정책’파일을 WCF 측에 게시하지 않았기 때문입니다. crossdomain.xml과 clientaccesspolicy.xml 둘 중에 하나를 작성하여 WebService Server의 Root에 올려두시면 됩니다. crossdomain.xml은 Flesh 측에서 사용했던 ‘상호 도메인 정책파일’로서 Silverlight에서도 사용가능 하지만 대부분의 고급 옵션들의 사용이 제한됩니다. clientaccesspolicy.xml은 WCF가 Silverlight를 위해서 제공하는 ‘상호 도메인 정책파일’입니다. Silverlight개발을 하신다면 clientaccesspolicy.xml을 작성하여 사용하시면 됩니다.
    clientaccesspolicy.xml
    <?xml version="1.0" encoding="utf-8"?>
    <access-policy>
        <cross-domain-access>
        <policy>
            <!-- http-request-headers를 설정하여 특정 헤더를 포함하는 요청만 허용할 수 있습니다. -->
            <allow-from http-request-headers="*">
                <!-- 어떤 도메인에 대해서 Service를 허용할 것인가. 아래는 전체 도메인에 대한 허용 -->
                <domain uri="*"/>
            </allow-from>
            <grant-to>
                <!-- 어떤 자원을 허용할 것인가. -->
                <resource path="/" include-subpaths="true"/>
            </grant-to>
        </policy>
      </cross-domain-access>
    </access-policy>
    crossdomain.xml
    <?xml version="1.0"?>
    <!DOCTYPE cross-domain-policy SYSTEM
      "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
    <cross-domain-policy>
      <allow-http-request-headers-from domain="* " headers="*" />
    </cross-domain-policy>
    둘 중에 하나만 넣거나 둘 다 넣어도 동작하며, 가장 유의해야 할 것은 Web Service서버의 루트에 파일을 올려두는 것입니다!

관련글 더보기