【问题标题】:Is it possible to disable the browserCaps functionality in ASP.NET?是否可以在 ASP.NET 中禁用 browserCaps 功能?
【发布时间】:2010-10-06 12:48:48
【问题描述】:

是否可以在 ASP.NET 中禁用 browserCaps 功能?

我希望我的网站能够可靠且准确地提供给所有浏览器,无论其功能如何。

如果他们的浏览器不支持该网站,那就是他们的问题。我的网站不应该试图自我降级以适应已失效的客户端。

这很令人沮丧,因为我猜它似乎有蜘蛛的运气不好爬网站,获取网站的较小版本导致输出缓存为剥离的文件提供服务。

【问题讨论】:

  • @Svend 您是否也知道更改用户代理可以更改捆绑/缩小中的输出?覆盖在this SO post 和更深入的in this blog post
  • @MikeSmithDev 不,但我并不感到惊讶。我以前曾与 phantomjs 和这个“功能”争论过。我正在查看的当前化身是 HTML 文本编码,我们看到 'ø' 被呈现为 ø在 Chrome 或 ø在 IE 中,有趣的是当我们在本地运行网站时,渲染是相反的(IE 获取两个实体,而 Chrome 获取一个)。
  • @MikeSmithDev 使用 browsercap 文件来切换功能可能是过去 10 分钟内我在网络技术中看到的最可怕的事情。

标签: asp.net iis-7 asp.net-4.0 browsercaps


【解决方案1】:

您可以将 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 中以正确的方式呈现菜单控件,但我不完全知道如何一次为所有输出执行此操作。

【讨论】:

    【解决方案2】:

    我目前正在尝试的一个疯狂的解决方法是注入我们自己的HttpCapabilitiesDefaultProvider,它返回一个静态HttpBrowserCapabilities。诀窍是始终返回相同的功能对象,因此通过在使用 IE9 时调用 base.GetBrowserCapabilities,我们使用 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();
    

    然而,这还没有真正经过测试,不确定此更改的确切影响。

    【讨论】:

    • 对我来说这听起来并不疯狂,这听起来最接近禁用它。
    猜你喜欢
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2018-10-16
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多