是否可以在 ASP.NET 中禁用 browserCaps 功能?
我希望我的网站能够可靠且完全按照我为所有浏览器定义的方式提供服务,无论它们的功能如何。
如果他们的浏览器不支持该站点,那就是他们的问题。我的网站不应该试图自我降级以适应已失效的客户端。
当它似乎有蜘蛛的运气不好时,这非常令人沮丧,我猜想爬取站点,获取站点的较小版本导致输出缓存为剥离的文件提供服务。
是否可以在 ASP.NET 中禁用 browserCaps 功能?
我希望我的网站能够可靠且完全按照我为所有浏览器定义的方式提供服务,无论它们的功能如何。
如果他们的浏览器不支持该站点,那就是他们的问题。我的网站不应该试图自我降级以适应已失效的客户端。
当它似乎有蜘蛛的运气不好时,这非常令人沮丧,我猜想爬取站点,获取站点的较小版本导致输出缓存为剥离的文件提供服务。
您可以将 ClientTarget="uplevel" 放在页面指令或 Page.Init
<%@ Page ClientTarget="uplevel" ...... %>
或者
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Init
Page.ClientTarget = "uplevel"
End Sub
另一种选择是将.browser文件添加到您的站点,在文件夹 App_Browsers(默认的 Asp.NET 文件夹)中。它应该使用正则表达式针对所有浏览器,并通过添加功能以某种方式禁用正常的浏览器检测。我只是使用它在 Safari 中以正确的方式呈现菜单控件,但我并不完全知道如何一次为所有输出执行此操作。
我目前正在尝试的一个疯狂的解决方法是注入我们自己的HttpCapabilitiesDefaultProvider
,它返回一个 static HttpBrowserCapabilities
。诀窍是始终返回相同的功能对象,因此通过base.GetBrowserCapabilities
在使用 IE9 时调用,我们使用 Newtonsoft 创建了一个序列化,并且通过将这个字符串保存在源代码中,我们可以构建一个类似 IE9 的功能对象,无论是什么浏览器发起了请求。
public class CustomerHttpCapabilitiesProvider : HttpCapabilitiesDefaultProvider
{
private const string m_IE9Definition = "{\r\n \"$type\": \"System.Web.Mobile.MobileCapabilities, System.Web.Mobile\",\r\n \"UseOptimizedCacheKey\":..... ";
private readonly static Lazy<MobileCapabilities> m_Capabilities = new Lazy<MobileCapabilities>(() => JsonConvert.DeserializeObject<MobileCapabilities>(m_IE9Definition), true);
public override HttpBrowserCapabilities GetBrowserCapabilities(HttpRequest request)
{
return m_Capabilities.Value;
}
}
然后在以下位置分配提供者Application_Start
:
HttpCapabilitiesBase.BrowserCapabilitiesProvider = new CustomerHttpCapabilitiesProvider();
然而,这还没有真正经过测试,不确定这种变化的影响究竟是什么。