这是我在我的网站上所使用的方法:
- 在IIS上设置一个ASP.NET应用程序池的网站
- 将绑定主机设置为
your.domain.com
- 注意:不能使用
domain.com
,否则子域名将无法去除cookie。
- 在网站上创建一个名为
Static
的文件夹
- 设置另一个网站,并将其指向之前创建的
Static
文件夹。
- 将绑定主机设置为
static.domain.com
- 使用带有非托管代码的应用程序池
- 在设置中打开“会话状态”,并勾选“未启用”。
现在您拥有了一个静态网站。要进行设置,请打开Static
文件夹下的web.config
文件,并替换为以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<sessionState mode="Off" />
<pages enableSessionState="false" validateRequest="false" />
<roleManager>
<providers>
<remove name="AspNetWindowsTokenRoleProvider" />
</providers>
</roleManager>
</system.web>
<system.webServer>
<staticContent>
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00" />
</staticContent>
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
这将缓存文件30天,删除RoleManager(我不知道是否会改变任何东西,但我已经删除了所有能找到的),并从响应头中删除一个项。
但是,存在一个问题,即使部署新版本,您的内容也将被缓存,因此为了避免这种情况,我为MVC创建了一个帮助方法。基本上,您必须附加一些查询字符串,每当更改这些文件时,它们就会发生变化。
default.css?v=1 ?v=2 ...
我的MVC方法获取文件的最后写入日期,并将其附加到文件的URL上:
public static string GetContent(this UrlHelper url, string link)
{
link = link.ToLower();
var cacheBreaker = Convert.ToString(File.GetLastWriteTimeUtc(url.RequestContext.HttpContext.Request.MapPath(link)).Ticks, 16);
if (link.StartsWith("~/static", StringComparison.InvariantCultureIgnoreCase))
{
var host = url.RequestContext.HttpContext.Request.Url.Host;
host = String.Format("static.{0}", host.Substring(host.IndexOf('.') + 1));
link = String.Format("http://{0}/{1}", host, link.Substring(9));
return String.Format("{0}?v={1}", link, cacheBreaker);
}
return String.Format("{0}?v={1}", url.Content(link), cacheBreaker);
}
要在 MVC3 Razor 中使用它:
<link href="@Url.GetContent("~/static/default.css")" rel="stylesheet" type="text/css" />
如果您使用其他类型的应用程序,您可以做到同样的事情,可以创建一个方法来将HtmlLink附加到页面上。