ASP.网络缓存破坏方法不起作用
本文关键字:方法 不起作用 网络 缓存 ASP | 更新日期: 2023-09-27 17:55:04
我正在尝试解决浏览器缓存的问题。每当在任何js和css文件中有任何变化时,这些文件都是从浏览器缓存而不是服务器中提供的,我在互联网上进行了研究,发现了mads krinstinsen的这篇很棒的文章。
我在我的App_Code
文件夹中的一个类中包含了以下类和方法。
using System;
using System.IO;
using System.Web;
using System.Web.Caching;
using System.Web.Hosting;
public class Fingerprint
{
public static string Tag(string rootRelativePath)
{
if (HttpRuntime.Cache[rootRelativePath] == null)
{
string absolute = HostingEnvironment.MapPath("~" + rootRelativePath);
DateTime date = File.GetLastWriteTime(absolute);
int index = rootRelativePath.LastIndexOf('/');
string result = rootRelativePath.Insert(index, "/v-" + date.Ticks);
HttpRuntime.Cache.Insert(rootRelativePath, result, new CacheDependency(absolute));
}
return HttpRuntime.Cache[rootRelativePath] as string;
}
}
后来我更改了所有aspx页面(大约500个位置)的引用,如下所示:
<script type="text/javascript" src="<%=Fingerprint.Tag("/Scripts/JQuery/jquery.color.js")%>"></script>
<script type="text/javascript" src="<%=Fingerprint.Tag("/Scripts/JQuery/jquery.glowbuttons.js?v=1.1")%>"></script>
根据建议,我还在IIS中添加了以下重写规则并安装了重写模块。
<rewrite>
<rules>
<rule name="fingerprint">
<match url="(['S]+)(/v-[0-9]+/)(['S]+)" />
<action type="Rewrite" url="{R:1}/{R:3}" />
</rule>
</rules>
</rewrite>
现在我面临的问题
在我的开发环境中,这一切都很有魅力。当我将代码发布到iis (wat和我的本地iis)时,相同的代码不起作用。
Fingerprint.Tag()
方法返回错误的url。
我的开发URL如下
http://localhost:54992/login.aspx
我的IIS网站URL如下
http://www.example.com/myClientName/login.aspx
您可能已经注意到IIS上的url段('myClientName')
的额外级别,这就是导致问题的原因。
我还添加了在URL中添加myClientName
部分的逻辑,不幸的是,这也不起作用。
在IIS托管网站上,由于url路径跳过了myClientName部分,因此出现了大量404错误。
更新1
我还尝试了以下相同方法的另一个版本,它检查代码是否在iisexpress或Full IIS中运行,并相应地生成路径
public static string Tag(string rootRelativePath)
{
if (rootRelativePath.Contains("~"))
rootRelativePath = rootRelativePath.Replace("~", string.Empty);
bool isRunningInIisExpress = Process.GetCurrentProcess()
.ProcessName.ToLower().Contains("iisexpress");
if (HttpRuntime.Cache[rootRelativePath] == null)
{
string siteAlias = string.Empty;
if (!string.IsNullOrEmpty(WebConfigurationManager.AppSettings["SiteName"]))
siteAlias = WebConfigurationManager.AppSettings["SiteName"].ToString();
string absolute = HostingEnvironment.MapPath("~" + rootRelativePath);
DateTime date = File.GetLastWriteTime(absolute);
int index = rootRelativePath.LastIndexOf('/');
string result = rootRelativePath.Insert(index, "/v-" + date.Ticks);
if (!isRunningInIisExpress)
{
siteAlias = "/" + siteAlias;
result = siteAlias + result;
}
if (File.Exists(absolute))
HttpRuntime.Cache.Insert(rootRelativePath, result, new CacheDependency(absolute));
}
return HttpRuntime.Cache[rootRelativePath] as string;
}
请给我指路。
使用相对路径或将站点设置为不同的端口,因此它将在live环境中以与dev环境相同的方式运行