49

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.

Gretel Hendricks
  • 383
  • 1
  • 4
  • 10
Domysee
  • 12,718
  • 10
  • 53
  • 84
  • why System.Web is now deprecated? Have you any documentation on it ? – Mahbubur Rahman Oct 05 '15 at 09:57
  • @MahbuburRahman - it is not deprecated perse, it is a new platform built for mobile and cloud first. what you have in previous versions of ASP.NET do not necessarily exist any longer in ASP.NET 5 as the entire design is changed (or most of the design/engine).- have a quick (albeit slightly outdated) read:https://msdn.microsoft.com/en-gb/magazine/dn879354.aspx – Ahmed ilyas Oct 05 '15 at 10:31
  • @MahbuburRahman as Ahmed said, it is not really deprecated, Asp.Net just isnt based on it anymore. I've changed the wording to remove the confusion. – Domysee Oct 05 '15 at 10:33
  • This is not really an answer, but maybe you you should think about *why* you need to do this. If it's for the UI, you can get around this with responsive frameworks like Twitter Bootstrap. Detecting mobile isn't necessary there. – ashes999 Oct 06 '15 at 14:52
  • @ashes999 thanks for the advice. In this particular case I need it because the mobile application should receive different data than the desktop application. – Domysee Oct 06 '15 at 15:18

1 Answers1

42

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"];
    }
}
Community
  • 1
  • 1
Daniel J.G.
  • 34,266
  • 9
  • 112
  • 112