这真的很奇怪,我使用HttpContext.Request.Browser.Browser属性来检查请求来自哪个浏览器。
使用chrome时,该值为Chrome
使用firefox时,该值为Firefox
使用边时,该值为Chrome
这是HttpContext中的已知错误吗
检测IE\Edge用户最准确的方法是什么?我见过许多检查user_agent值的JS代码,但它随着IE版本的不同而不断变化,所以很难知道哪些代码更新了,哪些没有更新。
也许有人可以推荐一些很好的JS库来达到这个目的呢?
发布于 2016-12-22 19:16:14
这个方法对我来说效果很好。
if (Regex.IsMatch(HttpContext.Request.UserAgent, @"Edge\/\d+"))
{
wrkBrowser = "Edge"
}如果要检查多个浏览器,请注意检查的顺序,因为许多浏览器喜欢在其UserAgent字符串中提及其他浏览器。届时还要检查下面的条件
Request.Browser.Browser == "Chrome" 发布于 2020-11-04 20:51:20
我也面临着同样的问题,我找出了问题的根本原因,也解决了它。
解决方案是增加Web.config中的userAgentCacheKeyLength,如下所示:
<system.web>
<browserCaps userAgentCacheKeyLength="256" />
</system.web>默认情况下,userAgentCacheKeyLength的值为64。
实际情况是,IIS缓存的用户代理值达到了userAgentCacheKeyLength中定义的长度(默认情况下为64 )。因此,如果您使用Chrome命中第一个请求,IIS会将Chrome的用户代理值的前64个字符存储在缓存中。现在,如果下一次你点击来自Edge的请求,IIS将匹配前64个字符,这与Chrome类似,因此IIS将浏览器值返回为Chrome。
如果将该值增加到256,IIS将能够存储用户代理的全值,因此它将始终准确地区分Chrome和Edge浏览器。
发布于 2016-10-28 02:23:01
如果你不介意使用JS,你可以这样做:
function get_browser() {
var ua = navigator.userAgent, tem, M = ua.match(/(opera|chrome|safari|firefox|msie|trident|edge(?=\/))\/?\s*(\d+)/i) || [];
if (/trident/i.test(M[1])) {
tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
return { name: 'IE', version: (tem[1] || '') };
}
if (M[1] === 'Chrome') {
tem = ua.match(/\bOPR\/(\d+)/);
if (tem != null) { return { name: 'Opera', version: tem[1] }; }
tem = ua.match(/\bEdge\/(\d+)/);
if (tem != null) { return { name: 'Edge', version: tem[1] }; }
}
M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
if ((tem = ua.match(/version\/(\d+)/i)) != null) { M.splice(1, 1, tem[1]); }
return {
name: M[0],
version: M[1]
};
}然后,您可以简单地调用它并将结果发送到后端。它对我来说就像是一种护身符。
https://stackoverflow.com/questions/33670110
复制相似问题