Detect Mobile Device HttpModule

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Diagnostics;

namespace RethinkMovement.Domain
{
    public class DetectMobileDevicesHttpModule : IHttpModule
    {
        public void Dispose()
        {
            
        }

        public void BeginRequest(Object s, EventArgs e)
        {
            //Debugger.Break();
            HttpApplication context = s as HttpApplication;

            if (isMobileBrowser(context.Context))
            {
                string mobilesite = System.Web.Configuration.WebConfigurationManager.AppSettings["MobileSite"];
                if (mobilesite != null)
                {
                    Uri mobile = new Uri(mobilesite);
                    if (context.Request.Url.Host == mobile.Host) return;

                    string urlrefer = "";
                    if (context.Context.Request.UrlReferrer != null)
                    {
                        urlrefer = context.Context.Request.UrlReferrer.Host;

                        
                        if (urlrefer == mobile.Host) return;
                    }



                    try
                    {
                        context.Context.Response.Redirect(mobilesite);
                        //context.Response.Status = "301 Moved Permanently";
                        //context.Response.AddHeader("Location", mobilesite);
                        //context.Response.Flush();
                        //context.Response.End();
                    }
                    catch (Exception exc)
                    {
                        throw;
                    }
                }
            }
        }

        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(BeginRequest);

            
        }

        public bool isMobileBrowser(HttpContext context)
        {
            //GETS THE CURRENT USER CONTEXT
            //HttpContext context = HttpContext.Current;

            //FIRST TRY BUILT IN ASP.NT CHECK
            if (context.Request.Browser.IsMobileDevice)
            {
                return true;
            }
            //THEN TRY CHECKING FOR THE HTTP_X_WAP_PROFILE HEADER
            if (context.Request.ServerVariables["HTTP_X_WAP_PROFILE"] != null)
            {
                return true;
            }
            //THEN TRY CHECKING THAT HTTP_ACCEPT EXISTS AND CONTAINS WAP
            if (context.Request.ServerVariables["HTTP_ACCEPT"] != null &&
                context.Request.ServerVariables["HTTP_ACCEPT"].ToLower().Contains("wap"))
            {
                return true;
            }
            //AND FINALLY CHECK THE HTTP_USER_AGENT
            //HEADER VARIABLE FOR ANY ONE OF THE FOLLOWING
            if (context.Request.ServerVariables["HTTP_USER_AGENT"] != null)
            {
                //Create a list of all mobile types
                string[] mobiles =
                    new[]
                {
                    "midp", "j2me", "avant", "docomo",
                    "novarra", "palmos", "palmsource",
                    "240x320", "opwv", "chtml",
                    "pda", "windows ce", "mmp/",
                    "blackberry", "mib/", "symbian",
                    "wireless", "nokia", "hand", "mobi",
                    "phone", "cdm", "up.b", "audio",
                    "SIE-", "SEC-", "samsung", "HTC",
                    "mot-", "mitsu", "sagem", "sony"
                    , "alcatel", "lg", "eric", "vx",
                    "NEC", "philips", "mmm", "xx",
                    "panasonic", "sharp", "wap", "sch",
                    "rover", "pocket", "benq", "java",
                    "pt", "pg", "vox", "amoi",
                    "bird", "compal", "kg", "voda",
                    "sany", "kdd", "dbt", "sendo",
                    "sgh", "gradi", "jb", "dddi",
                    "moto", "iphone","ipad"
                };

                //Loop through each item in the list created above
                //and check if the header contains that text
                foreach (string s in mobiles)
                {
                    if (context.Request.ServerVariables["HTTP_USER_AGENT"].
                                                        ToLower().Contains(s.ToLower()))
                    {
                        return true;
                    }
                }
            }

            return false;
        }

    }
}

  

posted @ 2011-08-14 22:52  无尽思绪  阅读(292)  评论(0编辑  收藏  举报