我发现这两种常见方法存在问题:
在web.config中使用自定义标头( )执行此操作允许同一应用程序的不同部署以不同方式设置此设置 . 我认为这是一个可能出错的事情,所以我认为如果应用程序在代码中指定它会更好 . 另外,IIS6 doesn't support this .
在Web窗体母版页或MVC布局页面中包含HTML 标记似乎比上述更好 . 但是,如果某些页面存在潜在的可维护性和可靠性问题 .
仅通过向Internet Explorer客户端发送 X-UA-Compatible 标头可以减少网络流量 .
结构良好的应用程序
如果您的应用程序的结构导致所有页面最终都从单个根页继承,请包含 标记,如the other answers所示 .
旧版应用程序
否则,我认为最好的方法是自动将HTTP标头添加到所有HTML响应中 . One way to do this正在使用 IHttpModule :
public class IeCompatibilityModeDisabler : IHttpModule
{
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += (sender, e) => DisableCompatibilityModeIfApplicable();
}
private void DisableCompatibilityModeIfApplicable()
{
if (IsIe && IsPage)
DisableCompatibilityMode();
}
private void DisableCompatibilityMode()
{
var response = Context.Response;
response.AddHeader("X-UA-Compatible", "IE=edge");
}
private bool IsIe { get { return Context.Request.Browser.IsBrowser("IE"); } }
private bool IsPage { get { return Context.Handler is Page; } }
private HttpContext Context { get { return HttpContext.Current; } }
public void Dispose() { }
}
IE=edge 表示IE应该使用其最新的渲染引擎(而不是兼容模式)来呈现页面 .
public class Global : HttpApplication
{
private static IeCompatibilityModeDisabler module;
void Application_Start(object sender, EventArgs e)
{
module = new IeCompatibilityModeDisabler();
}
public override void Init()
{
base.Init();
module.Init(this);
}
}
请注意,重要的是模块是 static 并且未在 Init 中实例化,因此每个应用程序只有一个实例 . 当然,在实际应用程序中,IoC容器应该可以管理它 .
优点
克服本答案开头概述的问题 .
缺点
网站管理员不要使用硬编码值来配置文件 .
这可能需要修改才能使用ASP.NET MVC .
这不适用于静态HTML页面 .
上面代码中的 PreSendRequestHeaders 事件还没有弄清楚如何解决这个bug .