2011-02-07 5 views
0

서버와의 통신에 WCF를 사용하는 Silverlight 응용 프로그램이 있습니다. Silverlight와 WCF는 모두 로컬 시스템 (localhost)에서 실행됩니다. Silverlight가 서비스에 대한 호출을하면 통신 예외로 인해 실패합니다. clientaccesspolicy 파일이 없기 때문에 WCF 끝점이 실행 중이므로 http://localhost:port 인터페이스 IPolicyRetriver를 정의하고 스트림에 clientaccesspolicy를 반환하는 서비스를 구현에 추가했습니다.Silverlight - localhost에서 WCF clientaccesspolicy 가져 오기

제 질문은 문제없이 실행되도록 구성해야하는 것입니다. ServiceReference.ClientConfig 파일에 뭔가를 변경하거나 추가해야한다는 것을 이해 합니다만, 나는 무엇을 이해하지 못합니다. 아래 ServiceReference.ClientConfig를 포함 시켰습니다. 변경하거나 추가 할 내용과 Silverlight에서이 코드를 추가 할 위치를 알려주십시오. 지난 2 일 동안 할 수있는 모든 링크를 열어 놓은 것처럼 나를 돕기 위해 링크를 붙여 넣지 마십시오.하지만 여전히 이해할 수는 없습니다.

<configuration> 
<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_IMapService" maxBufferSize="2147483647" 
       maxReceivedMessageSize="2147483647"> 
       <security mode="None" /> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="../MapService.svc" binding="basicHttpBinding" 
      bindingConfiguration="BasicHttpBinding_IMapService" contract="MapService.IMapService" 
      name="BasicHttpBinding_IMapService" /> 
    </client> 
</system.serviceModel> 

HELP ME PLEASE!

답변

0

서비스 구성이나 코드를 변경하지 않아도됩니다. 서비스 웹 사이트의 루트에 clientaccesspolicy.xml을 배치하십시오. Visual Studio를 사용하는 경우이 기능을 사용하려면 속성을 변경해야 할 수 있습니다. Silverlight는 파일의 존재 여부를 검색합니다. 피들러 (Fiddler)와 같은 도구를 사용하여 Silverlight에서 파일을 찾는 위치를 확인하는 데 도움이 될 수 있습니다.

매우 도움이되는 링크가 있지만 링크를 원하지 않으므로 제공하지 않겠습니다.

+0

저는 ROOT of Service 웹 사이트가 없습니다. 나는 localhost에서 실행 중이다. 그리고 당신은 무엇이 propery 변화를 의미합니까? 피 들러를 사용하는 방법? – gln

+0

예, 로컬 호스트에도 루트가 있습니다. "htt p : // localhost : PortNumber /"는 루트이며, Silverlight가 clientaccesspolicy.xml 파일을 찾을 곳입니다. 속성을 올바르게 기억하면 사이트 속성 페이지의 "웹"탭에서 Visual Studio의 가상 경로를 "/"로 설정합니다. – DaveB

1

언급 한 IPolicyRetriever 구현은 포함하지 않았지만 사용할 수있는 샘플은 다음과 같습니다.

인터페이스 사양 :

[ServiceContract] 
public interface IPolicyRetriever 
{ 
    [OperationContract, WebGet(UriTemplate = "/clientaccesspolicy.xml")] 
    Stream GetSilverlightPolicy(); 

    //[OperationContract, WebGet(UriTemplate = "/crossdomain.xml")] 
    //Stream GetFlashPolicy(); 
} 

인터페이스의 구현 :

// IPolicyRetriever implementation 
    private Stream StringToStream(string result) 
    { 
     WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml"; 
     return new MemoryStream(Encoding.UTF8.GetBytes(result)); 
    } 

    public Stream GetSilverlightPolicy() 
    { 
     string result = @"<?xml version=""1.0"" encoding=""utf-8""?> 
      <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>"; 

     return StringToStream(result); 
    } 

그런 다음 서버의 구성 XML 파일에 다음을 포함 할 수 있습니다. 이것은 클라이언트 측이 아니라 서버 측에 있어야합니다. 귀하의 질문에 위의 클라이언트 구성을 포함 시켰기 때문에 나는 이것을 강조하고 있습니다. (이 내가 그것을보다는 ClientConfig 파일을 사용하기 때문에 위의 샘플이 100 % 정확하지 않을 수 있습니다 방법입니다) 프로그램 호스트를 만들하기로 결정 또는 경우

<behaviors> 
    <endpointBehaviors> 
    <behavior name="WebHttpNewBehavior"> 
     <webHttp /> 
    </behavior> 
    </endpointBehaviors> 
    ... 
</behaviors> 
<services> 
    <service behaviorConfiguration="NewBehavior"> 
    <endpoint behaviorConfiguration="WebHttpNewBehavior" binding="webHttpBinding" 
       bindingConfiguration="" name="PolicyEndpoint" contract="WCFService.IPolicyRetriever" /> 
    ... 
    </service> 
</services> 

:

ServiceHost host = new ServiceHost(serviceType); 
host.AddServiceEndpoint(typeof(IPolicyRetriever), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior()); 

링크를 제공하지 말 것을 요청했지만이 순간에 Silverlight/WCF 프로젝트에 대한 액세스 권한이 없으므로 http://blogs.msdn.com/b/asiatech/archive/2010/05/07/how-to-consume-a-self-hosted-wcf-service-in-a-cross-domain-environment-by-silverlight-client.aspx을 참조로 사용하여 메모리를 새로 고칩니다.

+0

ServiceHost ... 코드는 어디에 두어야합니까? – gln

+0

Silverlight 구성 요소에서 액세스하려면 WCF 서버의 어딘가에서 ServiceHost를 이미 만들어야합니다. XML 설정을 사용하여 ServiceHost를 만들면 어디에서나 코드를 사용할 필요가 없습니다. 대신 포함 된 XML을 사용할 수 있습니다. – dlanod

+0

getSilverlightPolicy를 호출해야합니까? 그렇다면 - 어디에서? 그리고 만약 아니라면 - 실버 라이트는 그것을 어떻게 부를 수 있는지 알고 있습니까? – gln

관련 문제