Silverlight Crossdomain

时间:2009-01-16 18:17:11

标签: silverlight cross-domain

我已经看到很多MSDN的链接,“可以在我的机器上运行!”答案所以我想问一下我的问题是否有重复我正在做的事情的确切步骤。因为我们正在使用已经存在的Web服务,所以我要问的是在我的项目之外托管web服务的上下文,与在线的许多教程和视频不同。所以这里:

***创建一个新的ASP.NET Web服务项目。

  

它将附带一个现有的Service.asmx文件,公开“HelloWorld”Web方法。

     

在浏览器中查看,点击“调用”按钮。它应该返回“Hello World”字符串。

     

在我的计算机上,网址为:“http://localhost:15511/WebSite5/Service.asmx

***启动Visual Studio的新实例,创建Silverlight Web应用程序项目。

***使用事件处理程序在其上粘贴一个按钮以调用Web服务。我个人核对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的语句和事件处理程序添加Web引用:

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

运行,当然,由于跨域问题,它会爆炸。接下来,将带有以下内容的 clientaccesspolicy.xml 文件添加到托管服务的Web应用程序的根目录中:

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

这应该打开了,因为它有标题,uris和资源的通配符,对吧?

  • 再次运行,您收到错误消息:

尝试向URI“http://localhost:15511/WebSite5/Service.asmx”发出请求时发生错误。这可能是由于尝试在没有适当的跨域策略的情况下以跨域方式访问服务,或者是不适合SOAP服务的策略。您可能需要联系服务的所有者以发布跨域策略文件,并确保它允许发送与SOAP相关的HTTP标头。

所以问题:clientaccesspolicy文件有秘密吗?可以选择尝试使用crossdomain.xml,但它会产生类似的结果。

12 个答案:

答案 0 :(得分:8)

我遇到过这个问题(SL v5.0和Visual Studio 2010),为我修复的是我进入了Silverlight项目属性&gt;&gt; Silverlight选项卡并选择“在浏览器中运行时需要提升的信任”

答案 1 :(得分:5)

我曾经遇到过同样的问题。在过去,我通过使用Web App作为启动来解决这个问题,但看起来你已经做到了。

关于这个主题的帖子:http://www.donnfelker.com/silverlight-cross-domain-issue/

答案 2 :(得分:4)

确保将clientaccesspolicy.xml文件放在IIS Web目录的根目录中,例如。

C:\的Inetpub \ wwwroot的\ clientaccesspolicy.xml

这将确保可以直接访问http:///clientaccesspolicy.xml

我遇到了同样的错误,我解决了上述步骤。

答案 3 :(得分:2)

客户端配置

也许您的Silverlight客户端的ServiceReferences.ClientConfig指向错误的网址?

另外,请检查跨域策略文件的位置。这个MSDN article有更多信息。

本地运行Silverlight

在本地运行Silverlight的附加说明(例如,Vista Sidebar)。正如this blog entry中所述,“Silverlight在本地运行时无法使用任何网络提供商。”解决方法是在这种情况下使用javascript与Web服务进行交互。

答案 4 :(得分:2)

对我有用的东西始于我在silverlight论坛上发现的here。它基本上问我是否可以获取到localhost(http://localhost/clientaccesspolicy.xml)的clientaccesspolicy.xml或crossdomain.xml。当我试图在那里导航时,我不能这么简单地找到它们的代码(也在前面提到的线程中),并且复制粘贴在我的inetpub \ wwwroot \目录中存在的那些文件中的代码(I用Notepad ++打开它们。奇怪的部分是代码根本没有改变,然而,它的工作原理!希望有人帮助!这非常奇怪。

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

答案 5 :(得分:1)

在通过IE使用此功能时,您是否尝试过fiddler,您可能会看到Silverlight正在引起的流量,例如它正在寻找哪些交叉策略文件?

答案 6 :(得分:1)

我修改了我的Internet Explorer设置。该网站在实习生网络服务器上运行,因此我将其添加到Iexplorer可信站点列表中。 (工具 - >互联网选项 - &gt;安全 - >网站)。

然后我更改了安全级别并启用了跨域。完成,工作,但我找到了解决方案。

最佳, Jeppen

答案 7 :(得分:1)

您必须了解这样的情况:当您在项目中引用您的服务时,将创建文件“Reference.ClienConfig”并且有:

    **

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

**

确保您的网页仍在使用相同的端口(例如此处为57675)。默认情况下,您的localhost将获得随机端口,因此您必须将其更改为静态数字而不是动态数据。 (右键单击asp.net项目/选项卡Web /特定端口/类型编号 希望它有所帮助

答案 8 :(得分:0)

我碰到了这样的事情并添加了一个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();
    }
}

您还必须在定义服务的标签中添加Factory =“MyHostFactory”

答案 9 :(得分:0)

问题可能是您的开发服务器无法提供xml文件,请尝试此操作 - 通过WebGet显式使其可用

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

然后ProvidePolicyFile()可以是

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;
        }

答案 10 :(得分:0)

它成功地在我的电脑上工作,你可以放置

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>

您的项目目录和您的Web服务根目录。

答案 11 :(得分:-1)

检查哪个项目设置为默认值。 它应该是应该设置为默认的web项目而不是silverlight项目。