我有asp.net mvc应用程序,当我使用chrome它加载主页(它有很多.js链接)它工作正常。
但是当我按F5或刷新时,它不会加载所有.js(以及更多其他内容,例如.png偶数)链接!
除非我点击URL文本框然后输入,否则它可以正常使用。
控制台chrome中的显示:net :: ERR_CONNECTION_RESET
和标题标题:显示临时标题
在firefox中没有任何反应,应用程序正常运行。
答案 0 :(得分:1)
所有浏览器都以不同方式处理缓存。确保每次都从服务器加载资源的唯一方法是使用不同的名称来解决它。个人使用javascript文件我使用版本号并在每次修改内容时增加此数字以确保从服务器而不是从缓存加载新版本。如
<script src="myLibrary_1.0116.js">
另一个选项是保持相同的JS文件名,并在URL中添加一个字符串,例如
<script src="myLibrary.js?version=1.0116">
然后,如果您绝对希望每次都从服务器加载脚本,那么您可以使用脚本将随机字符串附加到源名称的末尾。像这样
var scriptsList=["script1.js","script2.js","script3.js"];
function buildKey(){
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890";
for( var i=0; i < 16; i++ )
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
}
window.onload = function(){
for(i=0; i<scriptsList.length; i++)
var s=[];
s[i] = document.createElement("script");
var sessionKey = buildKey();
s[i].type = "text/javascript";
s[i].src = scriptsList[i]+sessionKey;
$("head").append(s[i]);
}
var gracePeriod=25*1000;
function isCached(){
var currentTimeStamp= Date.now();
var contentGeneratedTime=parseInt(document.getElementsByTagName("BODY")[0].getAttribute("generated-Time"));
if(currentTimeStamp>contentGeneratedTime+gracePeriod)
window.reload(true);
}
<html><body generated-Time="UNIXTIMESTAMP"></body></html>
最后一个函数需要PHP或asp.net来设置body标签的时间戳。 javascript将检查以确保文档是在最近25秒内生成的,如果不是,则会在丢弃缓存时强制重新加载。
long epochTime = (DateTime.UtcNow.Ticks - 621355968000000000) / 10000;
这将为您提供asp.net中的UNIX时间戳(以毫秒为单位)
答案 1 :(得分:0)
根据主题标题回答。 在地址栏中的URL上按Enter键相当于第一次导航到URL,但会从之前的任何访问中加载缓存的资源。
按F5会重新加载页面,但也会在访问时尝试保留页面的任何请求,因此如果您通过表单向页面提交了数据并按下F5,浏览器应询问您是否要重新提交数据在访问页面时提交,如果你在网址上按Enter键,数据就会丢失。
如果您在页面上按Ctrl + F5,这将执行与F5相同的操作,但此外会忽略已执行的任何本地缓存并请求从站点加载的任何资源的新副本,例如它会请求页面中链接的任何图像的新副本,而不是从浏览器缓存中加载本地存储的副本。
此外,这些条件的变化会对每个场景产生影响,例如,如果页面有一个查询字符串(一个url后跟?[key] = [value]),那么无论页面访问方法如何(直接通过输入url或刷新)如果页面在URL中使用锚标记(#后面跟着一个字符串,例如#top),这些数据也将传递给页面,这将导致页面导航到该锚点而不管刷新方法,但在这两种情况下,刷新方法仍会影响从缓存加载或从主机中提取的资源,如上面的示例所述。
我知道这并没有解决所提出的其他问题,但它会澄清导航到网址之间的区别,首次访问后刷新页面并强制完全刷新页面,以便任何人来这里寻求答案帖子标题问题。