我在Silverlight< object>上使用时间戳技巧(使用Silverlight 4成功使用How do you force Firefox to not cache or re-download a Silverlight XAP file?中的答案,请参阅GetLastWriteTime()
。
使用Silverlight 5运行时 * ,现在看来OOB安装/自动更新功能已损坏。我有两个问题:
Application.Current.InstallState == System.Windows.InstallState.NotInstalled
始终为true
)CheckAndDownloadUpdateAsync()
始终返回e.Error == null
和e.UpdateAvailable == true
)。还有其他人遇到过这种情况,还有更好的解决方法吗?
* 精确度:目前我的应用是使用Silverlight 5工具构建的,但目标是Silverlight 4,并且在Silverlight 4 Developer Runtime上运行良好。问题发生在(至少)我的开发机器上使用Silverlight 5 Developer Runtime。
更新:我已经向Fiddler查询了我的开发箱上发生了什么。调用更新过程时,我看到:
GET /ClientBin/Client.xap?timestamp=23%2f01%2f2012+17%3a42%3a14 HTTP/1.1
If-Modified-Since: Tue, 24 Jan 2012 09:10:07 GMT
除了服务器(服务器:ASP.NET开发服务器/ 10.0.0.0,X-AspNet-版本:4.0.30319)返回新版本以及以下缓存头之外,这对我没问题。
HTTP/1.1 200 OK
Cache-Control: private
Date: Tue, 24 Jan 2012 09:11:28 GMT
每次运行应用程序时,检查请求都有正确的日期(服务器先前返回的日期),每次服务器都说它有一个新版本,并带有当前日期。我将尝试调整服务器配置。
Update2:我的Web.config文件中有一个缓存控制指令,但删除它只能解决问题的一半。现在,浏览器应用程序检测到OOB安装正常,但更新周期继续,使用相同的Fiddler跟踪。
Update3:问题肯定与调试Web服务器有关。部署到具有相同Web.config的正确IIS的相同应用程序没有此问题。但这仍然很烦人,因为它大大减慢了我的OOB调试过程。
Update4:实际上,即使在我的主IIS部署上,问题仍然存在,并且也发生在其他服务器上(并使用PHP生成时间戳而不是ASP.NET)。所以任何帮助都表示赞赏。
Update5:根据要求,这是我的代码,相当简单:
private void CheckAndDownloadUpdateCompleted(object sender, System.Windows.CheckAndDownloadUpdateCompletedEventArgs e)
{
if (e.Error != null)
{
if (e.Error is PlatformNotSupportedException)
{
UpdateType = UpdateTypes.PlatformUpdate;
//(...)
return;
}
else if (e.Error is SecurityException)
{
UpdateType = UpdateTypes.ElevationRequired;
//(...)
return;
}
else
{
// Error handling code
//(...)
}
}
else if (e.UpdateAvailable)
{
UpdateType = UpdateTypes.Available;
//(...)
return;
}
UpdateType = UpdateTypes.NoUpdate;
//(...)
}
UpdateType
是一个枚举类型属性,允许我在其他地方选择正确的本地化字符串。
更新6:各种//(...)
部分(间接)更改了应用的视图,UpdateType
不是。
答案 0 :(得分:1)
我怀疑这与内置的Cassini / Visual Studio开发服务器有关,而SL5由于某些原因不能很好地协同工作。
我也在使用你提到的反缓存技巧,我遇到了 Application.Current.InstallState 的相同行为,总是报告 NotInstalled 以及 CheckAndDownloadUpdateAsync()始终报告 e.UpdateAvailable = true 。
因此,我将Web项目配置更改为使用 IIS Express 而不是内置的Visual Studio Development服务器,并将Silverlight应用程序重新安装到桌面。最后,一切都按预期开始工作。用词 Application.Current.InstallState =已安装和 CheckAndDownloadUpdateAsync()报告 e.UpdatedAvailable = false 。
<强>更新强>:
很抱歉,没有看到您在实时IIS部署中遇到此问题。
更新2 :
我的反缓存HTML请求:
<div id="silverlightControlHost" align="center" style="height:100%">
<object data="data:application/x-silverlight-2," type="application/x-silverlight2" width="100%" height="100%">
<%
string source = @"~/ClientBin/EskomVDT.SL.xap";
string param;
if(System.Diagnostics.Debugger.IsAttached) {
param = "<param name=\"source\" value=\"" + VirtualPathUtility.ToAbsolute(source) + "\" />";
}
else {
string xapPath = HttpContext.Current.Server.MapPath(source);
DateTime xapCreationDate = System.IO.File.GetLastWriteTime(xapPath);
param = "<param name=\"source\" value=\"" + VirtualPathUtility.ToAbsolute(source) + "?ignore=" + xapCreationDate.ToString("yyyy-MM-dd-hh-mm-ss") + "\" />";
}
Response.Write(param);
%>
<param name="onError" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="5.0.61118.0" />
<param name="autoUpgrade" value="true" />
<a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=5.0.61118.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>
答案 1 :(得分:1)
从Visual Studio
运行OOB时遇到同样的问题关于远程从IIS运行,我注意到我必须编辑我添加到web.config的缓存策略 - 保持它始终显示更新/下载进度徽标(但下载速度比新版本可用时更快,可能只是部分下载,但每次都看到下载进度甚至很烦人)
我不得不删除(注释掉)试图缓存.xap直到更改的部分
<caching>
<profiles>
<add extension=".xap" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange"/>
</profiles>
</caching>
答案 2 :(得分:0)
我建议不要使用DateTime方法 而是将版本号附加到xap url。
修改强>
对不起,刚刚注意到你正在使用LastWriteTime,这应该没问题。
尝试使用fiddler在通过IIS提供xap时查看网络流量。
另外,请向我们展示执行OOB安装检查的代码。
修改2
UpdateType的默认值是多少?也许在调用CheckAndDownloadUpdateCompleted之前,可能已经运行了检查UpdateType值的代码。
关于Application.Current.InstallState,挂钩到事件App.Current.InstallStateChanged。
我想也许Application.Current.InstallState的默认值是System.Windows.InstallState.NotInstalled,直到silverlight运行时完成检查安装状态,然后它会触发InstallStateChanged事件。
当您的网页加载到网页浏览器中时,检查其html源代码,可能是最后一次文件写入时间意外更新。