MFC:IInternetProtocolSink无法识别MIME类型“text / css”

时间:2014-02-04 12:36:54

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

我有一个带有基于IInternetProtocol接口的可插拔协议的webbrowser控件。加载HTML网站时,一切都很好。但是,在加载外部CSS样式表时,将忽略报告为 BINDSTATUS_MIMETYPEAVAILABLE 的MIME类型“text / css”和 BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE

  • 如果我将注册表中的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和webbrowser控件中再现可插入协议的行为
  • 向IHttpNegotiate接口报告标头无效
  • 使用CoInternetSetFeatureEnabled设置的任何其他功能控件都无效

到目前为止我的结论

  • IE8和IE8模式下的webbrowser控件完全忽略了MIME类型,并通过MIME嗅探找到它
  • 如果传递了错误的MIME类型,IE9及更高版本将失败
  • IE9 +模式控件中的webbrowser忽略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

1 个答案:

答案 0 :(得分:3)

在发布此问题的同一天,我在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,你会得到很多解释。