Domysee Domysee - 3 months ago 22
C# Question

Asp.Net 5 MVC 6 detect mobile browser

How is it possible in Asp.Net 5 MVC 6 to detect if the user is on a mobile device?

In previous version of

Asp MVC
it could be done like this:

Request.Browser.IsMobileDevice


The problem is that the namespace
System.Web
is not used by
Asp.Net 5
.

The
Request
variable in the controller actions is now of type
Microsoft.AspNet.Http.HttpRequest
, the old version was of type
System.Web.HttpRequestBase
.

Microsoft.AspNet.Http.HttpRequest
does not contain the
Browser
property. I tried looking through other properties, but didn't find anything.

EDIT: as requested some resources that prove that
Asp.Net 5
does not use
System.Web
anymore.
From the 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.

Answer

The implementation of Request.Browser.IsMobileDevice relied on the .browser files, which AFAIK are not part of 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.

In the meantime I guess you can create your own helper method parsing the query string, for example using the regex from detectmobilebrowsers.com. For an alternative (and less extensive) regex see detecting a mobile browser in SO.

Following this idea, a temporal solution like this extension method might help while the asp team provides their solution:

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"];
    }
}
Comments