代码之家  ›  专栏  ›  技术社区  ›  Luke Foust

Silverlight跨域

  •  25
  • Luke Foust  · 技术社区  · 16 年前

    我看到了很多到msdn和“在我的机器上工作”的链接。答案,所以我想问我的问题和准确的步骤,复制我正在做的。因为我们使用的是一个已经存在的WebService,所以我要求在我的项目外部托管一个WebService,这与许多在线教程和视频不同。所以这里是:

    ***创建新的ASP.NET WebService项目。

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

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

    在我的计算机上,URL是:“ http://localhost:15511/WebSite5/Service.asmx

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

    ***在上面插入一个带有事件处理程序的按钮来调用Web服务。我个人用核弹攻击网格并使用一个简单的堆叠面板。如。

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

    使用按钮的语句和事件处理程序添加Web引用\u单击:

        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 将包含以下内容的文件保存到承载服务的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>
    

    这应该会打开一些东西,因为它有一个头部、URI和资源的通配符,对吧?

    • 再次运行会得到一个错误:

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

    那么问题:clientaccesspolicy文件有秘密吗?可以交替尝试使用crossdomain.xml,但它给出了类似的结果。

    13 回复  |  直到 9 年前
        1
  •  5
  •   Tim Groeneveld    9 年前

    我也有过几次同样的问题。在过去,我通过使用Web应用程序作为启动解决了这个问题,但看起来您已经这样做了。

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

        2
  •  7
  •   Socardo    11 年前

    我遇到了此问题(SL v5.0和Visual Studio 2010),解决此问题的方法是我进入Silverlight项目属性>>Silverlight选项卡并选择“在浏览器中运行时需要提升信任”

        3
  •  4
  •   Deven    13 年前

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

    C:\inetpub\wwwroot\clientaccesspolicy.xml

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

    我得到同样的错误,我通过以上步骤解决了它。

        4
  •  2
  •   Jeff Yates    16 年前

    客户端配置

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

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

    本地运行Silverlight

    本地运行Silverlight的附加说明(例如,Vista边栏)。如报道 this blog entry , 在本地运行时,Silverlight不能使用任何网络提供程序。 解决方法是在这种情况下使用JavaScript与Web服务进行接口。

        5
  •  2
  •   sacredfaith    13 年前

    对我有用的东西是从我在Silverlight论坛上发现的东西开始的。 here . 它基本上是问我是否能 得到 从localhost(http://localhost/clientaccesspolicy.xml)到my clientaccesspolicy.xml或crossdomain.xml。当我试图导航到那里时,我找不到它们的代码(也在前面的线程中),然后复制粘贴在我的inetpub\wwwroot\directory(我使用记事本+打开它们)中现有文件的代码上。奇怪的是 代码根本没变 但是,它是有效的!希望能帮助别人!这太奇怪了。

    客户端访问策略.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>
    

    跨域访问

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

        6
  •  1
  •   meandmycode    16 年前

    你试过了吗? fiddler 当通过IE使用它时,您可能会看到Silverlight导致的流量,例如它正在寻找哪些跨策略文件?

        7
  •  1
  •   Jeppen    13 年前

    我修改了Internet Explorer设置。该网站运行在一个Intern Web服务器上,因此我将其添加到IExplorer可信站点列表中。(工具->Internet选项->安全->网站)。

    然后我更改了安全级别并启用了跨域。完成了,但我花了点时间才找到解决方案。

    最好的, 杰彭

        8
  •  1
  •   Avicena00    13 年前

    您必须知道,当您在项目中引用服务时,会创建文件“reference.clienconfig”,其中包括:

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

    **

    确保您的页面仍然使用相同的端口(例如这里是57675)。默认情况下,本地主机将获得随机端口,因此必须将其更改为静态数字,而不是动态的。(右键单击ASP.NET项目/选项卡Web/特定端口/类型号 希望它有帮助

        9
  •  0
  •   ScottG    16 年前

    我遇到了类似的问题,添加了一个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”

        10
  •  0
  •   Nitin Chaudhari    14 年前

    问题可能是您的开发服务器无法提供XML文件,请尝试这样做-通过Webget显式地提供它

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

    然后ProviderPolicyFile()可以

    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;
            }
    
        11
  •  0
  •   Bo Persson Touseef    12 年前

    它在我的电脑上成功运行,您可以将

    客户端访问策略.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>
    

    您的项目目录和WebServices根目录。

        12
  •  0
  •   jose lopes    9 年前

    我也面临同样的问题,花了3天多的时间来解决这个问题。我还注意到,当我从托管在其他Web服务器上的Silverlight应用程序调用Internet云服务WCF时,它只显示跨域错误。 在查看了一些帖子之后,我没有解决这个问题,甚至把cross-domain.xml和clientaccesspolice.xml文件放在服务根目录中。 所以我只是试着不使用 http://example.com 我只是把它换成安全的 https://example.com 而且效果很好。跨域错误消失。调用服务时没有出现问题。

        13
  •  -1
  •   Ajay Padharia    12 年前

    检查设置为默认的项目。 它应该是应该设置为默认值的Web项目,而不是Silverlight项目。