是否可以在 Windows 窗体应用程序中禁用通过 axShockwaveFlash 对象加载的 swf 文件的缓存?
不得不使用 WindowsBrowser 对象来获得该结果听起来有点矫枉过正。
PS:是的,我已经尝试在 Internet Explorer 中禁用整个缓存(强制浏览器在每次打开页面时加载页面),但不知何故 flash 似乎忽略了这一点。
是否可以在 Windows 窗体应用程序中禁用通过 axShockwaveFlash 对象加载的 swf 文件的缓存?
不得不使用 WindowsBrowser 对象来获得该结果听起来有点矫枉过正。
PS:是的,我已经尝试在 Internet Explorer 中禁用整个缓存(强制浏览器在每次打开页面时加载页面),但不知何故 flash 似乎忽略了这一点。
您始终可以将当前时间戳(以毫秒为单位)附加到 SWF 文件的 url。
我假设您在 axShockwave 控件中指定了一个 HTTP URI。
Shockwave Flash 播放器可以在 SWF 文件完全下载之前播放它,最简单的方法是在控件中指定网络地址,但正如您所说,您遇到了缓存失效问题。
如果 SWF 文件不是太大(即在几秒钟内完全下载),那么我会使用 HttpWebRequest 或 WebClient 下载它,将其保存到磁盘上的临时文件中,然后通过本地路径将其加载到播放器中。请注意,如果 SWF 依赖于任何域安全选项,这将破坏 SWF(Flash 播放器会限制某些操作,除非 SWF 来自与请求的操作相同的域,如果 SWF 由于没有域而在本地运行,这显然会破坏)。
我能想到的唯一选择(因为我自 2003 年以来就没有使用过 Flash ActiveX 控件,是的,9 年前)是删除、处置,然后重新创建控件 - 但我不知道是否有任何持久缓存在幕后进行。
外闪
public override void ExecuteResult(ControllerContext context)
{
DateTime dt = DateTime.Now.Subtract(new TimeSpan(1, 0, 0, 0));
context.HttpContext.Response.Clear();
FileStream fs = System.IO.File.OpenRead("path_to_swf_file");
byte[] BannerData = new byte[fs.Length];
fs.Read(BannerData, 0, BannerData.Length);
context.HttpContext.Response.ExpiresAbsolute = dt;
context.HttpContext.Response.CacheControl = "no-cache";
context.HttpContext.Response.AddHeader("Pragma", "no-cache");
context.HttpContext.Response.Charset = "utf-8";
context.HttpContext.Response.ContentEncoding = System.Text.Encoding.UTF8;
context.HttpContext.Response.Expires = -1;
context.HttpContext.Response.CacheControl = "no-cache, no-store, must-revalidate";
context.HttpContext.Response.ContentType = "application/x-shockwave-flash";
context.HttpContext.Response.AppendHeader("Content-Disposition", "attachment; filename=...");
context.HttpContext.Response.BinaryWrite(BannerData);
fs.Close();
context.HttpContext.Response.End();
}
里面
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest(whatever url);
request.requestHeaders.push(new URLRequestHeader("pragma", "no-cache"));
request.requestHeaders.push(new URLRequestHeader("Expires", "Thu, 01 Jan 1970 00:00:00 GMT, -1"));
request.requestHeaders.push(new URLRequestHeader("Cache-Control", "no-cache, no-store, must-revalidate"));
loader.load(request);