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

来自 <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. .NET面试题系列[15] - LINQ:性能

    .NET面试题系列目录 当你使用LINQ to SQL时,请使用工具(比如LINQPad)查看系统生成的SQL语句,这会帮你发现问题可能发生在何处. 提升性能的小技巧 避免遍历整个序列 当我们仅需要一 ...

  2. 玩转JavaScript OOP[1]——复杂类型

    概述 在JavaScript中,我们可以使用函数.数组.对象,以及日期.正则等一些内置类型的实例,它们都是复杂类型的表现.从本质上讲,这些复杂类型都是Object类型.本篇将主要介绍三种Object类 ...

  3. [nRF51822] 11、基础实验代码解析大全 · 实验16 - 内部FLASH读写

     一.实验内容: 通过串口发送单个字符到NRF51822,NRF51822 接收到字符后将其写入到FLASH 的最后一页,之后将其读出并通过串口打印出数据. 二.nRF51822芯片内部flash知识 ...

  4. 学习Cassandra的开源电子书(中英文版)

    学习Cassandra的开源电子书(中英文版)发布啦:http://teddymaef.github.io/learncassandra/ 之前发布了英文版,现在包含中文版了. 学习Cassandra ...

  5. 【原】Python用例:将指定文件或目录打包成zip文件

    #This Demo is used to compress files to .zip file #Base on Windows import os import time #The files ...

  6. 关于CefSharp的坎坷之路

    项目背景: 公司的XX产品需要升级和以后支持多平台的使用.因为之前项目是由WPF实现的.目前以后想作为Html5来展示页面. 因为涉及到整体更改遇到的问题较多以及其他原因,所以只是内部内容区域先替换为 ...

  7. iOS-iOS开发简单介绍

    概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的 ...

  8. C++类的静态成员详解

    类的静态成员分为静态数据成员和静态成员函数 静态数据成员 假如我们要设计一个战争游戏,游戏中有许多的兵种.游戏的过程中,每隔一段时间每个兵种都会产生,同时由于战争的消耗,每个兵种士兵的数量又会减少.为 ...

  9. Transaction Replication6:Transaction cleanup

    distribution中暂存的Transactions和Commands必须及时cleanup,否则,distribution size会一直增长,最终导致数据更新耗时增加,影响replicatio ...

  10. LINQ系列:LINQ to SQL Join连接

    1. 一对多 var expr = context.Products .Where(p => p.Category.CategoryName == "LINQ to SQL" ...