了解Silverlight、MEF、按需Xap加载和缓存

了解Silverlight、MEF、按需Xap加载和缓存,silverlight,caching,mef,Silverlight,Caching,Mef,我目前正在成功地使用MEF在Silverlight 4应用程序中按需加载XAP。我现在正在研究通过使用缓存来提高性能。据我所知,MEF使用WebClient下载Xap,而Xap将使用浏览器的下载机制,因此受其缓存策略的约束 在我的测试中,我看到的结果有点令人困惑,并且不同浏览器的结果有所不同。显然,在第一次访问时,在清除缓存的情况下,会从服务器请求按需XAP。而且,在应用程序会话期间,XAP只下载一次。到目前为止一切都很好 然而,我期望(或至少希望)XAP也在浏览器会话之间被缓存。但是没有-我观

我目前正在成功地使用MEF在Silverlight 4应用程序中按需加载XAP。我现在正在研究通过使用缓存来提高性能。据我所知,MEF使用WebClient下载Xap,而Xap将使用浏览器的下载机制,因此受其缓存策略的约束

在我的测试中,我看到的结果有点令人困惑,并且不同浏览器的结果有所不同。显然,在第一次访问时,在清除缓存的情况下,会从服务器请求按需XAP。而且,在应用程序会话期间,XAP只下载一次。到目前为止一切都很好

然而,我期望(或至少希望)XAP也在浏览器会话之间被缓存。但是没有-我观察到以下情况(使用fiddler):

Internet Explorer

如果刷新浏览器(Ctrl+F5),则不会从服务器请求按需XAP,而是从本地缓存加载。但是如果我重新启动浏览器,那么所有内容都会再次下载。嘘

Firefox和Chrome

如果我刷新页面(Ctrl+F5),则会再次从服务器请求按需XAP—根本不会发生缓存。喝倒采很明显,如果我重新启动浏览器,不会发生缓存

对于我来说,理想的行为是当浏览器需要加载Xap时,使用If-Modified-Since头查询服务器以查看是否存在新版本,如果存在,则下载该版本,如果不存在,则从其本地缓存加载该版本。但在我的测试中,我没有看到发送到服务器的If-Modified-Since头。因此,我的问题是:

是否有任何方法可以使用MEF透明地实现这一点?还是另一个框架?还是我必须使用独立存储来滚动我自己的缓存层(恶心)?


似乎按需Xap加载应该与缓存齐头并进,所以我很惊讶这不只是开箱即用。

好的,我在发布了这个问题后才发现这一点。我想我会在这里分享解决方案,以防其他人遇到问题:

我正在使用内置的VisualStudioWeb服务器来主持我的项目。看起来它根本不支持缓存。但当我在IIS中主持我的项目时,我看到了我想要的确切行为,特别是:

对我来说,最理想的行为是 浏览器,当需要加载Xap时, 使用 如果修改了自标头,请查看 存在新版本,如果存在,请下载 它,如果没有,则从其本地 缓存


至少在InternetExplorer中,我现在可以看到它发送If Modified-Since头,并接收最近访问的XAP的304 Not Modified响应。太好了

很高兴听到你明白了。仅供参考,随着IIS Express的发布,我不确定有多少理由再使用Visual Studio web服务器。