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

Cha*_*had 15 safari cross-browser .net-4.0 asp.net-4.0

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

经过大量调查,结果证明ASP.NET正确识别Safari浏览器存在问题.ASP.NET将一些Safari(可能是其他基于WebKit的浏览器)标识为Mozilla Version 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>");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

exe*_*tor 24

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

  • | Mozilla/5.0(iPhone; U; CPU iPhone OS 4_2_1,如Mac OS X; de-de)AppleWebKit/533.17.9(KHTML,与Gecko一样)Version/5.0.2 Mobile/8C148 Safari/6533.18.5 |

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


编辑2011-08-24

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

<browserCaps userAgentCacheKeyLength="..." />
Run Code Online (Sandbox Code Playgroud)

在配置部分.我把密钥长度增加到256,因为问题已经消失了.现在我将尝试找出哪个UserAgent字符串负责第一个地方的缓存中毒 - 如果我发现任何内容,我会更新这篇文章.


Kei*_*ler 0

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

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