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

.net 4.0 .Net 4.0网站无法识别某些基于AppleWebKit的浏览器,.net-4.0,safari,cross-browser,asp.net-4.0,.net 4.0,Safari,Cross Browser,Asp.net 4.0,在我们从.NET3.5升级到.NET4.0之后,我们看到一些Safari浏览器无法交叉验证我们的网站 经过大量调查,ASP.NET在正确识别Safari浏览器方面存在问题。ASP.NET将某些Safari(可能是其他基于WebKit的浏览器)标识为Mozilla版本0.0。不支持cookie、框架、JavaScript等的浏览器。NET3.5在识别这些浏览器时没有任何问题 我们已经将测试简化为一个简单的HTTP处理程序(在vanilla 4.0网站上运行),它只返回请求者的浏览器功能 以下是一些

在我们从.NET3.5升级到.NET4.0之后,我们看到一些Safari浏览器无法交叉验证我们的网站

经过大量调查,ASP.NET在正确识别Safari浏览器方面存在问题。ASP.NET将某些Safari(可能是其他基于WebKit的浏览器)标识为Mozilla版本0.0。不支持cookie、框架、JavaScript等的浏览器。NET3.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+(麦金塔;+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>");
    }
}

使用制度;
使用System.Web;
使用System.Web.Security;
公共类PowershellTemporaryHandler:IHttpHandler
{
公共布尔可重用
{
获取{return true;}
}
公共void ProcessRequest(HttpContext上下文)
{        
HttpBrowserCapabilities hbc=context.Request.Browser;
context.Response.Write(“Type=“+hbc.Type+”
”); context.Response.Write(“Name=“+hbc.Browser+”
”); context.Response.Write(“Version=“+hbc.Version+”
”; context.Response.Write(“主版本=“+hbc.MajorVersion+”
”; context.Response.Write(“次要版本=“+hbc.MinorVersion+”
”; context.Response.Write(“Platform=“+hbc.Platform+”
”; context.Response.Write(“Is Beta=“+hbc.Beta+”
”); context.Response.Write(“Is Crawler=“+hbc.Crawler+”
”; context.Response.Write(“Is AOL=“+hbc.AOL+”
”); context.Response.Write(“Is Win16=“+hbc.Win16+”
”); context.Response.Write(“Is Win32=“+hbc.Win32+”
”); context.Response.Write(“Supports Tables=“+hbc.Tables+”
”; context.Response.Write(“支持cookies=“+hbc.cookies+”
”; context.Response.Write(“支持VBScript=“+hbc.VBScript+”
”; context.Response.Write(“支持Frames=“+hbc.Frames+”
”; context.Response.Write(“支持JavaScript=“+hbc.ecmasscriptversion.ToString()+”
”; context.Response.Write(“支持Java小程序=“+hbc.JavaApplets+”
”; context.Response.Write(“支持ActiveX控件=“+hbc.ActiveXControls+””
”; context.Response.Write(“用户代理=“+context.Request.UserAgent+”
”; } }
我们对互联网上没有提到这个问题感到困惑。似乎我们需要在网站级别将浏览器定义添加到framework/config/browsers文件夹或App_browsers文件夹中,但奇怪的是,我们需要调整浏览器定义以使.NET 4.0网站正常运行


有人对这个问题有什么经验吗?

< P>我强烈建议你考虑以下几点:


我遇到了类似的问题。似乎有些Safari用户代理没有被正确识别,而是被报告为Mozilla 0.0,但一些调查表明,这种失败并不完全是可重复的。如果我使用Firefox的UserAgent切换器发送与之前无法识别的完全相同的用户代理,并查看浏览器功能,则正确地将其报告为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)版本/5.0.2 Mobile/8C148 Safari/6533.18.5|
有人有更多关于这个问题的信息吗


编辑2011-08-24

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

<browserCaps userAgentCacheKeyLength="..." />


在配置部分。我已经将密钥长度增加到256,从那以后,问题就消失了。现在,我将尝试找出哪一个UserAgent字符串是导致缓存中毒的罪魁祸首,如果我发现了什么,我将更新这篇文章。

我尝试了此线程中的所有答案,但对于IPhone 4S中的User Agent:

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

它仍然是w
<configuration>
    <system.web>
        <browserCaps userAgentCacheKeyLength="256" />
    </system.web>
</configuration>