在 IIS6 上将网站升级到 asp.net 4.0 后,我们发现某些 Safari 浏览器偶尔会开始出现问题。我将其追溯到 Asp.net 的 HttpBrowserCapabilities 中不正确的浏览器检测。它有时会将 Safari 浏览器检测为“mozilla”,EcmaScriptVersion==0.0。令人沮丧的是,这种情况时有时无——有时有效,有时无效。具有特定 User-Agent 的浏览器会工作一段时间,停止工作一段时间,然后再次工作一段时间。
通常情况下,不起作用的用户代理的示例如下:“用户代理 = Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-us) AppleWebKit/534.52.7 (KHTML, like Gecko) Version/5.0.6 Safari/533.22.2”
令人恼火的是,浏览器检测在我们所有非生产服务器上都正常工作。我比较了不同服务器上的 Config/Browsers/*.browser 文件,发现它们是相同的。
考虑到配置可能只是缓存在 asp.net 框架的某个地方,我还从 4.0 安装中运行了“aspnet_regbrowsers.exe -i”。这没有任何效果。
无论浏览器是否刷新了缓存,似乎都会发生这种情况 - 即使以前从未访问过该网站的浏览器也会遇到此问题。
我也重启过 IIS 几次。除了重启之外,我想不出还有什么其他办法可以尝试。
知道这可能是什么原因造成的吗?
编辑:2012 年 1 月 19 日
我花了好几天试图找出这个问题,但没有成功;我觉得这可能与应用程序池有关,因为有些应用程序池返回了正确的值,但有些则没有。当我将一个有问题的 Web 应用程序从一个应用程序池移动到另一个应用程序池时,它有时会暂时正常工作,直到第二天它就不再工作了。我猜是池中的一些线程损坏了,但我似乎无法清理它们。这个间歇性问题在回收池、停止并重新启动 iis 以及重新启动系统后仍然存在。
如果你去http://www.industrymailout.com/Industry/Capability.aspx使用 Safari,您可以看到 UserAgents 将显示为“Browser=Mozilla”,而它应该显示为“Browser=Safari”。但是,指向同一目录的相同配置的虚拟应用程序(http://www.mymailout.net/Industry/Capability.aspx) 将正常工作。
在启用 Safari 开发者菜单的情况下(在 Windows 上),我可以将用户代理更改为“Safari 5.1 - Mac”,但它会错误地检测浏览器。但“Safari 5.1 - Windows”可以正确检测到。
我设置了一个装有 Server2003 和 IIS6 的 VM 来测试它,导入了我所有的 IIS6 设置,它在那里运行良好。
我即将在一台装有 IIS7 的新机器上从头开始重新安装所有内容——我不知道我还能做什么。
答案1
这似乎是解决方案:
本质上,浏览器缓存填充不正确,因为 UserAgent 被截断为 64 字节。
在 Web.config 中设置此项后,它在所有版本的 Safari 中都可以正常工作:
<browserCaps userAgentCacheKeyLength="256" />