【问题标题】:.Net 4.0 website cannot identify some AppleWebKit based browsers.Net 4.0 网站无法识别某些基于 AppleWebKit 的浏览器
【发布时间】:2011-07-25 14:12:11
【问题描述】:

在我们从 .NET 3.5 升级到 .NET 4.0 后,我们发现一些 Safari 浏览器无法交叉验证我们的网站。

经过大量调查,结果证明是 ASP.NET 正确识别 Safari 浏览器的问题。 ASP.NET 将某些 Safari(可能是其他基于 WebKit 的浏览器)标识为 Mozilla 版本 0.0。不支持 cookie、框架、JavaScript 等的浏览器。.NET 3.5 识别这些浏览器没有任何问题。

我们已将测试简化为一个简单的 HTTP 处理程序(在 vanilla 4.0 网站上运行),它只返回请求者的浏览器功能。

以下是一些无法识别的用户代理(它们被识别为 Mozilla 0.0):

  • Mozilla/5.0+(Macintosh;+U;+Intel+Mac+OS+X+10_5_8;+en-us)+AppleWebKit/533.19.4+(KHTML,+like+Gecko)+Version/5.0.3+Safari/533.19.4
  • Mozilla/5.0+(Macintosh;+U;+Intel+Mac+OS+X+10_6_2;+en-us)+AppleWebKit/531.9+(KHTML,+like+Gecko)
  • Mozilla/5.0+(Macintosh;+U;+Intel+Mac+OS+X+10_6_7;+en-us)+AppleWebKit/533.20.25+(KHTML,+like+Gecko)+Version/5.0.4+Safari/533.20.27
  • Mozilla/5.0+(Macintosh;+U;+Intel+Mac+OS+X+10_6_6;+en-us)+AppleWebKit/533.18.1+(KHTML,+like+Gecko)

处理程序代码如下所示:

<%@ WebHandler Language="C#" Class="PowershellTemporaryHandler" %>

using System;
using System.Web;
using System.Web.Security;

public class PowershellTemporaryHandler : IHttpHandler
{
    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {        
        HttpBrowserCapabilities hbc = context.Request.Browser;
        context.Response.Write("Type=" + hbc.Type + "<br>");
        context.Response.Write("Name=" + hbc.Browser + "<br>");
        context.Response.Write("Version=" + hbc.Version + "<br>");
        context.Response.Write("Major Version=" + hbc.MajorVersion + "<br>");
        context.Response.Write("Minor Version=" + hbc.MinorVersion + "<br>");
        context.Response.Write("Platform=" + hbc.Platform + "<br>");
        context.Response.Write("Is Beta=" + hbc.Beta + "<br>");
        context.Response.Write("Is Crawler=" + hbc.Crawler + "<br>");
        context.Response.Write("Is AOL=" + hbc.AOL + "<br>");
        context.Response.Write("Is Win16=" + hbc.Win16 + "<br>");
        context.Response.Write("Is Win32=" + hbc.Win32 + "<br>");
        context.Response.Write("Supports Tables=" + hbc.Tables + "<br>");
        context.Response.Write("Supports cookies=" + hbc.Cookies + "<br>");
        context.Response.Write("Supports VBScript=" + hbc.VBScript + "<br>");
        context.Response.Write("Supports Frames=" + hbc.Frames + "<br>");
        context.Response.Write("Supports JavaScript=" + hbc.EcmaScriptVersion.ToString() + "<br>");
        context.Response.Write("Supports Java Applets=" + hbc.JavaApplets + "<br>");
        context.Response.Write("Supports ActiveX Controls=" + hbc.ActiveXControls + "<br>");
        context.Response.Write("User Agent=" + context.Request.UserAgent + "<br>");
    }
}

我们对互联网上没有提及这个问题感到困惑。似乎我们需要将浏览器定义添加到 framework/config/browsers 文件夹或网站级别的 App_Browsers 文件夹,但我们需要调整浏览器定义以使 .NET 4.0 网站正常运行似乎很奇怪.

有人对这个问题有任何经验吗?

【问题讨论】:

  • 我在使用 .net 3.5 和 4.0 时也遇到了这个问题。无法识别的用户代理示例 - “Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27”。获取 Mozilla 0.0。
  • @Magpie 下面user1777803提供的解决方案你试过了吗?
  • @Knickerless-Noggins 抱歉,这是很久以前的事了,我无法可靠地回答。

标签: .net-4.0 safari cross-browser asp.net-4.0


【解决方案1】:

我遇到了类似的问题。似乎认为某些 Safari 用户代理没有被正确识别,而是报告为 Mozilla 0.0,但一些调查表明,这种失败并不是完全可重现的。如果我使用 Firefox 的 UserAgent-Switcher 发送与之前无法识别的完全相同的用户代理并查看浏览器功能,它会被正确报告为 Safari。浏览服务器日志文件(在添加一些调试信息之后)似乎也证实了这种行为。具有相同(Safari)用户代理的相同客户端有时会被正确识别,偶尔会报告为 Mozilla 0.0 - 大多数情况下,它会在再次正确之前连续几次被错误识别......它只是似乎会影响 Safari 用户代理 - 如果有人感兴趣,我有一个相当长的列表,最近的一个是:

  • |Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; de-de) AppleWebKit/533.17.9 (KHTML, like Gecko) 版本/5.0.2 Mobile/8C148 Safari/6533.18.5|

有人知道这个问题的更多信息吗?


编辑 2011-08-24

看来我找到了问题的根本原因。 UserAgent -> BrowserCaps 解析机制使用缓存来临时存储映射。不幸的是,它(默认情况下)使用 UserAgent 字符串的前 64 个字符作为缓存键,这只是 BS... (Mozilla 0.0),但映射仍存储在缓存中,这意味着所有具有相同 64 个字符前缀的 UserAgent 字符串现在也被错误地映射,直到该缓存条目过期(滑动窗口为 1 分钟)。幸运的是,用于缓存的密钥长度可以使用

进行配置
<browserCaps userAgentCacheKeyLength="..." />

在配置部分。我已将密钥长度提高到 256,此后问题就消失了。现在,我将首先尝试找出哪个 UserAgent 字符串导致缓存中毒 - 如果我发现任何东西,我会更新这篇文章。

【讨论】:

  • 在我的日志文件中也遇到了这个问题。我要试一试。很好的故障排除。
  • 有时我希望我可以多次 +1 某事。这是其中之一。
  • @Chris Shain:我知道这种感觉。我真的花了几天时间追踪这个=)
  • 我也+1!很好地解释并很好地找到了解决方案。是的,我希望我也可以为你 +2。
  • 添加用户代理长度为 256 的 browserCaps 解决了某些设备的问题,但不适用于在 ipad/iphone 上使用 chrome 和 safari 的设备。有什么办法可以清除这些缓存的用户代理?清除两个浏览器上的浏览器缓存似乎不起作用。
【解决方案2】:

解决方案

我将&lt;browserCaps userAgentCacheKeyLength='256'&gt; 元素放在&lt;system.web&gt; 下,一切正常,如下所示:

<configuration>
    <system.web>
        <browserCaps userAgentCacheKeyLength="256" />
    </system.web>
</configuration>

详细解释

“浏览器功能用户代理缓存密钥长度”解析机制使用缓存来临时存储映射。

默认情况下,它使用 UserAgent 字符串的前 64 个字符作为缓存键,但是当弹出一个看起来属于 Safari 但实际上不是的用户代理时,无法正确解析即'Mozilla 0.0'

映射存储在缓存中,这意味着所有具有相同64个字符前缀UserAgent字符串现在都被错误映射,直到缓存条目过期,即通常为 1 分钟

用于缓存的密钥长度使用以下配置:

将密钥长度增加到 256 以解决问题。

...我无法在 web.config 文件中找到插入上述内容的正确位置。

当我在 web.config 文件中的&lt;configuration&gt; 下直接插入&lt;browserCaps userAgentCacheKeyLength="..." /&gt; 元素时,我的网络应用程序立即崩溃。

幸运的是,这发生在测试环境中,而不是生产环境中。

在网上搜索后,我发现了一个旧的 MSDN / ASP .NET 参考页面 (http://msdn.microsoft.com/en-us/library/sk9az15a%28v=vs.71%29.aspx),它表明 &lt;broswerCaps&gt; 元素是 &lt;system.web&gt; 的子元素。

【讨论】:

    【解决方案3】:

    我尝试了这个线程的所有答案,但对于 iPhone 4S 的用户代理:

    Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3 like Mac OS X; de-de) AppleWebKit/533.17.9 (KHTML, like Gecko) Mobile/8F190

    还是出错了。最终,我使用值为“uplevel”的 ClientTarget 属性来强制 ASP.NET 始终启用新的浏览器功能。我把它放在一个所有页面都继承自的基类中。

    见:http://msdn.microsoft.com/en-us/library/system.web.ui.page.clienttarget.aspx

    【讨论】:

    • +1 因为这是更多的未来证明。我很怀疑将来有人会创建一个比 IE6 更糟糕的浏览器。
    • 旧线程,但也许它有帮助:我猜这不是这种情况下的缓存机制,而是 ASP.NET 的整体糟糕的“浏览器检测”。我最近不得不用更新的(或自定义的)“.browser”文件来解决其中的几个问题。
    【解决方案4】:

    我强烈建议您考虑利用以下内容:

    http://aspnet.codeplex.com/releases/view/41420

    【讨论】:

    • 乍一看,我怀疑这是否会有所帮助,因为我已经知道您提供的链接中的浏览器定义与随 .net 4.0 安装文件分发的定义相同。但是,此页面还包括 .net 3.5 中的旧浏览器定义,如果您有兼容性问题,建议使用旧定义。似乎旧的浏览器定义对我们有用,但使用旧文件并不是一个令人满意的修复。有没有其他人知道如何使用 .Net 4.0 浏览器定义来完成这项工作?
    • 我指出这一点的目的是看看探索这些文件是否能对问题有所了解。在某些情况下,您可能需要调整这些文件以支持新的/未覆盖的客户。
    猜你喜欢
    • 2018-06-25
    • 1970-01-01
    • 2017-05-15
    • 2015-02-28
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    相关资源
    最近更新 更多