提问人:vishnu 提问时间:12/23/2016 更新时间:2/10/2022 访问量:32567
在 ASP.NET Core 中检测移动设备
Detect mobile device in ASP.NET Core
问:
我有一个应用程序,它使用移动视图和桌面视图作为不同的html页面。现在我把它移到了 Asp.Net 核心。由于一些技术原因,我没有考虑 Bootstrap。我必须在启动中检测请求是否来自移动设备才能加载相应的布局页面。我怎样才能做到这一点?寻找类似于 IsMobileDevice 的内容。已经尝试过 MvcDeviceDetector 0.1.0-t00349acaa。它不起作用,因为我使用的是 .net 版本 4.6.1。
答:
2赞
MoustafaS
12/23/2016
#1
您可以使用此处概述的手动方法:https://stackoverflow.com/a/13086894/1419970
或者您可以使用以下库: http://www.nuget.org/packages/51Degrees.mobi/3.2.10.3-beta
两者都会为你做。
评论
0赞
vishnu
12/23/2016
无法解析“51Degrees.mobi (>= 3.2.9.1)”。NETFramework,版本=v4.6.1'。
0赞
vishnu
12/23/2016
**无法解析“51Degrees.mobi (>= 3.2.9.1)”。NETFramework,版本=v4.6.1'。** 这是我尝试 51 度时遇到的错误。我猜它不支持 .net 版本 4.6.1。
1赞
vishnu
12/23/2016
我想它会给我一个解决方案。只是我需要将方法更改为使用 .net core 进行压缩。
18赞
zholinho
10/4/2017
#2
我找到了很棒的图书馆。它非常易于使用。我不确定它是否 100% 可靠,但它涵盖了我的所有情况。
例:
public class HomeController : Controller
{
private readonly IDevice device;
public HomeController(IDeviceResolver deviceResolver)
{
this.device = deviceResolver.Device
}
public IActionResult Index()
{
if(device.Type == DeviceType.Desktop)
{
//some logic
}
else if(device.Type == DeviceType.Mobile)
{
//some logic
}
else if(device.Type == DeviceType.Tablet)
{
//some logic
}
}
}
谢谢旺卡奈
评论
0赞
Sweetie
1/7/2020
我们可以全局检查设备而不是在每个控制器或操作中检查设备吗?实际上,我想为移动设备呈现移动视图,为桌面设备呈现桌面视图
0赞
zholinho
1/9/2020
我认为它可以以同样的方式在中间件中完成。
1赞
TotPeRo
3/2/2020
#3
或者您可以使用这个免费的库 DeviceDetector.NET。
这是流行的 PHP 设备检测器库到 C# 的移植。
以下是如何使用它。
DeviceDetectorNET.DeviceDetector.SetVersionTruncation(VersionTruncation.VERSION_TRUNCATION_NONE);
var userAgent = Request.Headers["User-Agent"];
var result = DeviceDetectorNET.DeviceDetector.GetInfoFromUserAgent(userAgent);
var output = result.Success ? result.ToString().Replace(Environment.NewLine, "<br />") : "Unknown";
1赞
Filix Mogilevsky
11/29/2021
#4
这是我用于我的 .使用中间件的 NET6 项目。https://github.com/totpero/DeviceDetector.NET
using DeviceDetectorNET;
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.Use(async (context, next) =>
{
var detector = new DeviceDetector(context.Request.Headers["User-Agent"].ToString());
detector.SetCache(new DictionaryCache());
detector.Parse();
if (detector.IsMobile())
{
context.Items.Remove("isMobile");
context.Items.Add("isMobile", true);
}
else
{
context.Items.Remove("isMobile");
context.Items.Add("isMobile", false);
}
context.Items.Remove("DeviceName");
context.Items.Add("DeviceName", detector.GetDeviceName());
await next();
});
}
用法
var deviceName = HttpContext.Items["DeviceName"].ToString();
var isMobile = Convert.ToBoolean(HttpContext.Items["isMobile"]);
2赞
foad abdollahi
2/10/2022
#5
简单的解决方案
public static class Extentions
{
public static bool IsMobile(string userAgent)
{
if (string.IsNullOrEmpty(userAgent))
return false;
//tablet
if (Regex.IsMatch(userAgent, "(tablet|ipad|playbook|silk)|(android(?!.*mobile))", RegexOptions.IgnoreCase))
return true;
//mobile
const string mobileRegex =
"blackberry|iphone|mobile|windows ce|opera mini|htc|sony|palm|symbianos|ipad|ipod|blackberry|bada|kindle|symbian|sonyericsson|android|samsung|nokia|wap|motor";
if (Regex.IsMatch(userAgent, mobileRegex, RegexOptions.IgnoreCase)) return true;
//not mobile
return false;
}
}
用:
var isMobile = Extentions.IsMobile(Context.Request.Headers["user-agent"].ToString());
评论
0赞
Sylwia M
3/17/2022
我找到的最好的解决方案。无需安装任何软件包,也无需对类关系和正确使用进行故障排除。感谢!
评论