5

目前,我在 .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;
4

2 回答 2

1

您是否尝试过从您的网络服务器而不是 Google 的服务器下载字体并运行它们?您应该能够从 Google 的网络服务器下载 CSS 文件和 WOFF/EOT 文件并将它们本地放置在您的网络服务器上。之后,您需要更改 Google 的 CSS 文件以指向您的本地 WOFF 文件。

我知道这并不能真正解决 WebBrowser 控件的奇怪行为,但它可以作为一种解决方法。

编辑:似乎CSS是每个浏览器动态生成的。我为 Chrome 获得的 CSS 与我为 IE 获得的 CSS 不同。不过,这可能仍然对您有用,因为它似乎通过 WebBrowser 控件在受控环境中运行,因此它应该始终是 IE。

于 2012-09-28T23:52:18.313 回答
1

您看到的差异可能是因为托管 Web 浏览器控件以怪异模式运行。尝试关闭怪癖模式,看看它是否有任何效果。

于 2012-09-29T22:23:53.657 回答