7

我正在尝试将位于一个子域中的 Silverlight 应用程序添加到另一个子域中的网页。出于某种原因,这根本不起作用......我的 Silverlight 应用程序在http://subA.domain.com/somepage.html上的页面中加载:

<div id="silverlightControlHost">
    <object data="data:application/x-silverlight-2," type="application/x-silverlight-2"
        width="800px" height="600px">
        <param name="source" value="http://subB.domain.com/SilverlightApp.xap" />
        <param name="onerror" value="onSilverlightError" />
        <param name="background" value="white" />
        <param name="minRuntimeVersion" value="2.0.31005.0" />
        <param name="autoUpgrade" value="true" />
        <param name="enableHtmlAccess" value="true" />
        <a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">
            <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight"
                style="border-style: none" />
        </a>
    </object>
    <iframe style='visibility: hidden; height: 0; width: 0; border: 0px'></iframe>
</div>

如果我将 SilverlightApp.xap 移动到 subA.domain.com,它会完美加载。跨域访问 XAP 文件需要哪些步骤?我一直在刮网试图弄清楚这一点,但似乎一无所获。

谢谢!!

4

3 回答 3

5

为了帮助有同样问题但不想使用 IFrame 的其他人,请查看此链接,因为它已经解决了我的问题。尽管作者指的是 Silverlight 2,但它已经解决了我在 Silverlight 3 中的问题。如果链接断开,我需要做两件事:

-- 在 Silverlight 应用程序中,编辑 AppManifest.xml 以添加以下内容:

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
ExternalCallersFromCrossDomain="ScriptableOnly">

-- 如果您在 Silverlight 应用程序中使用 HtmlPage(例如在读取传递给托管页面的 QueryString 时),您还必须添加:

<param name="enableHtmlAccess" value="true" />

到托管页面中的 silverlight 对象。

请注意,上述内容存在安全隐患,我不禁想到这就是为什么微软不竭尽全力传播这些信息的原因。但是,在我的情况下,我没有可编写脚本的 silverlight 元素,并且由于我编写了 silverlight 应用程序,因此允许 silverlight 应用程序访问它的托管页面没有问题。

在研究这个问题时,我注意到这个问题和相应的解决方案与一个单独的问题相混淆,即 silverlight xap 跨域访问 wcf 服务的问题。该问题确实需要位于托管 wcf 服务的网站根目录上的 clientaccesspolicy.xml 文件。

因此,可以让第一个站点访问第二个站点上的 xap 文件,该文件访问第三个站点上的数据服务,以获得最大的灵活性和重用性。

于 2009-12-25T22:10:02.777 回答
2

Silverlight 跨域请求 .XAP 文件时,内容类型必须为:application/x-silverlight-app。此外,您还需要另一个域上的跨域策略文件。升

于 2009-06-27T17:36:48.813 回答
0

您可以在包含 silverlight 对象的 .xap 旁边创建一个简单的 html 文件,并从 iframe 访问它。例如,这就是http://silverlight.live.com/解决此问题的方式。

在 subA.domain.com 上的主页上添加一个 iframe,显示另一个域上的 html 页面:

<iframe src="http://subB.domain.com/SilverlightApp.html" 
        scrolling="no" 
        frameborder="0" 
        style="width:800px;height:600px">
</iframe>

subBdomain.com 上的 SilverlightApp.html 可能类似于:

<html>
  <body>
    <div id="silverlightControlHost">    
      <object data="data:application/x-silverlight-2," 
              type="application/x-silverlight-2"        
              width="800px" height="600px">        
        <param name="source" value="http://subB.domain.com/SilverlightApp.xap" />
        <param name="onerror" value="onSilverlightError" />
        <param name="background" value="white" />
        <param name="minRuntimeVersion" value="2.0.31005.0" />
        <param name="autoUpgrade" value="true" />
        <param name="enableHtmlAccess" value="true" />
        <a href="http://go.microsoft.com/fwlink/?LinkID=124807" 
           style="text-decoration: none;">            
          <img src="http://go.microsoft.com/fwlink/?LinkId=108181" 
               alt="Get Microsoft Silverlight"
               style="border-style: none" />
        </a>
      </object>
      <iframe style='visibility: hidden; height: 0; width: 0; border: 0px'>
      </iframe>
    </div>
  </body>
</html>
于 2009-06-27T12:00:48.317 回答