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

来自 <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. ubuntu-14.04.2-desktop使用方法

    一.安装VMware Tools 1. 在VMware Workstation11.1.0下安装Ubuntu镜像:ubuntukylin-14.04.2-desktop-amd64.iso 2. 点击 ...

  2. 【译】ASP.NET应用程序和页面生命周期

    为何翻译此文 一.此文是Code Project社区2010年4月ASP.NET板块的最佳文章,说明了此文的份量: 二.锻炼自己的英文技术文章翻译能力,提高英文技术文档阅读能力: 三.了解掌握ASP. ...

  3. iOS开发系列--C语言之数组和字符串

    概览 数组在C语言中有着特殊的地位,它有很多特性,例如它的存储是连续的,数组的名称就是数组的地址等.而在C语言中是没有String类型的,那么如果要表示一个字符串,就必须使用字符数组.今天主要就介绍如 ...

  4. Mac OS X上IntelliJ IDEA 13与Tomcat 8的Java Web开发环境搭建

    这标题实在有点拗口,不知道怎么写好,但看了标题也就明白文本的内容.最近几天在折腾这些玩意儿,所以写写总结.除了环境搭建,本文还是一篇入门级的上手教程. 去下载一些东西 JDK安装 Tomcat安装 T ...

  5. 基于空项目模板创建使用Owin来host的WebApi项目

    首先创建一个空的web项目,如下图所示: 项目创建成功以后,安装下面三个package. Install-Package Microsoft.AspNet.WebApi -Version 5.2.2I ...

  6. 队列送券的实际应用--ConcurrentLinkedQueue并发队列

    1.TicketQueue.java--队列封装类,负责如下职责:a.把活动登记对象放入队列中b.从队列中获取活动登记对象,并派券 package com.datong.pear.ticket; im ...

  7. OpenCascade Primitives BRep-Cylinder

    OpenCascade Primitives BRep-Cylinder eryar@163.com Abstract. BRep is short for Boundary Representati ...

  8. 使H1 H2等标签不换行

    在网页优化中,经常要使用H标签对关键字进行优化, 可是如果是一行文字中的某个词加上了H1标记,就会换行. 可以使用下面的方法,H标签就不会强制换行了. <style type="tex ...

  9. Android Drawable、Bitmap、byte[]之间的转换

    转自http://blog.csdn.net/june5253/article/details/7826597 1.Bitmap-->Drawable Bitmap drawable2Bitma ...

  10. ASP.NET MVC之JsonResult(六)

    前言 这一节我们利用上节所讲Unobtrusive Ajax并利用MVC中的JsonResult来返回Json数据. JsonResult 上节我们利用分部视图返回数据并进行填充,当我们发出请求需要获 ...