Silverlight跨域,Silverlight在IIS中部署等问题解决之道

           本文是自已在学习silverlight当中遇到的问题及解决方法,记录下来,便于存档。也希望为遇到相同问题的Coder们, 提供一个解决方案的参考。

        一:Silverlight 跨域  

              Silverlight在设计的时候对网络安全方面做了很多考虑,具体可以看Silverlight SDK

跨域通信是通过在其他域的根部署使用正确跨域策略文件的 Web 服务,可以在该域中启用基于 Silverlight 的应用程序要调用的 Web 服务。Silverlight 支持两种类型的跨域策略文件。

· Silverlight 跨域策略 (clientaccesspolicy.xml)

· Flash 跨域策略 (crossdomain.xml) 的子集

 使用跨域策略文件的跨域通信

通常,如果基于 Silverlight 的应用程序检测到其请求是一个跨域请求,将首先在 Web 服务的应用程序根处查找 Silverlight 跨域策略文件 (clientaccesspolicy.xml)。如果这个请求导致"404 未找到"或其他错误,应用程序将在应用程序根处查找 Flash 跨域策略文件 (crossdomain.xml)。不允许重定向跨域策略文件。此外,跨域策略文件保持对应用程序会话有效。
   
现在知道了只要在网站中部署一个跨域策略文件,就可以解决Silverlight跨域请求问题。跨域策略文件要放在哪里?

注意:跨域策略文件必须也只能放在网站的放置在根目录下。

          clientaccesspolicy.xml配置:

    <?xml version="1.0" encoding="utf-8"?>

<access-policy>

    <cross-domain-access>

        <policy>

            <allow-from>

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

<cross-domain-policy>

 <allow-access-from domain="*" />

</cross-domain-policy>

       

        二:Silverlight IIS 部署

     用silverlight开发的程序,部署到IIS 上,会经常弹出“Sys.InvalidOperationException: InitializeError error #2104 in control 'Xaml1': 无法下载 Silverlight 应用程序。请查看 Web 服务器设置”异常。

       出现该异常的原因:silverlight 程序ClientBin目录下的xap xaml 为后缀名的文件不被IIS请求识别。

       解决方法: IIS,添加MIME类型。

MIME 类型
.xaml application/xaml+xml
.xap application/x-silverlight-app

  如仍有问题,请检查IE的配置,放开安全里面的Xaml Active 下载等选项。

 在IIS添加MIME类型,如图所示:

    

    

        三:Silverlight 动态绑定图片

     用Image标签动态绑定异步请求数据时,在每次页面重新加载时,都会出现“Sys.InvalidOperationException: ImageError error #4001 in control 'Xaml1': AG_E_NETWORK_ERROR” 异常。

      Image标签绑定形式如下:

<Image x:Name="rect" Stretch="Fill"  Canvas.Left="150" Canvas.Top="130" Source="{Binding ProductImage}" </Image>

   该异常原因:绑定发生在设置DataContext之前,所以Image路径还没有设置成你期望的值,就进行绑定,所以此时Image标签的source 路径是不可用的。

修改方法码如下:

    xaml中去掉 Source="{Binding ProductImage}"DataContext绑定数据后,再对Image标签设置绑定值。例如:

 <Image x:Name="rect" Stretch="Fill"  Canvas.Left="150" Canvas.Top="130" </Image>

Code

 

标签: silverlight
posted @ 2009-01-22 09:46 seeker 阅读(4237) 评论(9) 编辑 收藏

 回复 引用 查看   
#1楼2009-01-22 12:43 | 伯乐族人 -- www.***      
好文章,你的文章已经被伯乐族收藏。你也可以通过伯乐族提交你的文章,这样有更多人能关注到你的文章。
 回复 引用 查看   
#2楼2009-05-19 12:56 | Amar-Yao      
谢谢,解决了我的大问题
还想问一下我的控件模版中有Source="{Binding ProductImage}",这样的绑定设置,其他图片都是些死在界面的,为什么还有Sys.InvalidOperationException: ImageError error #4001 in control 'Xaml1': AG_E_NETWORK_ERROR” 异常。
这个错误,查看源代码显示Asp.Net Ajax框架未加载

 回复 引用 查看   
#3楼[楼主]2009-05-20 08:41 | seeker      
@Amar-Yao
该异常出现,普遍是当前绑定值不存在所引发的。如果能提供你异常的代码,更容易分析。

 回复 引用   
#4楼2009-07-21 16:12 | 大树牛[未注册用户]
大侠,照你的做了,没解决问题
我的项目:
建立 web site 项目
然后 通过linq to sql 连接库,取得实体
然后 用wcf

在 xaml里面 就只放置了 datagrid,
,发布,接着报错
如果web项目上iis上就出问题了,具体错误:

throw new Error("Unhandled Error in Silverlight Application 操作过程中出现异常,结果无效。有关异常的详细信息,请查看 InnerException。 位于 System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()\n 位于 SilverlightApplication1.ServiceReference1.DoWorkCompletedEventArgs.get_Result()\n 位于 SilverlightApplication1.MainPage.c_DoWorkCompleted(Object sender, DoWorkCompletedEventArgs e)\n 位于 SilverlightApplication1.ServiceReference1.Service1Client.OnDoWorkCompleted(Object state)");

 回复 引用 查看   
#5楼2009-07-21 16:20 | Amar-Yao      
楼上的查清问题在说话,
你的错误应该是Linq to sql实体类导致
Linq to sql实体类不能直接作为DataContract的

 回复 引用   
#6楼2009-07-22 10:18 | 大树牛[未注册用户]
那如何才能生成DataContract呢?

 回复 引用 查看   
#7楼2009-07-22 10:21 | Amar-Yao      
你是银客帝国的吧,我是Amar
好像已经告诉过你了

 回复 引用   
#8楼2009-07-22 10:38 | 大树牛[未注册用户]
靠,我知道了,在linq to sql 自动生成的类里面修改一下,加上DataContract 和 DataMember,就可以了。(lilop@126.com)
 回复 引用 查看   
#9楼2011-01-28 16:55 | 欣静赏悦      
System.Reflection.TargetInvocationException: [Async_ExceptionOccurred]
参数:
调试资源字符串不可用。
请教下,这个是什么问题,我没有跨域,部署在SharePoint上,连接SQL。代码单元测试通过的。
谢谢