分析Silverlight跨域调用

分析Silverlight跨域调用

在silverlight开发的过程中不免要遇到跨域的问题,在这里以跨域调用Webservice为例子来分析一下跨域的问题。

 


先介绍一下我的测试项目,我用flash和silverlight一同来调用一个webservice,一个flash客户端,一个silverlight客户端,一个web项目来host flash和silverlight,再加上一个webservice端。

flash发布到web项目的swf文件夹下。  web项目中的clienttestpage.html中的sl和flash来调用webservice。

 具体如何调用webservice我这里就略去了。

我的webservice里有一个方法


[WebMethod]
public string SayHello(string name) {
return "Hello " + name;
}

 

 

webservice

 

Html Host页面

 


 

这里先用silverlight来调用,在输入用户名都点击invoke按钮看看发声了什么。

在firefox中打开firebug的网络监视器

 

 这里发现他先去webservice所在的域的根目录下请求一个 clientaccesspolicy.xml 的文件,在没有到后又去请求一个crossdomain.xml的文件,同样也是没有找到,返回404。

 

好,这里我在webservice域根下放入一个clientaccesspolicy.xml 

clientaccesspolicy.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 include-subpaths="true" path="/"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>

 

因为webservice有requestheaders的请求,所以要加上红色部分。
再次调用看看是什么情况

请求到了clientaccesspolicy.xml 后就去真正请求webservice文件了。  并且得到了返回值。

 

接下来,去掉clientaccesspolicy.xml,加入crossdomain.xml

crossdomain.xml


<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*"/>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>

 

再次调用

在没有找到clientaccesspolicy.xml的情况下,去请求crossdomain.xml文件,得到响应后就正式请求webservice文件,并且也得到了返回值。

 


 

接下来看flash  这里用as2.0做的。 

他一开始直接就请求了crossdomain.xml,并没有去请求clientaccesspolicy.xml。

再输入用户名后,直接向webservice post数据,得到返回值。

 

好接下来看看as3的flash又会如何。


 

机制有些改变,一开始没去请求xml。

 

输入用户名,调用

 

 

再看看没有找到xml的情况

 


 

好了在看看网上我搜索到的一些说法。

 

“出于安全考虑,FlashPlayer默认的安全设置是不允许进行跨域操作的。即便是同一个网站,如果用不同的方式访问,也会被FlashPlayer认为是跨域操作。

为解决Flash/Flex系统中的跨域问题,提出了crossdomain.xml跨域策略文件。有了它,就可以解决跨域问题。”

 

“SilverLight要实现跨域访问,必须在服务端被访问域的直接域名下,配置 clientaccesspolicy.xml( 或 crossdomain.xml)文件,即可以访问 http://{domainName}/clientaccesspolicy.xml。 ”


 

 

提出问题

 关于crossdomain.xml 和 clientaccesspolicy.xml 的区别。

1、这两个文件真的是可以任选其一吗?

2、这两个文件分别需要被放在服务端还是客户端?

3、不管后台服务部署在IIS还是其它环境中,这两个文件都可以使用吗?

 

 

解答

1.silverlight在使用中可以任选其一,建议直接使用clientaccesspolicy.xml。flash只能使用crossdomain.xml。

2.都是必须在服务端被访问域的直接域名下  。

3.都可以使用

 

 

 



参考资料:

http://social.microsoft.com/Forums/de-DE/silverlightzhchs/thread/1be30f6c-c4bc-43e3-88a8-8c43951b152b
http://silverlight.net/learn/videos/all/how-to-use-cross-domain-policy-files-with-silverlight/

http://timheuer.com/blog/archive/2008/04/06/silverlight-cross-domain-policy-file-snippet-intellisense.aspx 

 

时间: 2024-12-27 22:12:44

分析Silverlight跨域调用的相关文章

javascript ajax脚本跨域调用详解

今天终于有点时间研究了一下javsscript ajax 脚本跨域调用的问题,先在网上随便搜了一下找到一些解 决的办法,但是都比较复杂.由是转到jquery.chm用户手册当中找到一些代码片段关于ajax跨域调用的问题. 代码片段如下: crossDomain   mapV1.5 默认: 同域请求为false 跨域请求为true如果你想强制跨域请 求(如JSONP形式)同一域,设置crossDomain为true.这使得例如,服务器端重定向到另一个域. 这 里强调如是ajax的跨域调用,data

jquery ajax jsonp跨域调用实例代码

 今天研究了AJAX使用JSONP进行跨域调用的方法,发现使用GET方式和POST方式都可以进行跨域调用,这里简单分享下,方便需要的朋友 客户端代码     代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApp.WebForm1" %> <!DOCTYPE html

php跨域调用json的例子_jquery

JSON和XML没什么太大区别,不过JSON有一个更大范围的应用,那就是,跨域的数据调用.由于安全性问题,AJAX不支持跨域调用,这样要调用不同域名下的数据,很麻烦.下面这个例子,足以展示php用json如何进跨域调用了. index.html 复制代码 代码如下: <script type="text/javascript"> function getProfile(str) {      var arr = str;      document.getElementBy

js jquery-jsonp都要创建script,为什么$getJSON跨域调用没有创建script呢

问题描述 jsonp都要创建script,为什么$getJSON跨域调用没有创建script呢 jsonp都要创建script,为什么$getJSON跨域调用没有创建script呢 jsonp都要创建script,为什么$getJSON跨域调用没有创建script呢 解决方案 跨域了直接报错了吧,还创建script刚吗.getJSON是获取json数据,和jsonp不是一个东西 解决方案二: getJSON 就是获取json ,跨域的话不能执行的,jsonp 可以创建javascript ,不过

javascript-js跨域调用如何实现???

问题描述 js跨域调用如何实现??? 我有一个本地页面,用两个iframe分别嵌入了a.com/a.html和b.com/b.html(分别属于两个不同的域名),现在我要做的事情,是想用本地页的一段js,拿a.html里面的一个elementId="value"的元素值,再拿b.html里面的元素elementId="value2"的值,两个值做处理后,填入b.html里面的一个输入框"text"里面,再点击一个"buton"

ASP.NET配合jQuery解决跨域调用的问题_实用技巧

一. 使用JSONp方式调用 不做详细讲解,可以参考jq文档<jQuery 1.10.3 在线手册> 二. 服务端配置 修改Web.config 文件 <system.webServer> <modules runAllManagedModulesForAllRequests="true"></modules> <httpProtocol> <customHeaders> <add name="Ac

关于js跨域调用的问题

问题描述 如题,关于跨域调用js的问题已经被提过很多了,高手们有什么好的建议?目前我们采用了js将数据放入本地剪切板的方法,但是用起来会弹出来浏览器警告,用户体验很差,还有没有其他的方式可以绕过去这个问题?补充一下:被调用的页面里的js方法还要获取调用者页面的对象数据. 解决方案 被调用的页面里的js方法还要获取调用者页面的对象数据!!这个貌似随着各大浏览器的升级,都不允许这样做了.除非跨域的服务器端代码你可以控制.如果不是的话,还是不要费劲了.就算现在你找到了方法,随着浏览器的升级就又不能用了

js跨域调用WebService的简单实例_AJAX相关

步骤1.   在web.config中的system.web节点里加入 <!--此节点可允许脚本跨域调用webservice--> <webServices> <protocols> <add name="HttpPost"/> <add name="HttpGet"/> </protocols> </webServices> <!--此节点可允许脚本跨域调用webservic

JavaScript跨域调用基于JSON的RESTful API_javascript技巧

1. 基本术语 AJAX(Asynchronous JavaScript And XML,异步JavaScript和XML):AJAX是一种用于创建快速动态网页的技术,通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. JSON(JavaScript Object Notation):JSON是一种轻量级的数据交换格式,可以看成是由大括号包裹起来的多个"key/value"对,格式如下:{"f