Asp.Net 5 MVC 6 检测手机浏览器

Asp.Net 5 MVC 6 detect mobile browser

如何在 Asp.Net 5 MVC 6 中检测用户是否在移动设备上?

在以前的版本Asp MVC中,可以这样做:

Request.Browser.IsMobileDevice

问题是 Asp.Net 5 没有使用命名空间 System.Web

控制器动作中的Request变量现在是Microsoft.AspNet.Http.HttpRequest类型,旧版本是System.Web.HttpRequestBase类型。

Microsoft.AspNet.Http.HttpRequest不包含Browser属性。我尝试查看其他属性,但没有找到任何东西。

编辑: 根据要求提供一些资源证明 Asp.Net 5 不再使用 System.Web。 来自 Asp.Net documentation

ASP.NET 5 is no longer based on System.Web.dll, but is instead based on a set of granular and well factored NuGet packages allowing you to optimize your app to have just what you need.

Request.Browser.IsMobileDeviceimplementation 依赖于 . 浏览器文件 ,AFAIK 不属于 ASP.Net 5.

Let's see if someone from the team can shed some light on how they plan to implement this. There is an entry in the asp docs about mobile specific views, so they must have some plans for it.

与此同时,我想您可以创建自己的辅助方法来解析查询字符串,例如使用 SO 中 detectmobilebrowsers.com. For an alternative (and less extensive) regex see detecting a mobile browser 中的正则表达式。

按照这个想法,像这种扩展方法这样的临时解决方案可能会有所帮助,而 asp 团队提供了他们的解决方案:

public static class RequestExtensions
{
    //regex from http://detectmobilebrowsers.com/
    private static readonly Regex b = new Regex(@"(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino", RegexOptions.IgnoreCase | RegexOptions.Multiline);
    private static readonly Regex v = new Regex(@"1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-", RegexOptions.IgnoreCase | RegexOptions.Multiline);

    public static bool IsMobileBrowser(this HttpRequest request)
    {
        var userAgent = request.UserAgent();            
        if ((b.IsMatch(userAgent) || v.IsMatch(userAgent.Substring(0, 4))))
        {
            return true;
        }

        return false;
    }

    public static string UserAgent(this HttpRequest request)
    {
        return request.Headers["User-Agent"];
    }
}