將特定用戶代理的別名添加到用戶代理別名的內部集合中。 來自 <https://msdn.microsoft.com/zh-cn/library/6379d90d(v=vs.110).aspx> 用戶代理別名的集合指示 ASP.NET 伺服器控制項應為其呈現內容的目標用戶代理。其信息可以在Page.Cl ...
將特定用戶代理的別名添加到用戶代理別名的內部集合中。
來自 <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,而弄不到其他瀏覽器類型。