.net-4.0 - .Net 4.0 网站无法识别某些基于 AppleWebKit 的浏览器

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

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

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

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

以下是一些无法识别的 User-Agents(它们被识别为 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 网站的浏览器定义才能正常运行似乎很奇怪.

    有没有人有这个问题的经验?

    最佳答案

    我一直在遇到似乎是类似的问题。似乎认为某些 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) Version/5.0.2 Mobile/8C148 Safari/6533.18.5|

  • 有没有人有关于这个问题的更多信息?

    编辑 2011-08-24

    看来我已经找到了问题的根本原因。 UserAgent -> BrowserCaps 解析机制使用缓存来临时存储映射。不幸的是,它(默认情况下)使用 UserAgent 字符串的前 64 个字符作为缓存键,这只是废话......偶尔会弹出一个看起来像 Safari 的用户代理,但实际上不是,并且没有正确解析(Mozilla 0.0),但映射仍然存储在缓存中,这意味着所有具有相同 64 个字符前缀的 UserAgent 字符串现在也被错误地映射,直到该缓存条目过期(滑动窗口 1 分钟)。幸运的是,用于缓存的 key 长度可以配置为
    <browserCaps userAgentCacheKeyLength="..." />
    

    在配置部分。我已将 key 长度增加到 256,此后问题就消失了。现在,我将尝试找出首先导致缓存中毒的 UserAgent 字符串 - 如果我发现任何内容,我将更新这篇文章。

    关于.net-4.0 - .Net 4.0 网站无法识别某些基于 AppleWebKit 的浏览器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5478181/

    相关文章:

    c# - Windows XP 上的 WPF 视觉问题

    entity-framework - 将 Entity Framework 与存储过程和未命名列一起使用

    xcode - 使用iOS模拟器调试网络请求,网络请求数据未显示

    c# - 为 NumericUpDown 绘制边框

    wpf - 如何连接 ViewModel 中的撤消命令以供 Ctrl-Z 调用?

    jquery - jQuery更改了HTML音频src,但先前的文件正在FF和Chrome中播放

    image - 边界半径 Safari

    css - 用于测试 CSS 代码的技术有哪些?

    html - 就在我认为我的网站工作正常时,它在 IE7 中搞砸了

    javascript - 在文本框中按 enter 不会触发 firefox 中提交按钮的 onclick 事件