<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>简单生活 -- Kevin Yang的博客 &#187; 跨域</title>
	<atom:link href="http://www.imkevinyang.com/tags/%e8%b7%a8%e5%9f%9f/feed" rel="self" type="application/rss+xml" />
	<link>http://www.imkevinyang.com</link>
	<description>It&#039;s all about sharing</description>
	<lastBuildDate>Sun, 05 Feb 2012 15:37:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Silverlight启用Assembly Caching之后铁通用户无法访问</title>
		<link>http://www.imkevinyang.com/2010/02/silverlight%e5%90%af%e7%94%a8assembly-caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html</link>
		<comments>http://www.imkevinyang.com/2010/02/silverlight%e5%90%af%e7%94%a8assembly-caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html#comments</comments>
		<pubDate>Sat, 13 Feb 2010 05:24:00 +0000</pubDate>
		<dc:creator>Kevin Yang</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Assembly Caching]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[HTTP Watch]]></category>
		<category><![CDATA[跨域]]></category>
		<category><![CDATA[重定向]]></category>
		<category><![CDATA[铁通]]></category>

		<guid isPermaLink="false">http://www.imkevinyang.com/2010/02/silverlight%e5%90%af%e7%94%a8assembly-caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html</guid>
		<description><![CDATA[<p>去年年底的时候，有客户向我们公司反映，他在自己公司内网（铁通ADSL）无法访问我们的Silverlight应用程序，而在他家里（网通ADSL）就可以正常访问。我们其他的客户并没有反映过类似的问题。</p>
问题分析排查
<p>由于他用的是笔记本，在家里和在公司访问时的系统环境是一样的，这样也就排除了系统环境的原因。那&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>去年年底的时候，有客户向我们公司反映，他在自己公司内网（铁通ADSL）无法访问我们的Silverlight应用程序，而在他家里（网通ADSL）就可以正常访问。我们其他的客户并没有反映过类似的问题。</p>
<h2>问题分析排查</h2>
<p>由于他用的是笔记本，在家里和在公司访问时的系统环境是一样的，这样也就排除了系统环境的原因。那只能怀疑是网络环境的问题了。后来在现场使用HTTP Watch调试发现，当Silverlight在下载其中几个缓存程序集的zip包（我们的Silverlight应用程序启用了Assembly Caching）时，HTTP请求被302永久重定向到一个奇怪的IP上。</p>
<p><img style="display: inline; border-width: 0px;" title="Silverlight启用Assembly Caching之后铁通用户无法访问" src="http://www.imkevinyang.com/wp-content/uploads/2010/02/image.png" border="0" alt="Silverlight启用Assembly Caching之后铁通用户无法访问" width="564" height="148" /></p>
<p>这样，由于zip包和Xap包地址的主机域不同，构成跨域，Silverlight会要求zip包所在的网站提供clientaccesspolicy.xml或者crossdomain.xml文件。而那个奇怪的IP所在网站下根本就没有这两个文件，所以请求失败。进而导致整个程序挂掉。</p>
<h2>Assembly Caching程序集缓存</h2>
<p>Assembly Caching（又称Application Library Caching）是Silverlight 3的新特性。以前Silverlight都是将所有用到的dll放到一个xap包之中，这样整个xap包会很大，下载相对比较慢。启用Assembly Caching之后，Silverlight工程用到的dll就可以在编译的时候自动打包到各自的zip包中，然后Silverlight在加载Xap包之后会自动下载这些zip包并解压出里头的dll，然后加载到应用程序域中。这样一来可以大大提高程序集下载的并行度，同时也可以使到不同Silverlight程序之间可以利用浏览器缓存而无需重复下载。</p>
<p>Silverlight在加载Xap包之后会去读取xap包中的appmanifest.xaml文件，然后下载该文件中指定的程序集文件。如果程序集文件Url和当前Xap包Url构造跨域（参考Silverlight SDK文档），则Silverlight会向该程序集所在网站的根目录请求跨域策略文件。</p>
<h2>为什么会被重定向</h2>
<p>这个问题困扰了我们很久。当时我们的第一反应是怀疑网关设置了什么规则。当用户访问特定Url的时候，触发了这个规则，导致HTTP请求被挟持。但是和客户公司网管沟通之后，对方明确表示并没有设置过类似的规则。</p>
<p>直到最近，客户和电信通（率属铁通）的人沟通之后，那边的技术人员说这是由于铁通的缓存加速服务器造成。据说是铁通为了让用户下载更快，就将某些HTTP请求进行重定向。后来电信通的技术人员告诉客户他们已经没问题了，但是他们并没有告知详细的问题所在，到底是由于我们的HTTP请求碰巧符合特定规则，还是怎么回事。也不知道他们是怎么解决的，是只将客户公司的IP列入禁止缓存列表，还是将我们Silverlight应用程序使用的域名加入禁止缓存列表，我们都无从知道。对于我们来说，这并没有真正解决问题。如果将来其他客户也通过铁通访问我们的产品，那么可能还是会出现类似的问题。由于我家里也是铁通的网络，所以我决定自己研究一下到底是怎么回事。</p>
<p>由于铁通那边没有任何可用的技术信息，Google也没有找到有价值的信息，唯一猜测的就是HTTP请求可能符合特定规则然后就被无辜重定向了。因此我只能采用最原始的人肉测试了。尝试不断的调整出问题的Url然后看是否被重定向了来发现规律。修改zip包所在目录，修改zip包文件名，修改zip包后缀，修改IIS的MIME类型，测试不同域名，等等。在历经100多次尝试之后，终于发现了<strong><span style="color: #008000;">当文件大小超过40K左右，并且后缀名是zip或者rar等常见的下载文件后缀，就会被铁通重定向。而且有时候第一、二次不会被重定向，刷新多几次的时候就才会被重定向</span></strong>。后面一点让我走了不少弯路，多少次我以为找到规律了，最后验证结论的时候还是错了。</p>
<p>o(︶︿︶)o</p>
<h2>怎么解决</h2>
<p>知道具体问题所在之后，我们几个技术人员就开始讨论如何解决这个问题。由于Silverlight对于缓存程序集打包之后的文件后缀没有要求，不管什么后缀，都会以zip文件流的格式去解析。因此可以修改打包文件的后缀来“逃过”铁通的魔掌。</p>
<p>修改文件后缀也有两种方法。</p>
<p>一种是在部署的时候，通过自动化脚本，修改所有zip文件后缀，然后修改xap包中appmanifest.xaml里头程序集的Url。这种方式的好处是一劳永逸，通用性强，以后部署的时候只需要执行一次脚本即可，其他应用程序可以共用。缺点是脚本编写比较复杂，并且部署的时候需要多加一步。</p>
<p>另外一种方法是将用到的Silverlight系统程序集放到工程底下，然后修改同名的xml配置文件，使其打包的文件使用其他后缀名。好处是这样编译完之后就可以直接部署了，无需执行什么操作，也不需要写脚本。坏处就是首先需要修改所有现有的工程，而且以后如果要开发新的Silverlight应用，也要记得这么做。</p>
<p>不管怎么样，这两种方法都不简单。后来我就想，既然客户可以和电信通联系，为什么我不可以直接和铁通联系呢。我就上网搜了一下北京铁通客户中心，找到申诉通道，填写完整的申述理由。然后第二天又打他们的客服电话去骚扰他们。结果过了两天，申述结果就下来了，“问题已解决”。对方客服还本着能自己动手决不麻烦别人的精神，帮我填写了用户满意度一栏：“非常满意”。</p>
<h2>更深层的东西</h2>
<p>其实最终解决问题的办法非常简单，就是投诉。我不满意你的服务，我就有权利投诉你。可是为什么一开始没有意识到这种解决办法呢？</p>
<p>我觉得这是和我们接触的社会环境有很大关系。我们潜意识里头已经习惯了各种中国式的流氓。运营商喜欢往你访问的网站中插播广告，访问我自己的博客偶尔还有弹窗广告；上Google搜索技术资料，一不小心点了blogspot的链接就导致Google被重置了，然后就10分钟不可用。没有明文规定告诉你什么是被禁止的，我们只能人肉测试。我们除了接受、适应并绕过这种事实之外还能做什么？也许我们还可以发出几声“中国式的抗议”吧。</p>
<p>言多必封，不多说了。</p>
<p style="text-align: right;">——<a title="Silverlight启用Assembly Caching之后铁通用户无法访问" href="http://www.imkevinyang.com/2010/02/Silverlight%e5%90%af%e7%94%a8Assembly%20Caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html"><em><strong>Kevin Yang</strong></em></a></p>

	标签：<a href="http://www.imkevinyang.com/tags/assembly-caching" title="Assembly Caching" rel="tag">Assembly Caching</a>, <a href="http://www.imkevinyang.com/tags/http" title="HTTP" rel="tag">HTTP</a>, <a href="http://www.imkevinyang.com/tags/http-watch" title="HTTP Watch" rel="tag">HTTP Watch</a>, <a href="http://www.imkevinyang.com/categories/techarticles/silverlight" title="Silverlight" rel="tag">Silverlight</a>, <a href="http://www.imkevinyang.com/tags/silverlight" title="Silverlight" rel="tag">Silverlight</a>, <a href="http://www.imkevinyang.com/tags/%e8%b7%a8%e5%9f%9f" title="跨域" rel="tag">跨域</a>, <a href="http://www.imkevinyang.com/tags/%e9%87%8d%e5%ae%9a%e5%90%91" title="重定向" rel="tag">重定向</a>, <a href="http://www.imkevinyang.com/tags/%e9%93%81%e9%80%9a" title="铁通" rel="tag">铁通</a><br />

	<h4 style="background-color:#3B3B3B;border-bottom:2px groove gray;color:#F2F2F2;margin-top:20px;padding:6px 6px 6px 15px;margin:20px 0px 0px 0px">你可能对下面的文章感兴趣</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.imkevinyang.com/2010/05/64%e4%bd%8d%e7%b3%bb%e7%bb%9f%e4%b8%8biis7-isapi%e5%a4%84%e7%90%86%e5%99%a8%e5%8a%a0%e8%bd%bd%e5%a4%b1%e8%b4%a5.html" title="64位系统下IIS7 ISAPI处理器加载失败 (2010/05/05)">64位系统下IIS7 ISAPI处理器加载失败</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/11/asp-net%e9%a1%b5%e9%9d%a2%e7%9a%84%e7%bc%96%e7%a0%81%e9%97%ae%e9%a2%98.html" title="Asp.Net页面的编码问题 (2009/11/27)">Asp.Net页面的编码问题</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/09/blend%e5%b0%8f%e8%b4%b4%e5%a3%ab%e6%94%b9%e5%8f%98%e9%bc%a0%e6%a0%87%e6%bb%9a%e8%bd%ae%e7%9a%84%e9%bb%98%e8%ae%a4%e8%a1%8c%e4%b8%ba-2.html" title="Blend小贴士&mdash;&mdash;改变鼠标滚轮的默认行为 (2009/09/18)">Blend小贴士&mdash;&mdash;改变鼠标滚轮的默认行为</a> </li>
	<li><a href="http://www.imkevinyang.com/2011/06/iis%e4%b8%ad%e4%bd%bf%e7%94%a8%e5%ad%90%e7%9b%ae%e5%bd%95%e6%96%87%e4%bb%b6%e4%bd%9c%e4%b8%ba%e9%bb%98%e8%ae%a4%e6%96%87%e6%a1%a3%ef%bc%88default-document%ef%bc%89%e6%9b%bf%e4%bb%a3%e9%87%8d%e5%ae%9a.html" title="IIS中使用子目录文件作为默认文档（Default Document）替代重定向 (2011/06/15)">IIS中使用子目录文件作为默认文档（Default Document）替代重定向</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/02/silverlight-2-rtm-%e5%a4%9a%e5%9b%bd%e8%af%ad%e8%a8%80%e6%94%af%e6%8c%81%ef%bc%88%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e6%9c%ac%e5%9c%b0%e5%8c%96%ef%bc%89.html" title="Silverlight 2 RTM 多国语言支持（应用程序本地化） (2009/02/28)">Silverlight 2 RTM 多国语言支持（应用程序本地化）</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/03/silverlight-2%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bdxap%e5%8c%85%e4%b8%ad%e7%9a%84%e7%a8%8b%e5%ba%8f%e9%9b%86.html" title="Silverlight 2动态加载Xap包中的程序集 (2009/03/02)">Silverlight 2动态加载Xap包中的程序集</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/05/silverlight-4ria-services-%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e4%bc%98%e5%8c%96seo.html" title="Silverlight 4+RIA Services&#8211;搜索引擎优化(SEO) (2010/05/04)">Silverlight 4+RIA Services&#8211;搜索引擎优化(SEO)</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/04/silverlight-seo%ef%bc%88%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e4%bc%98%e5%8c%96%ef%bc%89%e7%99%bd%e7%9a%ae%e4%b9%a6.html" title="Silverlight SEO（搜索引擎优化）白皮书 (2009/04/06)">Silverlight SEO（搜索引擎优化）白皮书</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/03/silverlight2-%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bd%e7%a8%8b%e5%ba%8f%e9%9b%86-ondemand%e6%a8%a1%e5%bc%8fdynamic-load-assembly.html" title="Silverlight2 动态加载程序集&#8212;OnDemand模式(Dynamic Load Assembly) (2009/03/02)">Silverlight2 动态加载程序集&#8212;OnDemand模式(Dynamic Load Assembly)</a> </li>
	<li><a href="http://www.imkevinyang.com/2011/09/silverlight%e4%b8%ad%e6%97%a0%e6%b3%95%e8%ae%be%e7%bd%ae%e5%8d%ab%e6%98%9f%e7%a8%8b%e5%ba%8f%e9%9b%86%e4%b8%ba%e4%b8%ad%e7%ab%8b%e8%b5%84%e6%ba%90%e7%a8%8b%e5%ba%8f%e9%9b%86.html" title="Silverlight中无法设置卫星程序集为中立资源程序集 (2011/09/05)">Silverlight中无法设置卫星程序集为中立资源程序集</a> </li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.imkevinyang.com/2010/02/silverlight%e5%90%af%e7%94%a8assembly-caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>跨域下请求Silverlight Xap包引起的问题</title>
		<link>http://www.imkevinyang.com/2009/07/%e8%b7%a8%e5%9f%9f%e4%b8%8b%e8%af%b7%e6%b1%82silverlight-xap%e5%8c%85%e5%bc%95%e8%b5%b7%e7%9a%84%e9%97%ae%e9%a2%98.html</link>
		<comments>http://www.imkevinyang.com/2009/07/%e8%b7%a8%e5%9f%9f%e4%b8%8b%e8%af%b7%e6%b1%82silverlight-xap%e5%8c%85%e5%bc%95%e8%b5%b7%e7%9a%84%e9%97%ae%e9%a2%98.html#comments</comments>
		<pubDate>Sun, 12 Jul 2009 11:15:00 +0000</pubDate>
		<dc:creator>Kevin Yang</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[HTML Bridge]]></category>
		<category><![CDATA[Xap]]></category>
		<category><![CDATA[安全]]></category>
		<category><![CDATA[疑难问题]]></category>
		<category><![CDATA[脚本访问]]></category>
		<category><![CDATA[跨域]]></category>

		<guid isPermaLink="false">http://www.imkevinyang.com/2009/07/%e8%b7%a8%e5%9f%9f%e4%b8%8b%e8%af%b7%e6%b1%82silverlight-xap%e5%8c%85%e5%bc%95%e8%b5%b7%e7%9a%84%e9%97%ae%e9%a2%98.html</guid>
		<description><![CDATA[
问题
<p>最近将一个Silverlight应用从一个域挪到另外一个域下之后，出了一些莫名其妙的问题。<strong><font color="#008000">在加载完Silverlight之后，整个Silverlight UI一闪就消失了</font></strong>。左下角没有异常信息，异常报错的窗口——系统会捕获到所有异常，将其使用Alert方法展示给用户——也没有弹出来。</p>
<p>后来使用HTTP&#8230;</p>]]></description>
			<content:encoded><![CDATA[</p>
<h2>问题</h2>
<p>最近将一个Silverlight应用从一个域挪到另外一个域下之后，出了一些莫名其妙的问题。<strong><font color="#008000">在加载完Silverlight之后，整个Silverlight UI一闪就消失了</font></strong>。左下角没有异常信息，异常报错的窗口——系统会捕获到所有异常，将其使用Alert方法展示给用户——也没有弹出来。</p>
<p>后来使用HTTP Watch观察了一下，发现在调用web service的时候服务端返回了错误（服务端会将异常封装成一个自定义的数据结构返回给客户端）。奇怪的是，既然返回了错误，按理应该会弹出窗口显示错误信息才是，但是却什么信息也没弹出来，整个UI界面一闪就消失了。</p>
<p>查了很久之后终于找到相关的资料，原来Silverlight和宿主（承载Silverlight应用的网页）Dom元素和脚本的交互在跨域下也有一些限制。</p>
<h2>Silverlight HTML桥的安全设置</h2>
<p>在Silverlight2中，有三个参数控制着Silverlight和HTML的交互行为。</p>
<ul>
<li><strong>enableHtmlAccess ——</strong> Silverlight插件属性，禁止恶意的基于 Silverlight 的跨域应用程序访问主页面的 JavaScript 和 DOM 代码。 </li>
<li><strong>ExternalCallersFromCrossDomain</strong> —— 部署清单属性，禁止恶意的跨域宿主访问由基于 Silverlight 的应用程序公开的可编写脚本的属性、方法或事件。 </li>
<li><strong>AllowHtmlPopupwindow</strong> —— Silverlight插件属性，控制基于 Silverlight 的跨域应用程序打开的弹出窗口。在此属性设置为 false 时（在从包含页或承载 iframe 以外的其他域加载 Silverlight 控件时的默认值），开发人员无法调用 [HtmlPage.PopupWindow]。 </li>
</ul>
<h2><strong>enableHtmlAccess</strong></h2>
<p>这个属性是在Silverlight插件中配置的。它使到Xap包中的托管代码可以访问宿主页面中的DOM元素以及Javascript代码。<strong><font color="#008000">此插件一旦初始化之后就是只读的。在同域情况下，此属性默认值为true，而在跨域情况下（宿主和Xap包不在同个域下）默认值为false</font></strong>。这也就是为什么我们一般情况下不需要设置此参数的缘故。</p>
<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">div</span> <span class="attr">id</span><span class="kwrd">=&quot;silverlightControlHost&quot;</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">object</span> <span class="attr">data</span><span class="kwrd">=&quot;data:application/x-silverlight,&quot;</span> <span class="attr">type</span><span class="kwrd">=&quot;application/x-silverlight-2&quot;</span> <span class="attr">width</span><span class="kwrd">=&quot;300&quot;</span> <span class="attr">height</span><span class="kwrd">=&quot;100&quot;</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">param</span> <span class="attr">name</span><span class="kwrd">=&quot;source&quot;</span> <span class="attr">value</span><span class="kwrd">=&quot;http://www.domain1.com/silverlightapp.xap&quot;</span><span class="kwrd">/&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">param</span> <span class="attr">name</span><span class="kwrd">=&quot;enableHtmlAccess&quot;</span> <span class="attr">value</span><span class="kwrd">=&quot;true&quot;</span> <span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">object</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span></pre>
<p>将此属性设置为true之后才可以访问以下对象：</p>
<ul>
<li><a href="http://msdn.microsoft.com/zh-cn/library/system.windows.browser.htmlpage.document(VS.95).aspx">HtmlPage.Document</a> </li>
<li><a href="http://msdn.microsoft.com/zh-cn/library/system.windows.browser.htmlpage.window(VS.95).aspx">HtmlPage.Window</a> </li>
<li><a href="http://msdn.microsoft.com/zh-cn/library/system.windows.browser.htmlpage.plugin(VS.95).aspx">HtmlPage.Plugin</a> </li>
<li><a href="http://msdn.microsoft.com/zh-cn/library/system.windows.browser.htmlpage.browserinformation(VS.95).aspx">HtmlPage.BrowserInformation</a> </li>
</ul>
<p>这也就解释了文章开头提到的问题。 </p>
<p>因为在出问题的Silverlight应用中，会捕获所有的异常，并将异常描述信息通过HtmlWindow.Alert方法展示给用户。而Alert的实现应该也是通过调用Javascript的alert函数来完成的，因此在跨域情况下，如果直接调用跨域宿主的Javascript代码是会抛出异常的。不过对于此异常Silverlight的处理行为还是很糟糕的。</p>
<ul>如果出于某种目的需要禁用此属性，防止Silverlight意外篡改宿主Dom元素，或者限制Silverlight可访问的Dom元素，那么可以采用以下步骤实现：</ul>
<ul>1. 通过<a href="http://msdn.microsoft.com/zh-cn/library/system.windows.browser.scriptabletypeattribute(VS.95).aspx">ScriptableTypeAttribute</a>或者<a href="http://msdn.microsoft.com/zh-cn/library/system.windows.browser.scriptablememberattribute(VS.95).aspx">ScriptableMemberAttribute</a>属性声明一个可以被Javascript访问的Silverlight对象</ul>
<ul>2. 通过<a href="http://msdn.microsoft.com/zh-cn/library/system.windows.browser.htmlpage.registerscriptableobject(VS.95).aspx">RegisterScriptableObject</a>显式注册此对象以供Javascript访问</ul>
<ul>3. Javascript调用此对象接口，将所需要的Dom元素传给Silverlight托管代码</ul>
<ul>需要注意的是，这种方式是由Javascript发起的操作，需要配置ExternalCallersFromCrossDomain属性为true。</ul>
<h2>ExternalCallersFromCrossDomain</h2>
<p><font color="#000000"></font></p>
<p>ExternalCallersFromCrossDomain属性是在部署清单appmanifest.xaml中配置的。它是用来限制跨域情况下脚本对Silverlight托管代码的访问的，<strong><font color="#008000">在同域情况下此属性无效</font></strong>。配置示例如下：</p>
<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">Deployment</span> <span class="attr">xmlns</span><span class="kwrd">=&quot;http://schemas.microsoft.com/client/2007&quot;</span>
    <span class="attr">xmlns:x</span><span class="kwrd">=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;</span>
    <span class="attr">EntryPointAssembly</span><span class="kwrd">=&quot;MyAppAssembly&quot;</span>
    <span class="attr">EntryPointType</span><span class="kwrd">=&quot;MyNamespace.MyApplication&quot;</span>
    <span class="attr">ExternalCallersFromCrossDomain</span><span class="kwrd">=&quot;ScriptableOnly&quot;</span>
<span class="kwrd">&gt;</span>
<span class="kwrd">&lt;</span><span class="html">Deployment.Parts</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">AssemblyPart</span> <span class="attr">Source</span>=&quot;<span class="attr">MyAppAssembly</span>.<span class="attr">dll</span>” <span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">AssemblyPart</span> <span class="attr">Source</span><span class="kwrd">=&quot;MyUserControl.dll&quot;</span> <span class="kwrd">/&gt;</span>
  <span class="kwrd">&lt;/</span><span class="html">Deployment.Parts</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">Deployment</span><span class="kwrd">&gt;</span></pre>
<p>此属性有两个取值，ScriptableOnly和NoAccess（beta2的FullAccess取值在正式版的时候已经废弃了）。当设置为ScriptableOnly时，Javascript可以访问Silverlight托管代码显式注册的脚本入口，而不能查询或设置其他对象的属性。另外，它也不接受事件通知。如果设置为NoAccess，那么Javascript无法访问托管代码里的任何对象接口。</p>
<p>&#160;</p>
<p>关于这两个属性的详细信息，参见<a href="http://msdn.microsoft.com/zh-cn/library/cc645023(VS.95).aspx" target="_blank">SilverlightHTML 桥中的安全设置</a>。</p>
<p align="right">——<a href="http://www.imkevinyang.com/"><em><strong>Kevin Yang</strong></em></a></p>

	标签：<a href="http://www.imkevinyang.com/tags/html" title="HTML" rel="tag">HTML</a>, <a href="http://www.imkevinyang.com/tags/html-bridge" title="HTML Bridge" rel="tag">HTML Bridge</a>, <a href="http://www.imkevinyang.com/categories/techarticles/silverlight" title="Silverlight" rel="tag">Silverlight</a>, <a href="http://www.imkevinyang.com/tags/xap" title="Xap" rel="tag">Xap</a>, <a href="http://www.imkevinyang.com/tags/%e5%ae%89%e5%85%a8" title="安全" rel="tag">安全</a>, <a href="http://www.imkevinyang.com/tags/%e7%96%91%e9%9a%be%e9%97%ae%e9%a2%98" title="疑难问题" rel="tag">疑难问题</a>, <a href="http://www.imkevinyang.com/tags/%e8%84%9a%e6%9c%ac%e8%ae%bf%e9%97%ae" title="脚本访问" rel="tag">脚本访问</a>, <a href="http://www.imkevinyang.com/tags/%e8%b7%a8%e5%9f%9f" title="跨域" rel="tag">跨域</a><br />

	<h4 style="background-color:#3B3B3B;border-bottom:2px groove gray;color:#F2F2F2;margin-top:20px;padding:6px 6px 6px 15px;margin:20px 0px 0px 0px">你可能对下面的文章感兴趣</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.imkevinyang.com/2009/11/button%e6%a0%87%e7%ad%be%e9%bc%a0%e6%a0%87%e7%82%b9%e5%87%bb%e4%ba%8b%e4%bb%b6%e7%9a%84%e8%a7%a6%e5%8f%91%e6%ba%90%e9%97%ae%e9%a2%98.html" title="Button标签鼠标点击事件的触发源问题 (2009/11/27)">Button标签鼠标点击事件的触发源问题</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/04/pre%e6%a0%87%e7%ad%be%e5%86%85%e6%96%87%e5%ad%97%e8%87%aa%e5%8a%a8%e6%8d%a2%e8%a1%8c%ef%bc%88%e5%85%bc%e5%ae%b9%e5%a4%9a%e6%95%b0%e4%b8%bb%e6%b5%81%e6%b5%8f%e8%a7%88%e5%99%a8%ef%bc%89.html" title="Pre标签内文字自动换行（兼容多数主流浏览器） (2009/04/09)">Pre标签内文字自动换行（兼容多数主流浏览器）</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/03/silverlight-2%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bdxap%e5%8c%85%e4%b8%ad%e7%9a%84%e7%a8%8b%e5%ba%8f%e9%9b%86.html" title="Silverlight 2动态加载Xap包中的程序集 (2009/03/02)">Silverlight 2动态加载Xap包中的程序集</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/03/silverlight2-%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bd%e7%a8%8b%e5%ba%8f%e9%9b%86-ondemand%e6%a8%a1%e5%bc%8fdynamic-load-assembly.html" title="Silverlight2 动态加载程序集&#8212;OnDemand模式(Dynamic Load Assembly) (2009/03/02)">Silverlight2 动态加载程序集&#8212;OnDemand模式(Dynamic Load Assembly)</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/02/silverlight%e5%90%af%e7%94%a8assembly-caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html" title="Silverlight启用Assembly Caching之后铁通用户无法访问 (2010/02/13)">Silverlight启用Assembly Caching之后铁通用户无法访问</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/10/wordpress%e8%af%84%e8%ae%ba%e4%b8%ad%e4%bf%9d%e7%95%99html%e4%bb%a3%e7%a0%81.html" title="WordPress评论中保留Html代码 (2009/10/31)">WordPress评论中保留Html代码</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/03/%e5%9b%be%e7%89%87%e7%ad%89%e8%b5%84%e6%ba%90%e7%9a%84%e5%bc%95%e7%94%a8%e8%b7%af%e5%be%84%e9%97%ae%e9%a2%98.html" title="图片等资源的引用路径问题 (2009/03/19)">图片等资源的引用路径问题</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/07/%e8%8e%ab%e5%90%8d%e5%85%b6%e5%a6%99%e7%9a%84silverlight%e8%b5%84%e6%ba%90%e6%96%87%e4%bb%b6%e5%bc%95%e7%94%a8%e9%97%ae%e9%a2%98.html" title="莫名其妙的Silverlight资源文件引用问题 (2009/07/06)">莫名其妙的Silverlight资源文件引用问题</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/03/%e8%b0%88%e8%b0%88silverlight%e7%9a%84%e4%b8%80%e4%b8%aa%e8%b7%a8%e5%9f%9f%e5%ae%89%e5%85%a8%e8%80%83%e8%99%91.html" title="谈谈Silverlight的一个跨域安全考虑 (2009/03/19)">谈谈Silverlight的一个跨域安全考虑</a> </li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.imkevinyang.com/2009/07/%e8%b7%a8%e5%9f%9f%e4%b8%8b%e8%af%b7%e6%b1%82silverlight-xap%e5%8c%85%e5%bc%95%e8%b5%b7%e7%9a%84%e9%97%ae%e9%a2%98.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>谈谈Silverlight的一个跨域安全考虑</title>
		<link>http://www.imkevinyang.com/2009/03/%e8%b0%88%e8%b0%88silverlight%e7%9a%84%e4%b8%80%e4%b8%aa%e8%b7%a8%e5%9f%9f%e5%ae%89%e5%85%a8%e8%80%83%e8%99%91.html</link>
		<comments>http://www.imkevinyang.com/2009/03/%e8%b0%88%e8%b0%88silverlight%e7%9a%84%e4%b8%80%e4%b8%aa%e8%b7%a8%e5%9f%9f%e5%ae%89%e5%85%a8%e8%80%83%e8%99%91.html#comments</comments>
		<pubDate>Thu, 19 Mar 2009 13:44:00 +0000</pubDate>
		<dc:creator>Kevin Yang</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[技术随笔]]></category>
		<category><![CDATA[Crossdomain.xml]]></category>
		<category><![CDATA[安全策略文件]]></category>
		<category><![CDATA[跨域]]></category>

		<guid isPermaLink="false">http://www.imkevinyang.com/2009/03/%e8%b0%88%e8%b0%88silverlight%e7%9a%84%e4%b8%80%e4%b8%aa%e8%b7%a8%e5%9f%9f%e5%ae%89%e5%85%a8%e8%80%83%e8%99%91.html</guid>
		<description><![CDATA[<p>在文档中看到Silverlight在设计的时候对网络安全方面做了很多考虑。但由于本人对安全方面并不是特别懂，所以看得挺模糊的。最近和同事黄讨论了其中一些点，得到一些结论，和大家分享一下。</p>
<p>在文档中有这么一段话： </p>
<blockquote><p>There are important security considerations before y&#8230;</p></blockquote>]]></description>
			<content:encoded><![CDATA[<p>在文档中看到Silverlight在设计的时候对网络安全方面做了很多考虑。但由于本人对安全方面并不是特别懂，所以看得挺模糊的。最近和同事黄讨论了其中一些点，得到一些结论，和大家分享一下。</p>
<p>在文档中有这么一段话： </p>
<blockquote><p>There are important security considerations before you allow Silverlight clients to access Web services in a cross-domain situation. Whenever you put a cross-domain policy file in place you should configure your Web server hosting the Web services to disable browser caching. This enables you to easily update the file or restrict access to your Web services if necessary. Once the cross-domain policy file is checked, it remains in effect for the browser session so the impact of non-caching to the end-user is minimal. </p>
<p><strong>In addition, all Silverlight requests are sent with cookies and authentication. This means that if you have Web services that allow users to access private information, you should host these in a different domain than the Web services exposed to third-party callers. For example, you have a Web store hosted at <a href="http://www.tailspintoys.com">http://www.tailspintoys.com</a>. Your site allows customers to store billing information that includes credit card numbers. You should not expose a Web service that returns product inventory to third-party Silverlight clients at the same domain. Because cookies and authentication are sent with each message, if you host these Web services on the same domain, you have effectively given the third-party callers access to your customer's private billing information. In this example, your publicly exposed Web services could safely be hosted at http://services.tailspintoys.com, because this is a different domain. You must carefully consider who you have exposed Web services to, and what other Web services are located at that domain. Also, you should always keep your cross-domain policy file as restrictive as possible. For more information about exposing secure Web services, see Security Considerations for Service Access and Making a Service Available Across Domain Boundaries. </strong></p>
</blockquote>
<p>我对第二段做了个简单的翻译： </p>
<p>所有的sl请求都会将Cookie和身份验证信息连同发送。这就意味着如果你有一个Web服务，允许用户访问隐私信息，那么你应该将这个web服务放置在其他的域下，和暴露给第三方调用者的web服务的域名区分开。例如，如果你有一个网店放置在<a href="http://www.tailspintoys.com">http://www.tailspintoys.com</a>，你的网店允许客户存储交易的信息，其中包含了信用卡号码。那么你不应该将一个返回产品清单的web服务放在同个主机域下，然后暴露给第三方的SL客户端。因为Cookie和身份验证信息会和请求连同发送，如果你将这些web服务放置在同个域下的话，你就给了第三方的调用者一个很方便的途径来访问你的客户的私人交易信息。在这个例子中，你暴露给第三方的web服务应该放置在http://services.tailspintoys.com。因为这是一个不同的主机域。你必须非常小心的选择哪些服务可以公开，哪些服务应该部署在那个域下。</p>
<p>我们知道Cookie中有一个主机名的属性，对于只有对于同个主机域的请求，浏览器才会把Cookie连带发送。SL也不例外。</p>
<p>假设这么一种场景：淘宝开放了一个Web服务，这个服务干什么我们并不关心。但是我们知道，如果你想要你的Web服务被其他第三方的客户端调用，你必须在网站下放置一个特定的xml文件，我们称为&quot;安全策略配置&quot;文件，Flash对应的是crossdomain.xml文件，Silverlight除了支持Flash的这个策略文件之外自己也有一套策略配置，放在clientaccesspolicy.xml文件中。与Flash不同的是，SL只会从网站的根目录下去寻找这个策略文件，也就是说即使你的web服务是放在/serivce/目录下的，那么SL客户端也会查找&quot;主机名/clientaccesspolicy.xml&quot;这个文件是否存在（我不清楚为什么要这样设计）。因此淘宝为了让他的Web服务被Silverlight支持，就必须在网站根目录下放置一个策略文件。</p>
<p>假设一个顾客在淘宝<a href="http://www.taobao.com"></a>www.taobao.com 上面购买了一些东西，登录的会话验证信息可能会存放在Cookie中，然后这个顾客又访问了一个恶意网站（<a href="http://www.eyi.com"></a>www.eyi.com 当然域名没那么弱了^^），这个恶意网站会向淘宝发送一些登录的HTTP请求。因为这个时候是属于跨域请求，所以Silverlight Runtime会去查找网站根目录下有没有这个策略文件，发现有（并且通过了文件里面定义的访问权限的验证），那么这个请求就会被允许，同时会把你在<a href="http://www.taobao.com"></a>www.taobao.com 上面的Cookie也连带发送到淘宝系统那里，那么这个时候，这个恶意网站是不是就在你不知情的情况下登录到了淘宝后台，然后这个时候他就可以执行一些你不期望的操作了。</p>
<p>当然这个例子能不能work还有待商榷，只是通过这个例子想告诉大家的是，对于策略安全文件一定要非常小心的配置好访问权限，<font color="#ff0000"><strong>暴露给第三方的</strong><strong>Web服务（涉及到跨域策略安全的），最好放在一个隔离的域下</strong></font>，这样可以降低安全风险。</p>
<p>不知道我这样理解有没有问题，如果不正确的话请纠正我~ </p>
<p>下面这张是Silverlight的跨域场景示意图</p>
<p><img title="image" style="border-right: 0px; border-top: 0px; display: inline; margin: 0px 0px 10px; border-left: 0px; border-bottom: 0px" height="357" alt="image" src="http://www.imkevinyang.com/wp-content/uploads/2009/03/image-thumb7.png" width="557" border="0" /> </p>
<p>还要说明的一点是，Silverlight Runtime在检测安全策略文件时，是先检测clientaccesspolicy.xml 再检测crossdomain.xml文件（当然拉，自己的东西肯定先检测了）。一旦请求完成，策略文件在整个应用程序会话周期内一直有效（这个感觉和浏览器为了防止DNS Rebinding攻击的做法是类似的），也就是说不用每次都请求这个文件了。如果第一次请求该文件失败，那么接下来的请求同样的也会失败。</p>
<p>策略文件只能放置在根目录下，无论你当前请求的资源是位于网站的哪个目录下。 </p>
<p>策略文件本身不允许服务器将其重定向，响应的状态码只能是200或者404，但是请求的资源本身是可以被重定向的，只要源URL和目标URL都在跨域策略文件中声明了。</p>
<p> <strong></strong>
<p align="right">——Kevin Yang</p>

	标签：<a href="http://www.imkevinyang.com/tags/crossdomainxml" title="Crossdomain.xml" rel="tag">Crossdomain.xml</a>, <a href="http://www.imkevinyang.com/categories/techarticles/silverlight" title="Silverlight" rel="tag">Silverlight</a>, <a href="http://www.imkevinyang.com/tags/silverlight" title="Silverlight" rel="tag">Silverlight</a>, <a href="http://www.imkevinyang.com/tags/%e5%ae%89%e5%85%a8%e7%ad%96%e7%95%a5%e6%96%87%e4%bb%b6" title="安全策略文件" rel="tag">安全策略文件</a>, <a href="http://www.imkevinyang.com/categories/techarticles" title="技术随笔" rel="tag">技术随笔</a>, <a href="http://www.imkevinyang.com/tags/%e8%b7%a8%e5%9f%9f" title="跨域" rel="tag">跨域</a><br />

	<h4 style="background-color:#3B3B3B;border-bottom:2px groove gray;color:#F2F2F2;margin-top:20px;padding:6px 6px 6px 15px;margin:20px 0px 0px 0px">你可能对下面的文章感兴趣</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.imkevinyang.com/2009/09/blend%e5%b0%8f%e8%b4%b4%e5%a3%ab%e6%94%b9%e5%8f%98%e9%bc%a0%e6%a0%87%e6%bb%9a%e8%bd%ae%e7%9a%84%e9%bb%98%e8%ae%a4%e8%a1%8c%e4%b8%ba-2.html" title="Blend小贴士&mdash;&mdash;改变鼠标滚轮的默认行为 (2009/09/18)">Blend小贴士&mdash;&mdash;改变鼠标滚轮的默认行为</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/02/silverlight-2-rtm-%e5%a4%9a%e5%9b%bd%e8%af%ad%e8%a8%80%e6%94%af%e6%8c%81%ef%bc%88%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e6%9c%ac%e5%9c%b0%e5%8c%96%ef%bc%89.html" title="Silverlight 2 RTM 多国语言支持（应用程序本地化） (2009/02/28)">Silverlight 2 RTM 多国语言支持（应用程序本地化）</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/03/silverlight-2%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bdxap%e5%8c%85%e4%b8%ad%e7%9a%84%e7%a8%8b%e5%ba%8f%e9%9b%86.html" title="Silverlight 2动态加载Xap包中的程序集 (2009/03/02)">Silverlight 2动态加载Xap包中的程序集</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/05/silverlight-4ria-services-%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e4%bc%98%e5%8c%96seo.html" title="Silverlight 4+RIA Services&#8211;搜索引擎优化(SEO) (2010/05/04)">Silverlight 4+RIA Services&#8211;搜索引擎优化(SEO)</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/04/silverlight-seo%ef%bc%88%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e4%bc%98%e5%8c%96%ef%bc%89%e7%99%bd%e7%9a%ae%e4%b9%a6.html" title="Silverlight SEO（搜索引擎优化）白皮书 (2009/04/06)">Silverlight SEO（搜索引擎优化）白皮书</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/03/silverlight2-%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bd%e7%a8%8b%e5%ba%8f%e9%9b%86-ondemand%e6%a8%a1%e5%bc%8fdynamic-load-assembly.html" title="Silverlight2 动态加载程序集&#8212;OnDemand模式(Dynamic Load Assembly) (2009/03/02)">Silverlight2 动态加载程序集&#8212;OnDemand模式(Dynamic Load Assembly)</a> </li>
	<li><a href="http://www.imkevinyang.com/2011/09/silverlight%e4%b8%ad%e6%97%a0%e6%b3%95%e8%ae%be%e7%bd%ae%e5%8d%ab%e6%98%9f%e7%a8%8b%e5%ba%8f%e9%9b%86%e4%b8%ba%e4%b8%ad%e7%ab%8b%e8%b5%84%e6%ba%90%e7%a8%8b%e5%ba%8f%e9%9b%86.html" title="Silverlight中无法设置卫星程序集为中立资源程序集 (2011/09/05)">Silverlight中无法设置卫星程序集为中立资源程序集</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/02/silverlight%e5%90%af%e7%94%a8assembly-caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html" title="Silverlight启用Assembly Caching之后铁通用户无法访问 (2010/02/13)">Silverlight启用Assembly Caching之后铁通用户无法访问</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/03/silverlight%e7%9a%84%e4%be%9d%e8%b5%96%e5%b1%9e%e6%80%a7%e4%b8%8e%e9%99%84%e5%8a%a0%e5%b1%9e%e6%80%a7.html" title="Silverlight的依赖属性与附加属性 (2010/03/28)">Silverlight的依赖属性与附加属性</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/03/%e5%9b%be%e7%89%87%e7%ad%89%e8%b5%84%e6%ba%90%e7%9a%84%e5%bc%95%e7%94%a8%e8%b7%af%e5%be%84%e9%97%ae%e9%a2%98.html" title="图片等资源的引用路径问题 (2009/03/19)">图片等资源的引用路径问题</a> </li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.imkevinyang.com/2009/03/%e8%b0%88%e8%b0%88silverlight%e7%9a%84%e4%b8%80%e4%b8%aa%e8%b7%a8%e5%9f%9f%e5%ae%89%e5%85%a8%e8%80%83%e8%99%91.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced

Served from: www.imkevinyang.com @ 2012-02-08 19:01:59 -->
