我有以下代码来获取用户详细信息:
HttpBrowserCapabilities bc = HttpContext.Current.Request.Browser;
string UserAgent = HttpContext.Current.Request.UserAgent;
ENT_TrackingData ret = new ENT_TrackingData()
{
IPAddress = HttpContext.Current.Request.UserHostAddress,
Browser = bc.Browser + " " + bc.Version,
DateStamp = DateTime.Now,
PageViewed = HttpContext.Current.Request.Url.AbsolutePath,
NodeId = UmbracoHelper.GetCurrentNodeID(),
IsMobileDevice = IsMobileDevice(UserAgent),
Platform = bc.Platform
};
这很好但我注意到平台总是说我的机器的Windows NT不是Windows 7.有没有办法在ASP.Net中检测这种类型的信息?
答案 0 :(得分:28)
这就是我想出来的东西,它似乎工作得很好:
public String GetUserEnvironment(HttpRequest request)
{
var browser = request.Browser;
var platform = GetUserPlatform(request);
return string.Format("{0} {1} / {2}", browser.Browser, browser.Version, platform);
}
public String GetUserPlatform(HttpRequest request)
{
var ua = request.UserAgent;
if (ua.Contains("Android"))
return string.Format("Android {0}", GetMobileVersion(ua, "Android"));
if (ua.Contains("iPad"))
return string.Format("iPad OS {0}", GetMobileVersion(ua, "OS"));
if (ua.Contains("iPhone"))
return string.Format("iPhone OS {0}", GetMobileVersion(ua, "OS"));
if (ua.Contains("Linux") && ua.Contains("KFAPWI"))
return "Kindle Fire";
if (ua.Contains("RIM Tablet") || (ua.Contains("BB") && ua.Contains("Mobile")))
return "Black Berry";
if (ua.Contains("Windows Phone"))
return string.Format("Windows Phone {0}", GetMobileVersion(ua, "Windows Phone"));
if (ua.Contains("Mac OS"))
return "Mac OS";
if (ua.Contains("Windows NT 5.1") || ua.Contains("Windows NT 5.2"))
return "Windows XP";
if (ua.Contains("Windows NT 6.0"))
return "Windows Vista";
if (ua.Contains("Windows NT 6.1"))
return "Windows 7";
if (ua.Contains("Windows NT 6.2"))
return "Windows 8";
if (ua.Contains("Windows NT 6.3"))
return "Windows 8.1";
if (ua.Contains("Windows NT 10"))
return "Windows 10";
//fallback to basic platform:
return request.Browser.Platform + (ua.Contains("Mobile") ? " Mobile " : "");
}
public String GetMobileVersion(string userAgent, string device)
{
var temp = userAgent.Substring(userAgent.IndexOf(device) + device.Length).TrimStart();
var version = string.Empty;
foreach (var character in temp)
{
var validCharacter = false;
int test = 0;
if (Int32.TryParse(character.ToString(), out test))
{
version += character;
validCharacter = true;
}
if (character == '.' || character == '_')
{
version += '.';
validCharacter = true;
}
if (validCharacter == false)
break;
}
return version;
}
答案 1 :(得分:18)
if (Request.UserAgent.IndexOf("Windows NT 5.1") > 0)
{
//xp
}
else if (Request.UserAgent.IndexOf("Windows NT 6.0") > 0)
{
//VISTA
}
else if (Request.UserAgent.IndexOf("Windows NT 6.1") > 0)
{
//7
}
else if (Request.UserAgent.IndexOf("Windows NT 6.2") > 0)
{
//8
}
else if (Request.UserAgent.IndexOf("Windows NT 6.3") > 0)
{
//8.1
}
else if (Request.UserAgent.IndexOf("Windows NT 10.0") > 0)
{
//10
}
答案 2 :(得分:9)
根据This Official Microsoft Document,我们可以使用它来检测Windows操作系统:
String userAgent = Request.UserAgent;
if (userAgent.IndexOf("Windows NT 6.3") > 0)
{
//Windows 8.1
}
else if (userAgent.IndexOf("Windows NT 6.2") > 0)
{
//Windows 8
}
else if (userAgent.IndexOf("Windows NT 6.1") > 0)
{
//Windows 7
}
else if (userAgent.IndexOf("Windows NT 6.0") > 0)
{
//Windows Vista
}
else if (userAgent.IndexOf("Windows NT 5.2") > 0)
{
//Windows Server 2003; Windows XP x64 Edition
}
else if (userAgent.IndexOf("Windows NT 5.1") > 0)
{
//Windows XP
}
else if (userAgent.IndexOf("Windows NT 5.01") > 0)
{
//Windows 2000, Service Pack 1 (SP1)
}
else if (userAgent.IndexOf("Windows NT 5.0") > 0)
{
//Windows 2000
}
else if (userAgent.IndexOf("Windows NT 4.0") > 0)
{
//Microsoft Windows NT 4.0
}
else if (userAgent.IndexOf("Win 9x 4.90") > 0)
{
//Windows Millennium Edition (Windows Me)
}
else if (userAgent.IndexOf("Windows 98") > 0)
{
//Windows 98
}
else if (userAgent.IndexOf("Windows 95") > 0)
{
//Windows 95
}
else if (userAgent.IndexOf("Windows CE") > 0)
{
//Windows CE
}
else
{
//Others
}
答案 3 :(得分:6)
有一个名为https://github.com/ua-parser/uap-csharp的酷工具,它将用户代理解析为操作系统,浏览器,浏览器版本等...
Link to Nuget
这就是用它的方式:
public static string GetUserOS(string userAgent)
{
// get a parser with the embedded regex patterns
var uaParser = Parser.GetDefault();
ClientInfo c = uaParser.Parse(userAgent);
return c.OS.Family;
}
答案 4 :(得分:2)
没有准确这样做的方式,因为您从用户请求的标题中获取的所有信息都可以由用户轻松更改,并且可以包含任何内容。
如果您可以阅读可能不准确的信息,那么您可能需要查看this SO answer to similar question
答案 5 :(得分:2)
使用“Windows NT”之后的版本号。 Windows 7的版本号为6.1。
但是不要过分依赖,用户代理字符串是非标准。 例如,查看this list,您会看到有人在Windows 9.0中使用Internet Explorer!
答案 6 :(得分:2)
private string getOS()
{
string os = null;
if (Request.UserAgent.IndexOf("Windows NT 5.1") > 0)
{
os ="Windows XP";
return os;
}
else if (Request.UserAgent.IndexOf("Windows NT 6.0") > 0)
{
os= "Windows Vista";
return os;
}
else if (Request.UserAgent.IndexOf("Windows NT 6.1") > 0)
{
os = "Windows 7";
return os;
}
else if (Request.UserAgent.IndexOf("Intel Mac OS X") > 0)
{
//os = "Mac OS or older version of Windows";
os = "Intel Mac OS X";
return os;
}
else
{
os = "You are using older version of Windows or Mac OS";
return os;
}
}
答案 7 :(得分:2)
All In One Class
public class OS
{
public string os_name { get; set; }
public string os_version { get; set; }
public OS()
{
var ua = HttpContext.Current.Request.UserAgent;
if (ua.Contains("Android"))
{
this.os_name = "Android";
SetVersion(ua, "Android");
return;
}
if (ua.Contains("iPhone"))
{
this.os_name = "iPhone";
SetVersion(ua, "OS");
return;
}
if (ua.Contains("iPad"))
{
this.os_name = "iPad";
SetVersion(ua, "OS");
return;
}
if (ua.Contains("Mac OS"))
{
this.os_name = "Mac OS";
return;
}
if (ua.Contains("Windows NT 10"))
{
this.os_name = "Windows";
this.os_version = "10";
return;
}
if (ua.Contains("Windows NT 6.3"))
{
this.os_name = "Windows";
this.os_version = "8.1";
return;
}
if (ua.Contains("Windows NT 6.2"))
{
this.os_name = "Windows";
this.os_version = "8";
return;
}
if (ua.Contains("Windows NT 6.1"))
{
this.os_name = "Windows";
this.os_version = "7";
return;
}
if (ua.Contains("Windows NT 6.0"))
{
this.os_name = "Windows";
this.os_version = "Vista";
return;
}
if (ua.Contains("Windows NT 5.1") || ua.Contains("Windows NT 5.2"))
{
this.os_name = "Windows";
this.os_version = "XP";
return;
}
if (ua.Contains("Windows NT 5"))
{
this.os_name = "Windows";
this.os_version = "2000";
return;
}
if (ua.Contains("Windows NT 4"))
{
this.os_name = "Windows";
this.os_version = "NT4";
return;
}
if (ua.Contains("Win 9x 4.90"))
{
this.os_name = "Windows";
this.os_version = "Me";
return;
}
if (ua.Contains("Windows 98"))
{
this.os_name = "Windows";
this.os_version = "98";
return;
}
if (ua.Contains("Windows 95"))
{
this.os_name = "Windows";
this.os_version = "95";
return;
}
if (ua.Contains("Windows Phone"))
{
this.os_name = "Windows Phone";
SetVersion(ua, "Windows Phone");
return;
}
if (ua.Contains("Linux") && ua.Contains("KFAPWI"))
{
this.os_name = "Kindle Fire";
return;
}
if (ua.Contains("RIM Tablet") || (ua.Contains("BB") && ua.Contains("Mobile")))
{
this.os_name = "Black Berry";
return;
}
//fallback to basic platform:
this.os_name = request.Browser.Platform + (ua.Contains("Mobile") ? " Mobile " : "");
}
private void SetVersion(string userAgent, string device)
{
var temp = userAgent.Substring(userAgent.IndexOf(device) + device.Length).TrimStart();
var version = string.Empty;
foreach (var character in temp)
{
var validCharacter = false;
int test = 0;
if (Int32.TryParse(character.ToString(), out test))
{
version += character;
validCharacter = true;
}
if (character == '.' || character == '_')
{
version += '.';
validCharacter = true;
}
if (validCharacter == false)
break;
}
this.os_version = version;
}
}
<强>用法强>
var os = new OS();
os.os_name; // here is os name
os.os_version; // here is os vers
答案 8 :(得分:1)
VB.NET回答:我之所以加入它只是因为它可能更容易阅读和理解。
Public Function GetOS() As String
Dim MyAgent As String = Current.Request.UserAgent
If MyAgent.IndexOf("Windows NT 10.0") >= 0 Then
Return "Windows 10"
ElseIf MyAgent.IndexOf("Windows NT 6.3") >= 0 Then
Return "Windows 8.1"
ElseIf MyAgent.IndexOf("Windows NT 6.2") >= 0 Then
Return "Windows 8"
ElseIf MyAgent.IndexOf("Windows NT 6.1") >= 0 Then
Return "Windows 7"
ElseIf MyAgent.IndexOf("Windows NT 6.0") >= 0 Then
Return "Windows Vista"
ElseIf MyAgent.IndexOf("Windows NT 5.2") >= 0 Then
Return "Windows Server 2003"
ElseIf MyAgent.IndexOf("Windows NT 5.1") >= 0 Then
Return "Windows XP"
ElseIf MyAgent.IndexOf("Windows NT 5.01") >= 0 Then
Return "Windows 2000 (SP1)"
ElseIf MyAgent.IndexOf("Windows NT 5.0") >= 0 Then
Return "Windows 2000"
ElseIf MyAgent.IndexOf("Windows NT 4.5") >= 0 Then
Return "Windows NT 4.5"
ElseIf MyAgent.IndexOf("Windows NT 4.0") >= 0 Then
Return "Windows NT 4.0"
ElseIf MyAgent.IndexOf("Win 9x 4.90") >= 0 Then
Return "Windows ME"
ElseIf MyAgent.IndexOf("Windows 98") >= 0 Then
Return "Windows 98"
ElseIf MyAgent.IndexOf("Windows 95") >= 0 Then
Return "Windows 95"
ElseIf MyAgent.IndexOf("Windows CE") >= 0 Then
Return "Windows CE"
ElseIf (MyAgent.Contains("iPad")) Then
Return String.Format("iPad OS {0}", GetMobileVersion(MyAgent, "OS"))
ElseIf (MyAgent.Contains("iPhone")) Then
Return String.Format("iPhone OS {0}", GetMobileVersion(MyAgent, "OS"))
ElseIf (MyAgent.Contains("Linux") AndAlso MyAgent.Contains("KFAPWI")) Then
Return "Kindle Fire"
ElseIf (MyAgent.Contains("RIM Tablet") OrElse (MyAgent.Contains("BB") AndAlso MyAgent.Contains("Mobile"))) Then
Return "Black Berry"
ElseIf (MyAgent.Contains("Windows Phone")) Then
Return String.Format("Windows Phone {0}", GetMobileVersion(MyAgent, "Windows Phone"))
ElseIf (MyAgent.Contains("Mac OS")) Then
Return "Mac OS"
ElseIf MyAgent.IndexOf("ANDROID") >= 0 Then
Return String.Format("Android {0}", GetMobileVersion(MyAgent, "ANDROID"))
Else
Return "OS is unknown."
End If
End Function
Private Function GetMobileVersion(userAgent As String, device As String) As String
Dim ReturnValue As String = String.Empty
Dim RawVersion As String = userAgent.Substring(userAgent.IndexOf(device) + device.Length).TrimStart()
For Each character As Char In RawVersion
If IsNumeric(character) Then
ReturnValue &= character
ElseIf (character = "." OrElse character = "_") Then
ReturnValue &= "."
Else
Exit For
End If
Next
Return ReturnValue
End Function
答案 9 :(得分:0)
John VB的功能很不错但是Windows 10的行不起作用,因为你有&#34; WINDOWS&#34;大写。
它应该与其他人相同,即
If MyAgent.IndexOf("Windows NT 10.0") >= 0 Then
Return "Windows 10"
答案 10 :(得分:0)
试试这个我只是修改
string device = getOSInfo();
public String getOSInfo()
{
var ua = Request.UserAgent;
if (ua.Contains("Android"))
return string.Format("Android {0}", GetMobileVersion(ua, "Android"));
if (ua.Contains("iPad"))
return string.Format("iPad OS {0}", GetMobileVersion(ua, "OS"));
if (ua.Contains("iPhone"))
return string.Format("iPhone OS {0}", GetMobileVersion(ua, "OS"));
if (ua.Contains("Linux") && ua.Contains("KFAPWI"))
return "Kindle Fire";
if (ua.Contains("RIM Tablet") || (ua.Contains("BB") && ua.Contains("Mobile")))
return "Black Berry";
if (ua.Contains("Windows Phone"))
return string.Format("Windows Phone {0}", GetMobileVersion(ua, "Windows Phone"));
if (ua.Contains("Mac OS"))
return "Mac OS";
if (ua.Contains("Windows NT 5.1") || ua.Contains("Windows NT 5.2"))
return "Windows XP";
if (ua.Contains("Windows NT 6.0"))
return "Windows Vista";
if (ua.Contains("Windows NT 6.1"))
return "Windows 7";
if (ua.Contains("Windows NT 6.2"))
return "Windows 8";
if (ua.Contains("Windows NT 6.3"))
return "Windows 8.1";
if (ua.Contains("Windows NT 10"))
return "Windows 10";
//fallback to basic platform:
return (ua.Contains("Mobile") ? " Mobile " : "");
}
public String GetMobileVersion(string userAgent, string device)
{
var temp = userAgent.Substring(userAgent.IndexOf(device) + device.Length).TrimStart();
var version = string.Empty;
foreach (var character in temp)
{
var validCharacter = false;
int test = 0;
if (Int32.TryParse(character.ToString(), out test))
{
version += character;
validCharacter = true;
}
if (character == '.' || character == '_')
{
version += '.';
validCharacter = true;
}
if (validCharacter == false)
break;
}
return version;
}