代码之家  ›  专栏  ›  技术社区  ›  Jereme

如何跨域访问Silverlight Xap文件?

  •  7
  • Jereme  · 技术社区  · 16 年前

    我正在尝试将一个子域上的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文件需要哪些步骤?我一直在刮网,想弄明白这一点,但似乎什么也没有得到。

    谢谢!!

    3 回复  |  直到 16 年前
        1
  •  2
  •   Erik Mork    16 年前

    当Silverlight跨域请求.xap文件时,内容类型必须为: 应用程序/x-silverlight-app . 另外,你需要一个 跨域策略文件 在另一个域上。GL

        2
  •  5
  •   Roy McDonough    15 年前

    为了帮助有相同问题但不想使用iframes的其他人,请参阅 link 因为它解决了我的问题。尽管作者提到的是Silverlight2,但它解决了我在Silverlight3中的问题。如果链接断开,我需要做两件事:

    --在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(例如在读取传递到宿主页的查询字符串时),则还必须添加:

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

    到宿主页中的Silverlight对象。

    请注意,上述内容存在安全隐患,我忍不住认为这就是为什么微软不会不遗余力地传播这些信息的原因。但是在我的例子中,我没有可脚本化的Silverlight元素,而且自从我编写了Silverlight应用程序以来,我对允许Silverlight应用程序访问它的宿主页面没有问题。

    在研究这个问题时,我注意到这个问题和相应的解决方案会与一个单独的问题混淆,即SilverlightXAP跨域边界访问WCF服务的问题。该问题需要一个clientaccesspolicy.xml文件,该文件位于承载WCF服务的网站的根目录上。

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

        3
  •  0
  •   Sorskoot    16 年前

    您可以在包含Silverlight对象的.xap旁边创建一个简单的HTML文件,并从iframe访问该文件。就是这样 http://silverlight.live.com/ 例如,修复了这个问题。

    在suba.domain.com的主页上添加一个iframe,该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>