将特定用户代理的别名添加到用户代理别名的内部集合中。

来自 <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与用户代理别名的更多相关文章

  1. C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)

    #include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...

  2. Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具

    前言 本文主要写给使用命令行来操作Git的用户,用于提高Git使用的效率.至于使用命令还是GUI(Tortoise Git或VS的Git插件)就不在此讨论了,大家根据自己的的喜好选择就好.我个人是比较 ...

  3. zk 起别名时候碰到的问题

    第一次搭建时候都是用的ip,没什么问题,看到别人都是用的别名,于是也想试试把ip改成别名.然而 其中碰到的问题 ,快一周了才解决,现在记录下: 1.改主机别名 一直以为 修改 /etc/hosts 里 ...

  4. webpack配置别名alias出现的错误匹配

    @(webpack) webpack是一款功能强大的前端构建工具,不仅仅是针对js,它也可通过各种loader来构建相关的less,html,image等各种资源,将webpack配合流程制定工具gu ...

  5. IoC组件~Autofac将多实现一次注入,根据别名Resove实例

    回到目录 对于IoC容器来说,性能最好的莫过于Autofac了,而对于灵活度来说,它也是值得称赞的,为了考虑系统的性能,我们经常是在系统初始化于将所有依赖注册到容器里,当需要于根据别名把实现拿出来,然 ...

  6. 用户代理字符串识别工具源码与slf4j日志使用

    User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本.浏览器渲染引擎.浏览器语言.浏览器插件等.UA也成为了, ...

  7. MyBatis中关于别名typeAliases的设置

    第一种:通过在配置文件中typeAlias节点设置type的方式 <?xml version="1.0" encoding="UTF-8" ?> & ...

  8. alias指令:设置命令别名

    alias: usage: alias [-p] [name[=value] ... ] 1. 语法    alias [参数][命令别名]=[原命令名称]   2. 功能介绍 该指令主要用于为原命令 ...

  9. IE 11 如何设置“用户代理字符串”

    "用户代理字符串"这个术语在IE11 之前被叫作“浏览器模式”(Browser Mode),在IE11下面这个特殊的选项被放在F12的“仿真”选项下面了. Figure 1通过按下 ...

随机推荐

  1. 公司内部培训SQL Server传统索引结构PPT分享

    公司内部培训SQL Server传统索引结构PPT分享 下载地址 http://files.cnblogs.com/files/lyhabc/SQLServer%E4%BC%A0%E7%BB%9F%E ...

  2. [译]MVC网站教程(一):多语言网站框架

    本文简介 本博文介绍了 Visual Studio 工具生成的 ASP.NET MVC3 站点的基本框架:怎样实现网站的语言的国际化与本地化功能,从零开始实现用户身份认证机制,从零开始实现用户注册机制 ...

  3. 一个小白App开发需要了解的基本技术

    本文针对小白用户对App做一个简单的介绍,首先要了解App都有哪些类型,不同的类型适用于哪些需求,用户可以根据自己的需求选择不同的App开发. 一 App有哪些形式 WebApp:简单来说,Web A ...

  4. Microsoft Azure Web Sites应用与实践【2】—— 通过本地IIS 远程管理Microsoft Azure Web Site

    Microsoft Azure Web Sites应用与实践 系列: [1]—— 打造你的第一个Microsoft Azure Website [2]—— 通过本地IIS 远程管理Microsoft ...

  5. 自己动手写文件查找,字符串查找,查询jar包等工具

    文件查找——搜索当前目录下的文件 知道大概的文件名称,使用 findf FileName findf.py import argparse, re, os from os.path import jo ...

  6. EDM制作要点

    EDM是Email Direct Marketing的缩写,虽然也是html,但是和我们在网页上使用的html不同,因为安全原因,各大邮箱服务商级邮件客户端都会对邮件内容进行一定程度上的处理,不会按照 ...

  7. [已招满,谢谢关注]Sogou招聘C#开发人员,有意者请进

    职位名称:c#开发工程师 工作地点:搜狐网络大厦 职责:搜狗商业平台桌面产品 职位要求: 1. 计算机或者相关专业本科或以上学历 2. 精通c#,两年以上实际项目开发经验 3. 熟悉C/S开发架构和设 ...

  8. 花一分钟来看看Worktile是如何为团队协作而生的

    团队协作,我们想的更深.更远.更多,花一分钟来看看我们特别奉献的故事,然后去注册一个账号,邀请小伙伴一起来工作,你会体会Worktile才是真正懂你的协作方式.

  9. Hadoop学习笔记——搭建

    一搭建环境列表 操作系统:centos6.5 64位 JDK环境:jdk1.7.0_71 hadoop版本:社区版本2.7.2,hadoop-2.7.2-src.tar.gz 主机名 ip 角色 用户 ...

  10. 【hbase0.96】基于hadoop搭建hbase的心得

    hbase是基于hadoop的hdfs框架做的分布式表格存储系统,所谓表格系统就是在k/v系统的基础上,对value部分支持column family和column,并支持多版本读写. hbase的工 ...