我发现这样做的两种常用方法的问题:
与定制标题(这样做 web.config中)允许相同应用程序的不同的部署来不同地具有这个集。 我认为这是一个更可能出错的事情,所以我认为这是更好的,如果应用程序指定此代码。 此外, IIS6不支持此 。
包括HTML 在Web窗体母版页或MVC布局页标签似乎比上述更好。 但是,如果某些页不从这些则继承标签需要被复制,所以有一个潜在的可维护性和可靠性问题。
网络流量可以通过仅发送可以减少X-UA-Compatible标头到Internet Explorer的客户端。
结构良好的应用
如果你的应用程序中,导致所有页面,最终由一个根页面继承的方式构成,包括标签,如图其他的答案 。
遗留应用程序
否则,我认为要做到这一点的最好办法是自动的HTTP标头添加到所有HTML的响应。 要做到这一点的方法之一是使用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浏览器应使用其最新的渲染引擎(而不是兼容模式)来渲染页面。
看来,HTTP模块在web.config文件中经常注册,但这让我们回到第一个问题。 但是, 您可以通过编程在Global.asax中注册它们是这样的:
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容器也许应该管理这个。
好处
克服了这个答案开始概述的问题。
缺点
网站管理员没有对标头值控制。 这可能是一个问题,如果Internet Explorer的一个新的版本出来,并会导致网站的渲染。 然而,这可以通过具有该模块来克服读取来自应用程序的配置文件,而不是使用硬编码值标头值。
这可能需要修改与ASP.NET MVC工作。
这并不适用于静态HTML页面的工作。
该PreSendRequestHeaders在上面的代码的事件似乎并没有在IIS6火。 我还没有想出如何解决这个错误呢。