MFC:IInternetProtocolSink 无法识别 MIME 类型“text/css”
Posted
技术标签:
【中文标题】MFC:IInternetProtocolSink 无法识别 MIME 类型“text/css”【英文标题】:MFC: MIME type "text/css" not recognized by IInternetProtocolSink 【发布时间】:2014-02-28 10:33:31 【问题描述】:我有一个带有基于 IInternetProtocol 接口的可插入协议的网络浏览器控件。加载 html 网站时,一切都很好。但是在加载外部 CSS 样式表时,报告给 BINDSTATUS_MIMETYPEAVAILABLE 和 BINDSTATUS_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.aspxhttp://www.codeproject.com/Articles/157329/Http-Monitor-for-Webbrowser-Controlhttp://www.codeproject.com/Articles/12865/An-Asynchronous-Pluggable-Protocol-Handler-for-dat
【问题讨论】:
试试这个看看是否有帮助:***.com/a/21654398/1768303 看最后一点:“使用 CoInternetSetFeatureEnabled 设置的任何其他功能控件均无效” 【参考方案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。以上是关于MFC:IInternetProtocolSink 无法识别 MIME 类型“text/css”的主要内容,如果未能解决你的问题,请参考以下文章