【问题标题】:Make IIS not render pages as WML. Ever!使 IIS 不将页面呈现为 WML。曾经!
【发布时间】:2010-11-18 16:04:02
【问题描述】:

一些背景

我目前正在开发一个移动网站,所以我一直在使用User Agent switcher(可爱的插件)在 Firefox 中切换用户代理。但是当我进入管理站点时,它呈现为WML,这让 Firefox 很困惑,所以它会尝试下载它而不是显示内容。这让我很沮丧(不是沮丧,而是足够了!)。

我想要什么!

无论请求用户代理如何,如何让我们的管理站点始终以text/html 而不是 WML 发送内容?

我可以完全控制盒子。它是 IIS 6.0。

【问题讨论】:

    标签: asp.net iis iis-6


    【解决方案1】:

    We had this,并且由于我们使用带有 html 的 razor,页面无法自动适应。对我来说,最简单的解决方法是更改​​ _ViewStart.cshtml 中的内容类型:

    Response.ContentType = "text/html";
    

    只有在没有明确设置时才会发生“自己找出内容类型”的疯狂。所以...设置它。

    您的实际视图仍然可以覆盖它:

    @{
        Layout = null;
        Response.ContentType = "application/atom+xml";
    }
    

    有关信息,要在本地开发服务器上测试此问题(使用干净的缓存以避免先前缓存数据产生错误结果),请执行 wget 或 Fiddler 之类的操作:

    wget yourpage --header="Accept: text/vnd.wap.wml" --server-response --header="Accept-Encoding: gzip, deflate"
    

    然后寻找:

    Content-Type: text/vnd.wap.wml; charset=utf-8
    

    在结果中;如果您看到了,IIS/ASP.NET 已经决定假装您的回复满足请求的“接受”标头……即使它不满足。更糟糕的是:您现在可能能够从 wget 获取“text/vnd.wap.wml”,而无需指定 Accept 标头(或指定类似“text/html”之类的内容);如果您看到这个您有问题(或者:您的用户有问题) - 您有一个缓存的 WAP 响应,该响应正被提供给非 WAP 客户端。

    通过上述调整,第一个 wget 将返回 "text/html" - 因为这就是我们的内容。对不起,低级浏览器;您应该将“text/html”作为一个选项包含在内 - 如果您不能处理“text/html”......那么你就糟透了。

    【讨论】:

      【解决方案2】:

      如果您想要无代码/无 aspx 更改,您可以将浏览器功能文件添加到应用程序根目录下的 App_Browsers 文件夹中(如果该文件夹不存在,只需创建它)。要禁用 WML,只需放置一个名为 ForceHtml.browser(以 .browser 结尾的任何内容)的文件,其中包含以下 XML:

      <browsers>
        <browser refID="Default">
          <capabilities>
            <capability name="preferredRenderingMime" value="text/html" />
            <capability name="preferredRenderingType" value="html32" />
            <capability name="preferredImageMime" value="image/gif" />
            <capability name="tagwriter" value="System.Web.UI.HtmlTextWriter" />
          </capabilities>
          <controlAdapters markupTextWriterType="System.Web.UI.HtmlTextWriter" />
        </browser>
      </browsers>
      

      【讨论】:

        【解决方案3】:

        使用 iis7。把它放在 global.asax 上就成功了:

        void Application_OnUpdateRequestCache() {
          if (Response.ContentType == "text/vnd.wap.wml") {
            Response.ContentType = "text/html";
          }
        }
        

        【讨论】:

          【解决方案4】:

          作为一种解决方法(如果您无法配置应用程序),您可以为 firefox https://addons.mozilla.org/en-US/firefox/addon/62 安装 wmlbrowser 插件。

          【讨论】:

          • 并没有真正回答我的问题,但帮助我解决了我的问题 :) Cheerio!
          【解决方案5】:

          Configure the MIME type 用于 text/html 的 wml 扩展。您还可以创建自定义HTTPHandler 并将扩展的脚本映射指向 ASP.NET。然后,您可以检查您的条件并以您想要的任何方式强制渲染。

          【讨论】:

          • 我试图更改网络服务器上的 Mime 类型,但我似乎没有帮助。所以我会尝试创建一个自定义的HttpHandler
          【解决方案6】:

          您可以使用页面的ClientTarget 属性覆盖服务器的行为。

          在代码中:

          Page.ClientTarget = "uplevel";
          

          在@页面声明中:

          <%@Page [...] clientTarget="uplevel" %>
          

          遗憾的是,我认为您不能在 web.config 的 pages element 中设置它。

          【讨论】:

          • 这并不能解决问题。
          【解决方案7】:

          这听起来更像是与您的管理系统有关,因为作为管理站点的 IIS 框将用户代理视为移动设备,并更改了它呈现您的请求的方式,从标准 HTML 到 .wml。我相信你需要在应用程序中进行更改。

          【讨论】:

          • 您好,感谢您的回答。这也是我的第一个想法。但是由于我在代码中没有找到这样的东西,所以我创建了一个新的 WebbApplication 并使用诺基亚 n95 用户代理进行了尝试,并获得了 wml 格式的内容。如果我尝试使用该用户代理浏览 SO,我也会得到 text/vnd.wap.wml 的响应。这让我觉得 asp.net 对不同的用户代理使用不同的内容类型。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-21
          • 2016-02-14
          • 1970-01-01
          • 2014-02-09
          相关资源
          最近更新 更多