gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:01:20 24 4
gpt4 key购买 nike

我们看到一些 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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com