clientTarget与用户代理别名
将特定用户代理的别名添加到用户代理别名的内部集合中。
来自 <https://msdn.microsoft.com/zh-cn/library/6379d90d(v=vs.110).aspx>
用户代理别名的集合指示 ASP.NET 服务器控件应为其呈现内容的目标用户代理。其信息可以在Page.ClientTarget属性中获取,且仅为一个字符串,但在MVC中无法找到类似属性,故无法作任何试验或考证。
如果未设置 ClientTarget 属性,则与 Page.Request 属性关联的 HttpBrowserCapabilities 对象将反映客户端浏览器的功能。如果设置了此属性,则将禁用客户端浏览器检测,并且页将使用与提供的值(别名)关联的浏览器功能。
Web 服务器计算机中的根配置文件 (Web.config) 定义了四个默认别名,可以用作常用用户代理字符串的缩写:
- uplevel,指定等效于 Internet Explorer 6.0 的浏览器功能。
- downlevel,指定等效于不支持客户端脚本的较旧浏览器的浏览器功能。您可以使用此别名来确认网页在已禁用客户端脚本的浏览器中的工作方式。
可以使用此属性以编程方式设置别名字符串,也可以使用 指令的 ClientTarget 特性以声明方式设置该别名。
在应用程序级别的 Web.config 文件的 clientTarget 部分中,您可以定义其他的别名。
来自 <https://msdn.microsoft.com/zh-cn/library/system.web.ui.page.clienttarget(v=vs.110).aspx>
虽然无法考证,但按个人推测,clientTarget是按照User-Agent的匹配(应该不包含正则的匹配)得出浏览器的别名,从而立即确定浏览器类型,得出浏览器别名后直接用浏览器别名去获得浏览器功能定义,而不再进行browserCaps或者Browser的匹配。而ASP.NET MVC有可能不包含对clientTarget的使用,只局限于WebForm中使用。
在WebForm的Page类的ClientTarget是如下定义

这里的_request是密封类HttpRequest的字段,HttpRequest与HttpRequestBase没有继承关系。HttpRequest的ClientTarget定义如下所示

当设置了_clientTarget之后,browsercaps会被置null,这就有对应了上文中"如果设置了此属性,则将禁用客户端浏览器检测,并且页将使用与提供的值(别名)关联的浏览器功能 ",但是即便是对broswercaps置空了,但是在获取Browser属性时又会通过Factory对其进行赋值,赋值的结果则不是另外一个HttpBrowserCapabilities了。

试验是通过反射进行的
定义了clientTarget和browsercap
<clientTarget> <add alias="IE10" userAgent="Chrome/52.0.2743.116 Safari/537.36"/> </clientTarget> <browserCaps> <use var="HTTP_USER_AGENT"/> <filter> <case match="Chrome/52.0.2743.116 Safari/537.36"> cookies=false hopegi=mr.hopegi </case> </filter> </browserCaps>
HttpRequest request = System.Web.HttpContext.Current.Request;
PropertyInfo propInfo = request.GetType().GetProperty("ClientTarget", BindingFlags.NonPublic | BindingFlags.Instance);
propInfo.SetValue(request, "IE10", null);
FieldInfo browserField=request.GetType().GetField("_browsercaps", BindingFlags.NonPublic | BindingFlags.Instance);
object bVal = browserField.GetValue(request);
注意一下这里用的是System.Web.HttpContex,而并不是MVC里面的HttpContext属性,感觉微软在这里弄得有点挫HttpContextBase和HttpContext。

没设值前是Chorme

设值完毕后,_browser属性被置空了

此时再次获取Browser属性重新计算,得出的结果不再是Chorme。失败的是,这里只能把Browser的类型弄成Unknown,而弄不到其他浏览器类型。
clientTarget与用户代理别名的更多相关文章
- C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)
#include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...
- Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具
前言 本文主要写给使用命令行来操作Git的用户,用于提高Git使用的效率.至于使用命令还是GUI(Tortoise Git或VS的Git插件)就不在此讨论了,大家根据自己的的喜好选择就好.我个人是比较 ...
- zk 起别名时候碰到的问题
第一次搭建时候都是用的ip,没什么问题,看到别人都是用的别名,于是也想试试把ip改成别名.然而 其中碰到的问题 ,快一周了才解决,现在记录下: 1.改主机别名 一直以为 修改 /etc/hosts 里 ...
- webpack配置别名alias出现的错误匹配
@(webpack) webpack是一款功能强大的前端构建工具,不仅仅是针对js,它也可通过各种loader来构建相关的less,html,image等各种资源,将webpack配合流程制定工具gu ...
- IoC组件~Autofac将多实现一次注入,根据别名Resove实例
回到目录 对于IoC容器来说,性能最好的莫过于Autofac了,而对于灵活度来说,它也是值得称赞的,为了考虑系统的性能,我们经常是在系统初始化于将所有依赖注册到容器里,当需要于根据别名把实现拿出来,然 ...
- 用户代理字符串识别工具源码与slf4j日志使用
User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本.浏览器渲染引擎.浏览器语言.浏览器插件等.UA也成为了, ...
- MyBatis中关于别名typeAliases的设置
第一种:通过在配置文件中typeAlias节点设置type的方式 <?xml version="1.0" encoding="UTF-8" ?> & ...
- alias指令:设置命令别名
alias: usage: alias [-p] [name[=value] ... ] 1. 语法 alias [参数][命令别名]=[原命令名称] 2. 功能介绍 该指令主要用于为原命令 ...
- IE 11 如何设置“用户代理字符串”
"用户代理字符串"这个术语在IE11 之前被叫作“浏览器模式”(Browser Mode),在IE11下面这个特殊的选项被放在F12的“仿真”选项下面了. Figure 1通过按下 ...
随机推荐
- redis总结
redis总结 redis与memcached redis支持更多的数据结构 redis支持数据持久化 redis支持两种存储方式:snapshot(快照)和aof(append only mode) ...
- [ZigBee] 16、Zigbee协议栈应用(二)——基于OSAL的无线控制LED闪烁分析(下)
说在前面:上一篇介绍了无线LED闪烁实现的OSAL部分,本篇介绍如何实现无线数据收发及数据处理: 上一篇是用SI跟着流程查看源码,我个人认为以架构的思维去了解代码能让人更清晰 ::ZMain.c程序入 ...
- ystep jQuery流程、步骤插件
今天小菜给大家带来又一款给力jQuery插件:ystep. 从名称上大致可以看出,这是一个流程步骤插件. 如果无意外的话,这可能是小菜近期最后一个作品了...苦逼的小菜即将创业,可能就没时间折腾啦~好 ...
- 使用ViewPager+Fragment实现选项卡切换效果
实现效果 本实例主要实现用ViewPage和Fragment实现选项卡切换效果,选项卡个数为3个,点击选项卡或滑动屏幕会切换Fragment并实现选项卡下方下边框条跟随移动效果. 本程序用androi ...
- crossplatfrom---electron入门教程
1.atom/electron github: https://github.com/atom/electron 中文文档: https://github.com/atom/electron/tree ...
- win7+IIS7下木有4.0框架问题的解决方案
- IOS 开发中 Whose view is not in the window hierarchy 错误的解决办法
在 IOS 开发当中经常碰到 whose view is not in the window hierarchy 的错误,该错误简单的说,是由于 "ViewController" ...
- hudson部署过程
hudson部署过程: java安装 http://developer.51cto.com/art/201504/470683.htm tomcat安装 http://blog.csdn.net/hu ...
- Vue.js学习笔记(4)
分享一段将 json数组数据以 csv格式导出的代码: html: <button class="btn btn-danger" @click='exportData'&g ...
- Python快速教程 尾声
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 写了将近两年的Python快速教程,终于大概成形.这一系列文章,包括Python基 ...