asp.net mvc让我告诉你请求从哪里来

摘要:
用户代理请求头字段允许客户端告诉服务器其操作系统、浏览器和其他属性。让我们看一下以下示例,并进行一些测试:根据我的屏幕截图,您可以观察到相应的不同applephone6用户代理:Mozilla/5.0AppleWebKit/60.0.1.3版本/8.0Mobile/12A4435dSafari/60.0.1.4三星Galaxy Note3用户代理:Mozilla/5.0 AppleWebKit/534.30版本/4.0MobileSafari/534.30 NokiaLumia520用户代理:Mozilla/5.0PC浏览器用户代理:Movilla/5.0AppleWeb Kit/537.36Chrome/43.0.23 MVC处理请求并识别请求源Netmvc,我们首先想到的是路由系统或过滤器。只有一个目标,那就是在请求处理管道前面找到一个位置来判断请求并重写相应的URL。请求来自PC,网站指向PC站点,请求来自移动网站指向移动站点。

移动互联网的兴起,导致越来越多的网站开始看中自己的mobile站点(m站),例如我们用手机浏览器访问58,美团等网站都会看到适配的m站点,随之而来响应式布局,h5等技术随之兴起,对于一些大型网站来说,可能会投入专门的人力来研发,对于一些小型网站,或者个人网站为了更好的浏览体验可能在你用移动设备访问时候给你转到一个H5适配页面,对网站进行一些介绍引导用户注册app等。

本章目的:利用MVC的路由以便你的网站在用移动设备浏览时候指定到相应H5或者mobile页面,完善体验.

HTTP协议中UserAgent

快速简洁,我们需要找到能帮助我们区分当前请求来源的部分

(1.1)HTTP协议详解之消息报头篇->UserAgent

用户代理 User Agent,是指浏览器,它的信息包括硬件平台、系统软件、应用软件和用户个人偏好。在X.400电子系统中,用户代理是一种对数据打包、创造分组头,以及编址、传递消息的部件。用户代理并不是仅指浏览器,还包括搜索引擎。当前文章主要指浏览器中

(1.2)UserAgent举例说明

我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。大家看一下下边的例子

asp.net mvc让我告诉你请求从哪里来第1张

 举例我的几个测试:大家按照我截图的就可以观察到相应的不同

(1)apple iphone6      

User-Agent:Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4

(2)Samsung Galaxy Note3

User-Agent:Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30

(3)Nokia Lumia520

User-Agent:Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)

(4)PC浏览器

User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.23 

MVC中处理请求,判别请求来源

 说到asp.net mvc我们最先想到的就是 路由系统,或者filter,目标只有一个,就是找到一个在请求处理管道靠前的位置来判断请求,进行相应url重写,请求来自pc,网站指向PC站点,请求来自mobile网站指向mobile站点。

(2.1)梳理一下mvc路由流程

 引用蒋老师的话,HttpModule和httpHandler是asp.net管道的两个重要组件,请求的最终处理通过Handler来完成,asp.net mvc就是通过一个名为mvcHandler的自定义httpHandler实现了对controller的激活和acion的执行,但是在这之前对controller和action的解析是通过asp.net mvc的url路由系统完成的,而整个url路由系统是通过一个名为urlRoutingModule的自定义httpModule实现的。

(2.2)流程图

asp.net mvc让我告诉你请求从哪里来第2张

我们思路在路由的层面,通过userAgent进行判定,将所有来自移动设备请求转到我们mobile页面的控制器

(2.3)项目实践

(1)新建一个mvc项目,创建一个pc index和一个mobile index页面

      pc首页:HomeController 

      mobile首页:MobileController

   asp.net mvc让我告诉你请求从哪里来第3张

(2)编写路由规则

新建urlProvider继承RouteBase重写GetRouteData方法用来判断userAgent

 public override RouteData GetRouteData(HttpContextBase httpContext)
 {
            string agent = httpContext.Request.UserAgent;
            //Mobile HttpRequest User-Agent 通过上边总结出的关键字
            string[] keywords = { "Android", "iPhone", "iPod", "Windows Phone", "MQQBrowser" };

            //下边逻辑:1:请求PC的控制器 2:请求来自移动设备 
            if (!httpContext.Request.RawUrl.ToLower().Contains("/mobile/"))
            {
                foreach (string item in keywords)
                {
                    if (agent.ToLower().Contains(item.ToLower()))
                    {
                        //如果是从移动设备访问该PC站点统一跳转到mobile首页
                        var data = new RouteData(this, new MvcRouteHandler());
                        data.Values.Add("controller", "Mobile");
                        data.Values.Add("action", "Index");
                        return data;
                    }

                }
            }
            return null;
  }

(3)注册我们自定义的路由重写规则Global.asax

public static void RegisterRoutes(RouteCollection routes)
{
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.Add(new UrlProvider()); //我们自定义的规则

            routes.MapRoute(
                "Default", // 路由名称
                "{controller}/{action}/{id}", // 带有参数的 URL
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
            );

}

(4)进行测试

直接通过浏览器模拟PC访问

asp.net mvc让我告诉你请求从哪里来第4张

 我们用谷歌最新版本手机模式浏览 PC主页Home/index,我们期望的结果是返回的Mobile页面

下图结果我们可以看到虽然地址是PC的地址,但是返回的效果是我们的Mobile页面。

asp.net mvc让我告诉你请求从哪里来第5张

总结:

(1)这是一篇很纠结的博客,因为自己的方案不是常规的,某种程度手机的页面或许只能放在mobile控制器下,所以我给这篇文章定位为小型网站希望增加移动设备访问页面的一种折中办法。也可以当做一篇了解http协议中userAgent这一属性的讲解。

(2)个人认为好的方案是通过nginx服务器(负载服务器)判定请求来源,apache服务器也有类似功能。然后转到相应的pc站点或者m站点,当然如果你有更好的方案或者你们的项目中有更好的方案可以分享一下。

(3)回归本源,无论是在服务器判断还是在程序中判断,我们区别的方法还是通过http,最终定位到userAgent

(4)这里感谢群友大哥:萧秦的建议 mvc中的全局过滤器GlobalFilterCollection也可以实现对请求拦截判定,也可以用FilterProvider去添加,总之原理都是通过对请求拦截,判断userAgent

文章代码地址

 http://files.cnblogs.com/files/mongo/MT.WebApp.zip

免责声明:文章转载自《asp.net mvc让我告诉你请求从哪里来》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇深入浅出接口幂等性的实现方式Calendar Provider下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Vue项目加载本地的json数据模拟请求后台数据

1. 安装express和axios npm i express --save & npm i axios --save 网速不好的,可以安装淘宝镜像,使用cnpm 2. 在main.js中引入axios,并挂载到全局 import axios from ‘axios’; Vue.prototype.$axios = axios; 3.在项目中st...

屏蔽微信内置底部前进后退按钮(很迫切的需求)

在使用window.location.href进行页面跳转或者react内部项目使用 this.props.history.push进行页面跳转时,做好的h5页面放在微信里,底部会出选前进后退的按钮,如下图: 废话不多说,解决问题: 第一种情况:如果只是页面之间跳转,使用window.location.replace 代替window.location.h...

在SDK中打开其他接入应用的解决方案

最近要在iOS中实现一个应用启动另外一个应用的功能,搜了一些资料,使用UIApplication的openURL:的方法就能实现,现在整理和大家分享一下! 一、应用间单方向的调用 注册自定义URL协议 首先被启动的应用需要向iPhone注册一个自定义URL协议。这是在你的项目文件夹的info.plist文件进行的(就是你改变应用程序图标的同一个文件)。 S...

uniapp-小程序开发中遇到的问题:

ps:约1月 || 单个项目完成时 问题1:小程序 v-show class切换失效? uniapp写的自定义组件。v-show 绑定 一个状态值 切换显示。 chrome 调试没问题。 运行在小程序开发程序上,直接展开了。未隐藏,且v-show没生效。 看参考得知,是v-show在自定义组件上不会生效(微信小程序) 最快解决方案,将 v-show 换为...

磨人的.net core 3.1(一) CORS的问题

  最近因2019年9月底,.net core 更新到了3.0,再看看我之前的项目,才没多久,有些东西都被废弃了???唉,毫无办法,能怎么样呢,看着官网文档找找手感呗。今天就来试试新的服务端跨域问题。  按照之前的配置,然后将TargetFramework改为.net core 3.1后的跨域报错信息如上。 startup.cs文件中, --------...

企业微信第三方应用开发几个注意点

不知不觉已经搞企业微信开发2年了,公司的产品(慧人力,云报餐)目前和同行比起来算是功能比较齐全的了,平时重心主要在业务上,没有对企业微信授权流程进行笔记整理。关于企业微信API,新手看有点迷糊,如果有人讲一遍就会好很多,下面把第三方应用开发中几个不好理解的地方分享下。 1、服务商平台,创建一个非通讯录应用 应用主页指的是手机端登录后访问的第一个页面,...