目前,我在 .NET 2.0 WinForms 应用程序中看到了一个奇怪的行为。
托管一个从其自己的应用程序内置 Web 服务器(这个)中提取数据的WebBrowser
控件,一切正常,直到涉及到Google Web Fonts。
脚步:
在 Windows 7 下,会出现以下行为:
1.) 启动应用程序。该页面不显示Google Web 字体:
2.) 在独立的 Internet Explorer 实例中打开内置 Web 服务器的 URL:
3.) 回到 C# 应用程序,按 F5:
现在,字体在我的应用程序中也是可见的。
行为:
似乎独立的 IE 做了额外的事情,我的应用程序中的托管 IE 是不允许做的。
在独立 IE 中打开 URL 后,我可以同时关闭我的应用程序和 IE,然后重新启动我的应用程序,仍然可以得到正确的行为。
清除 IE 数据(缓存、cookie 等)时,再次需要执行步骤 1-3 才能将 Google Web 字体导入托管的 Web 浏览器。
我的假设:
我猜这与 IE 似乎需要在其语言环境缓存中“安装”网络字体的权限有关。我刚刚Access-Control-Allow-Origin:*
在我的请求标头中添加了一个,但这似乎并没有改善任何东西。
我的问题:
您是否对如何使 Google Web Fonts 在我的场景中工作而无需启动独立 IE 有任何提示?
2013-08-22 更新 - 解决方案:
根据亚当的建议,我更改了WebBrowser
控件的用户代理,这很有效。现在,我的 WinForms 应用程序中确实有 Web 字体和托管浏览器。
代码看起来像:
public void ChangeUserAgent()
{
// https://stackoverflow.com/a/12648705/107625
const string ua = @"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)";
// https://stackoverflow.com/q/937573/107625
UrlMkSetSessionOption(UrlmonOptionUseragent, ua, ua.Length, 0);
}
使用这些 P/Invoke 辅助函数:
[DllImport(@"urlmon.dll", CharSet = CharSet.Ansi)]
private static extern int UrlMkSetSessionOption(
int dwOption,
string pBuffer,
int dwBufferLength,
int dwReserved);
private const int UrlmonOptionUseragent = 0x10000001;