none
SilverLight插件xap包跨域问题 RRS feed

  • 问题

  • 先谢谢各位高手。

    问题简述:页面中嵌入一个silverlight插件,用javascript写了一个silverlight的onload方法。

    当sl插件的source属性指定的url是与页面的url域相同时,其onload事件可以接收到正常的sender参数,当source属性指定的url与页面url域不同时,事件的sender参数是undefined。而且已经实行了跨域访问的策略了。

    问题详述:

    首先有一个网站,页面地址类似这样:http://localhost:3794/SilverlightApplication3TestPage.aspx

    然后在这个aspx页面中有一个sl插件,比如

     

            <object id="mySL" data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">

      <param name="source" value="http://localhost:3794/ClientBin/SilverlightApplication3.xap"/>

              <param name="onLoad" value="onSilverlightLoad" />

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

      <param name="onError" value="onSilverlightError" />

      <param name="background" value="white" />

      <param name="minRuntimeVersion" value="4.0.50826.0" />

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

     <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50826.0" style="text-decoration:none">

       <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/>

     </a>

       </object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe></div>

    最后onload事件是这样:
            function onSilverlightLoad(sender) {
                alert(sender);
            }
      
    如上面代码的情况时onSilverlightLoad事件处理函数的sender是正常的,而当把xap放到另一个网站下,把source属性改为类似这样:http://localhost:8008/ClientBin/SilverlightApplication3.xap的时候,sender就变成了undefined。
      
    我做的跨域工作有:在web根目录下增加了clientaccesspolicy.xml文件,在AppManifest.xmal中为Deployment增加了ExternalCallersFromCrossDomain="ScriptableOnly"属性。同时如上面代码所显示,<param name="enableHtmlAccess" value="true" />属性也存在。
      
    很简单就可以做出这一问题的demo,可是却难以解决。望指教!

     







    2011年11月1日 5:53

答案

  • 这个还真的不行。
    因为它不在你当前的WebApp中。你要么在localhost:8008下面放一个ClientBin目录,然后把localhost:3794的文件copy过来。要么你在Silverlight里调用JS代码。
    努力!完成了js解析器,还差一个svg插件,一个绘图程序,做好自己,呵呵~!
    2011年11月7日 3:00
    版主
  • <UserControl x:Class="SilverlightApplication6.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        d:DesignHeight="300" d:DesignWidth="400">
    
        <Grid x:Name="LayoutRoot" Background="White">
            <Button Content="Button" Height="23" HorizontalAlignment="Left" 
                    Click="button1_Click" Margin="202,120,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
        </Grid>
    </UserControl>
    
    

    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Browser;
    
    namespace SilverlightApplication6
    {
        public partial class MainPage : UserControl
        {
            public MainPage()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                var hello = HtmlPage.Window.Invoke("onSilverlightLoad",new object[]{ this});
    
            }
        }
    }
    
    


    努力!完成了js解析器,还差一个svg插件,一个绘图程序,做好自己,呵呵~!
    2011年11月7日 3:01
    版主

全部回复

  • 这个还真的不行。
    因为它不在你当前的WebApp中。你要么在localhost:8008下面放一个ClientBin目录,然后把localhost:3794的文件copy过来。要么你在Silverlight里调用JS代码。
    努力!完成了js解析器,还差一个svg插件,一个绘图程序,做好自己,呵呵~!
    2011年11月7日 3:00
    版主
  • <UserControl x:Class="SilverlightApplication6.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        d:DesignHeight="300" d:DesignWidth="400">
    
        <Grid x:Name="LayoutRoot" Background="White">
            <Button Content="Button" Height="23" HorizontalAlignment="Left" 
                    Click="button1_Click" Margin="202,120,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
        </Grid>
    </UserControl>
    
    

    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Browser;
    
    namespace SilverlightApplication6
    {
        public partial class MainPage : UserControl
        {
            public MainPage()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                var hello = HtmlPage.Window.Invoke("onSilverlightLoad",new object[]{ this});
    
            }
        }
    }
    
    


    努力!完成了js解析器,还差一个svg插件,一个绘图程序,做好自己,呵呵~!
    2011年11月7日 3:01
    版主