在没有UserAgent字符串的情况下检测.NET版本

7
大多数现代浏览器(Chrome 10,Firefox 4,IE9)都缩短了它们的UserAgent标识符。因此,支持的.NET版本不再发送到服务器。
为了让我们的客户使用我们的ClickOnce应用程序,我们需要知道客户端支持哪些框架。
检测Chrome和Firefox ClickOnce助手的Javascript是一个开始(在Firefox 4中这些现在失败了),但我们不再有一种方法来检测客户端是否安装了.NET 2.0、3.5或4.0。
除了从UserAgent字符串中检测Windows平台并推断最可能的框架(XP=1.1,Vista=2.0,Win7=3.5)之外,我们如何检测.NET框架的支持?
(我们想防止.application文件下载,因为我们的大多数客户似乎没有注意到下载的“弹出窗口”)
4个回答

4

navigator.userAgent 在 IE9 上至少会给你扩展的 UA 字符串。


这个方向是正确的:IE9、Chrome12和FF3.6通过这种方法正确地发出.NET字符串。不幸的是,FF4没有。感谢您的建议。 - Jaspio
根据我们的观察,在IE9的所有兼容模式下,navigator.userAgent和发送到服务器的UserAgent头部完全相同。在IE9模式下,.NET版本缺失。 - dkl
我可以确认在IE9中,console.log(navigator.userAgent);返回所有框架版本。在jsfiddle.net上进行了测试。 - tbolon

2
这个问题已被微软修复。.NET版本现在以HTTP请求头“X-ClickOnceSupport”返回。
在PHP中,您可以通过getenv()获取此信息。
print getenv('HTTP_X_CLICKONCESUPPORT');

在Perl中
print $ENV{HTTP_X_CLICKONCESUPPORT};

根据这个答案,在JavaScript中无法实现。
(这一切始于检查Firefox .NET助手的代码,这促使我搜索“X-ClickOnceSupport”头。能够查看源代码解决一个谜团真是太好了!)

1
这适用于Firefox插件“.NET Framework Assistant”,但不适用于IE 9和IE 10。 - Kosta

1
我解决这个问题的方法是发送一个响应头告诉浏览器在兼容模式下运行,然后使用navigator.userAgent中的javascript检测框架版本。
页面代码后台:
Response.Headers.Add("X-UA-Compatible", "IE=7");

页面上的Javascript

// js to detect .net 3.5
// if it evaluates to true, then the user has .NET 3.5 installed
alert(navigator.userAgent.search(/\.NET.*?3\.5[\.\da-z]*?;/i) > -1);

感谢您的贡献,但我们主要的问题是较新的非IE浏览器不再在userAgent字符串中返回.NET版本。 - Jaspio

1

我不知道有什么方法可以解决这个问题。如果浏览器没有告诉你的服务器安装了哪些框架,那么你就没有其他方式找出来。


是否不可能创建一个Silverlight小部件,检测已安装的框架并通过Javascript公开结果? - Jaspio
这假设他们已经安装了Silverlight。有很多方法可以检测它,但没有一种是绝对可靠的,而且所有这些方法都有各种失败情况。 - Erik Funkenbusch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接