【问题标题】:MFC: MIME type "text/css" not recognized by IInternetProtocolSinkMFC:IInternetProtocolSink 无法识别 MIME 类型“text/css”
【发布时间】:2014-02-28 10:33:31
【问题描述】:

我有一个带有基于 IInternetProtocol 接口的可插入协议的网络浏览器控件。加载 HTML 网站时,一切都很好。但是在加载外部 CSS 样式表时,报告给 BINDSTATUS_MIMETYPEAVAILABLEBINDSTATUS_VERIFIEDMIMETYPEAVAILABLE 的 MIME 类型“text/css”会被忽略。

  • 如果我将注册表中的 FEATURE_BROWSER_EMULATION 设置为 8888 (IE8),则外部 CSS 会正确呈现(在文件夹“注册表”中)
  • 如果我在注册表中将 FEATURE_BROWSER_EMULATION 设置为 11001 (IE11) 或除 IE 8 兼容模式之外的任何内容,外部 CSS 将被忽略(在“注册表”文件夹中)
  • 如果 HTML 站点包含元标记 IE=edge,外部 CSS 将被忽略,因为这会强制 webbrowser 控件进入 IE11 模式
  • 如果我关闭可插拔协议,则呈现外部 CSS,与 FEATURE_BROWSER_EMULATION 设置的值无关
  • 如果我关闭可插入协议并从演示服务器(在“服务器”文件夹中)提供具有不匹配的错误 MIME 类型的 CSS 样式表,则可在 IE 和 Web 浏览器控件中重现可插入协议的行为
  • 向IHttpNegotiate接口上报headers无效
  • 使用 CoInternetSetFeatureEnabled 设置的任何其他功能控件均无效

我目前的结论

  • IE8和IE8模式下的浏览器控件完全忽略MIME类型,通过MIME嗅探发现
  • 如果传递了错误的 MIME 类型,IE9 及更高版本将失败
  • IE9+ 模式控制中的网络浏览器会忽略 MIME 类型“text/css”,就像为 CSS 样式表设置的任何其他 MIME 类型一样

我的问题

  • 有人遇到过类似的可插拔协议问题吗?如果是,你是如何解决这个问题的?
  • 如何正确加载 CSS 样式表并将其报告给 IInternetProtocolSink?

您可以在此处下载示例项目,该项目演示了行为:
https://github.com/elsamuko/SimpleBrowser

以下是不同行为的截图:
http://imgur.com/a/w3oCv

链接:
http://msdn.microsoft.com/en-us/library/aa752046%28v=vs.85%29.aspx
http://www.codeproject.com/Articles/157329/Http-Monitor-for-Webbrowser-Control
http://www.codeproject.com/Articles/12865/An-Asynchronous-Pluggable-Protocol-Handler-for-dat

【问题讨论】:

标签: internet-explorer mfc webbrowser-control mime ole


【解决方案1】:

在发布此问题的同一天,我在处理 C# 项目时遇到了完全相同的问题。

问题已通过向接收器报告 BINDSTATUS_CACHEFILENAMEAVAILABLE 得到解决。 当然,这仅在您有可用文件的本地副本时才有效。 下面的代码是用 C# 编写的,但它大致说明了它是如何工作的。

它甚至可以在没有 BINDSTATUS_MIMETYPEAVAILABLE 的情况下工作,但这可能会导致其他问题。所以不推荐这个。

希望这会有所帮助...

sink.ReportProgress(UrlMon.BINDSTATUS.BINDSTATUS_MIMETYPEAVAILABLE, mimetype);
sink.ReportProgress(UrlMon.BINDSTATUS.BINDSTATUS_CACHEFILENAMEAVAILABLE, localfilename);
sink.ReportData(UrlMon.BSCF.BSCF_DATAFULLYAVAILABLE, 0, 0);
sink.ReportResult(0, 200, null);

补充:

在实现异步时,您可能别无选择,只能写入磁盘。可插拔协议。与请求一起出现了许多额外的标志。其中一个标志是 BINDF.BINDF_NEEDFILE 标志(IInternetBindInfo::GetBindInfo 方法的第一个参数)。这个标志强制你返回一个文件。

这甚至可能是最初问题的原因。出于某种原因(只有 Microsoft 知道)Internet Explorer 通过添加 BINDF_NEEDFILE 强制 css 文件存在于磁盘上。在互联网上搜索 BINDF_NEEDFILE,你会得到很多解释。

【讨论】:

  • 感谢您的提示。我无法将文件写入光盘,所以这对我不起作用。你知道,如果我可以传递指向数据的指针而不是文件名吗?
  • 在实现异步时,您可能别无选择,只能写入磁盘。可插拔协议。与请求一起出现了许多额外的标志。其中一个标志是 BINDF.BINDF_NEEDFILE 标志(IInternetBindInfo::GetBindInfo 方法的第一个参数)。这个标志强制你返回一个文件。
  • 对 CSS 文件的请求设置了以下标志:ASYNCHRONOUS ASYNCSTORAGE PULLDATA NO_UI SILENTOPERATION DIRECT_READ FROMURLMON 这些请求没有 BINDF_NEEDFILE。
猜你喜欢
  • 2016-09-26
  • 1970-01-01
  • 2011-01-12
  • 2020-08-21
  • 1970-01-01
  • 2022-12-15
  • 2012-06-02
  • 2018-01-24
  • 1970-01-01
相关资源
最近更新 更多