문제

나는 MSDN에 대한 많은 링크를 보았고 "내 컴퓨터에서 작동합니다!" 답변이므로 내가하고있는 일을 복제하기 위해 정확한 단계로 질문을하고 싶습니다.우리는 이미 존재하는 웹 서비스를 사용하고 있기 때문에 온라인의 많은 튜토리얼 및 비디오와 달리 내 프로젝트 외부에서 웹 서비스를 호스팅하는 맥락에서 질문하고 있습니다.그래서 여기에 간다:

*** 새 ASP.NET 웹 서비스 프로젝트를 만듭니다.

"HelloWorld" 웹 메소드를 노출하는 기존 Service.asmx 파일과 함께 제공됩니다.

브라우저에서 보고 "호출" 버튼을 누르세요."Hello World" 문자열을 반환하는 작업이 수행되어야 합니다.

내 컴퓨터의 URL은 다음과 같습니다."http://localhost:15511/WebSite5/Service.asmx"

*** Visual Studio의 새 인스턴스를 시작하고 Silverlight 웹 응용 프로그램 프로젝트를 만듭니다.

*** 웹 서비스를 호출하려면 이벤트 핸들러가 있는 단일 버튼을 거기에 붙이세요.나는 개인적으로 Grid를 핵무기로 만들고 간단한 StackPanel을 사용합니다.예.

<UserControl x:Class="SilverlightApplication1.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300">
    <StackPanel>
        <Button Click="Button_Click">
            <Button.Content>
                <TextBlock Text="Test"/>
            </Button.Content>
        </Button>
    </StackPanel>
</UserControl>

Button_Click에 대한 문 및 이벤트 핸들러를 사용하여 웹 참조를 추가합니다.

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        ServiceSoapClient client = new ServiceSoapClient();
        client.HelloWorldCompleted += (object s, HelloWorldCompletedEventArgs ea) => { 
            MessageBox.Show(ea.Result); 
        };
        client.HelloWorldAsync();
    }

실행하면 물론 도메인 간 문제로 인해 폭발합니다.그럼 다음에는 클라이언트액세스정책.xml 서비스를 호스팅하는 웹 애플리케이션의 루트에 다음을 포함하는 파일을 추가합니다.

<?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 include-subpaths="true" path="/"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

헤더, URI, 리소스에 대한 와일드카드가 있으므로 이렇게 하면 문제가 해결될 것입니다. 그렇죠?

  • 다시 실행하면 오류가 발생합니다.

URI '에 요청을 시도하는 동안 오류가 발생했습니다.http://localhost:15511/WebSite5/Service.asmx'.이는 적절한 크로스 도메인 정책 없이 크로스 도메인 방식으로 서비스에 액세스하려고 시도했거나 SOAP 서비스에 적합하지 않은 정책 때문일 수 있습니다.교차 도메인 정책 파일을 게시하고 SOAP 관련 HTTP 헤더 전송을 허용하는지 확인하려면 서비스 소유자에게 문의해야 할 수도 있습니다.

그래서 질문:clientaccesspolicy 파일에 비밀이 있나요?대안으로 crossdomain.xml을 사용해 볼 수도 있지만 비슷한 결과가 나옵니다.

도움이 되었습니까?

해결책

나는이 같은 문제가 몇 번이나있었습니다. 과거에는 웹 앱을 시작으로 사용하여 이것을 해결했지만 이미 그렇게 한 것 같습니다.

주제에 대한 내 게시물 : http://www.donnfelker.com/silverlight-cross-domain-issue/

다른 팁

이 문제를 겪었습니다 (SL v5.0 및 Visual Studio 2010). 실버 라이트 프로젝트 속성에 들어갔다는 것입니다.

ClientAccessPolicy.xml 파일을 IIS 웹 디렉토리의 루트에 넣으십시오.

C : inetpub wwwroot clientAccesspolicy.xml

http : ///clientaccesspolicy.xml에서 직접 액세스 할 수 있습니다.

나는 같은 오류를 얻었고 위의 단계를 수행하는 것을 해결했습니다.

클라이언트 구성

어쩌면 당신의 ServiceReferences.ClientConfig Silverlight 클라이언트가 잘못된 URL을 가리키고 있습니까?

또한 교차 도메인 정책 파일의 위치를 ​​확인하세요.이것 MSDN 기사 더 많은 정보가 있습니다.

로컬에서 Silverlight 실행

Silverlight를 로컬로 실행하기 위한 추가 참고 사항(예: Vista 사이드바)보고된 바와 같이 이 블로그 항목, "Silverlight는 로컬로 실행될 때 어떤 네트워크 공급자도 사용할 수 없습니다." 해결 방법은 이 상황에서 javascript를 사용하여 웹 서비스에 인터페이스하는 것입니다.

나를 위해 일한 것은 Silverlight 포럼에서 내가 찾은 것으로 시작되었습니다. 여기. 그것은 본질적으로 내가 할 수 있는지 물었다 가져 오기 localhost (http : //localhost/clientaccesspolicy.xml)의 clossaccesspolicy.xml 또는 crossdomain.xml에. 내가 거기에서 탐색하려고 할 때, 나는 단순히 두 가지 코드 (앞에서 언급 한 스레드 내에서)에 대한 코드를 찾았고 내 inetpub wwwroot directory (I에 존재하는 파일 내부의 코드를 복사 한 코드를 찾았습니다. 메모장 ++를 사용하여 열었습니다). 이상한 부분은였습니다 코드는 전혀 변경되지 않았습니다 , 그러나 그러나 그것은 작동합니다! 그것이 누군가를 돕기를 바랍니다! 이것은 매우 이상했습니다.

ClientAccessPolicy.xml

<?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>

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>

축복 받으세요!

-SF

당신은 시도 했습니까? 바이올리니스트 IE를 통해 이것을 사용할 때, 당신은 어떤 교차 정책 파일과 같은 트래픽 은빛이 원인이되는 것을 볼 수 있습니까?

인터넷 익스플로러 설정을 수정했습니다. 웹 사이트는 인턴 웹 서버에서 실행되므로 IExplorer Trusted 사이트 목록에 추가했습니다. (도구-> 인터넷 옵션-> 보안-> 사이트).

그런 다음 보안 수준을 변경하고 크로스 도메인을 활성화했습니다. 완료, 작동하지만 해결책을 찾는 동안 나를 데려 갔다.

최고, Jeppen

프로젝트 내부의 서비스를 참조 할 때 '참조 .clienconfig "가 생성 될 때 다음과 같은 상황을 알고 있어야합니다.

    **

<endpoint address="http://localhost:57675/Servis.asmx" binding="basicHttpBinding"
            bindingConfiguration="ServisSoap" contract="ServiceReference1.ServisSoap"
            name="ServisSoap" />

**

페이지가 여전히 동일한 포트를 사용하고 있는지 확인하십시오 (예 : 57675). 기본적으로 localhost 'll random port를 얻으므로 정적 번호로 변경해야하며 동적이 아닌 정적 번호로 변경해야합니다. (ASP.NET 프로젝트/탭 웹/특정 포트/유형 번호를 마우스 오른쪽 버튼으로 클릭하십시오.

나는 이런 식으로 달려 가서 ServiceHostFactory를 추가하면 내 문제를 해결했습니다. 크로스 도메인 정책 파일만으로는 문제를 해결하지 못했습니다.

class MyHostFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        MyHost customServiceHost =
          new MyHost(serviceType, new Uri("[Your URL goes here]",UriKind.Absolute));

        return customServiceHost;
    }
}

class MyHost : ServiceHost
{
    public MyHost(Type serviceType, params Uri[] baseAddresses)   base(serviceType, baseAddresses)
    { }

    protected override void ApplyConfiguration()
    {
        base.ApplyConfiguration();
    }
}

또한 서비스를 정의하는 태그에 공장 = "MyHostFactory"를 추가해야합니다.

문제는 개발 서버가 XML 파일을 제공 할 수 없다는 것입니다.

[ServiceContract]
    public interface ICrossDomainService
    {
        [OperationContract]
        [WebGet(UriTemplate = "ClientAccessPolicy.xml")]
        Message ProvidePolicyFile();
    }

그런 다음 proverypolicyfile () 일 수 있습니다

public System.ServiceModel.Channels.Message ProvidePolicyFile()
        {
            FileStream filestream = File.Open(@"ClientAcessPolicy.xml", FileMode.Open);
            // Either specify ClientAcessPolicy.xml file path properly
            // or put that in \Bin folder of the console application
            XmlReader reader = XmlReader.Create(filestream);
            System.ServiceModel.Channels.Message result = Message.CreateMessage(MessageVersion.None, "", reader);
            return result;
        }

그것은 내 PC에서 성공적으로 작동했고, 당신은 당신의

ClientAccessPolicy.xml

<?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>

프로젝트 디렉토리와 웹 서비스 루트.

나는 같은 문제에 직면했고 문제를 알아내는 데 3 일 이상 걸렸습니다. 또한 다른 웹 서버에서 호스팅 된 Silverlight 앱에서 인터넷 클라우드 서비스 WCF를 호출 할 때 크로스 도메인 오류가 표시됩니다. 일부 게시물을 살펴본 후에는 문제를 해결하지 못했으며 Cross-Domain.xml 및 ClientAccessPolice.xml 파일을 서비스 루트 디렉토리에 넣습니다. 그래서 나는 단지 사용하는 대신 노력합니다 http://example.com 나는 단지 그것을 확보하기 위해 그것을 바꿉니다 https://example.com 그리고 그것은 방금 잘 작동했습니다. 크로스 도메인 오류가 사라집니다. 서비스는 문제없이 호출되었습니다.

어떤 프로젝트가 설정되어 있는지 확인하십시오. Silverlight 프로젝트가 아닌 기본적으로 설정 해야하는 웹 프로젝트 여야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top