在 ASP.NET Core 中检测移动设备

Detect mobile device in ASP.NET Core

提问人:vishnu 提问时间:12/23/2016 更新时间:2/10/2022 访问量:32567

问:

我有一个应用程序,它使用移动视图和桌面视图作为不同的html页面。现在我把它移到了 Asp.Net 核心。由于一些技术原因,我没有考虑 Bootstrap。我必须在启动中检测请求是否来自移动设备才能加载相应的布局页面。我怎样才能做到这一点?寻找类似于 IsMobileDevice 的内容。已经尝试过 MvcDeviceDetector 0.1.0-t00349acaa。它不起作用,因为我使用的是 .net 版本 4.6.1。

asp.net asp.net-mvc asp.net-core

评论

0赞 vishnu 12/23/2016
在那里,他们似乎建议使用 Bootstrap。但正如我所说,我不会使用它
0赞 Thakkar Abhishek 5/4/2020
请点击以下链接获取解决方案。stackoverflow.com/a/61575500/10137052

答:

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
            }
        }
     }

设备检测 .NET CORE

谢谢旺卡奈

评论

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
我找到的最好的解决方案。无需安装任何软件包,也无需对类关系和正确使用进行故障排除。感谢!