Шрифты Google в элементе управления WebBrowser отображаются только тогда, когда им помогают извне

В настоящее время я наблюдаю странное поведение в моем приложении .NET 2.0 WinForms.

Размещение WebBrowser control, который извлекает данные из собственный встроенный в приложение веб-сервер (этот), все работает нормально, пока не доходит до Веб-шрифты Google.

Шаги:

В Windows 7 происходит следующее поведение:

1.) Запустите приложение. На странице не отображаются веб-шрифты Google:

введите описание изображения здесь

2.) Откройте URL-адрес встроенного веб-сервера в автономном экземпляре Internet Explorer:

введите описание изображения здесь

3.) Вернитесь в приложение C #, нажмите F5:

введите описание изображения здесь

Теперь шрифт виден и внутри моего приложения.

Поведение:

Кажется, что автономный IE выполняет дополнительные действия, которые размещенному в моем приложении IE делать не разрешено.

Как только URL-адрес был открыт в автономном IE, я могу закрыть и мое приложение, и IE, и перезапустить мое приложение, сохраняя правильное поведение.

При очистке данных IE (кеш, файлы cookie и т. Д.) Снова необходимо выполнить шаги 1–3, чтобы вставить веб-шрифт Google в размещенный веб-браузер.

Мое предположение:

Я предполагаю, что это как-то связано с разрешениями, которые, по-видимому, требуются IE для «установки» веб-шрифта в его кэш локали. Я только что добавил Access-Control-Allow-Origin:* в заголовок своего запроса, но это, похоже, ничего не улучшает.

Мой вопрос:

У вас есть какие-нибудь подсказки, как заставить Google Web Fonts работать в моем сценарии без необходимости запускать автономный IE?

Обновление 2013-08-22 - РЕШЕНИЕ:

Основываясь на предложении Адама, я изменил пользовательский агент элемента управления WebBrowser, и это сработало. Теперь у меня есть веб-шрифты в моем приложении WinForms с размещенным браузером.

код выглядит примерно так:

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;

person Uwe Keim    schedule 26.06.2012    source источник
comment
Хотелось бы узнать, есть ли у вас что-нибудь с этим, поскольку у меня точно такая же проблема! Случайное и недокументированное поведение элемента управления веб-браузером .net - настоящая боль.   -  person Alex Warren    schedule 28.09.2012
comment
@AlexWarren Недавно я немного поигрался с Chromium Embedded (и их привязками .NET). Может быть, это тоже вариант для вас?   -  person Uwe Keim    schedule 29.09.2012
comment
Спасибо, Уве, раньше я не сталкивался с Chormium Embedded, но похоже, что это хороший вариант.   -  person Alex Warren    schedule 29.09.2012


Ответы (2)


Вы пробовали загружать шрифты и запускать их со своего веб-сервера, а не с сервера Google? Вы должны иметь возможность загружать файл CSS и файлы WOFF / EOT с веб-серверов Google и размещать их локально на своем веб-сервере. После этого вам нужно будет изменить файл CSS Google, чтобы он указывал на ваши локальные файлы WOFF.

Я знаю, что на самом деле это не исправляет странное поведение элемента управления WebBrowser, но может служить обходным решением.

Изменить: похоже, что CSS создается динамически для каждого браузера. У меня CSS для Chrome другой, чем у IE. Это может по-прежнему работать для вас, поскольку кажется, что он работает в контролируемой среде с помощью элемента управления WebBrowser, поэтому он всегда должен быть IE.

person Adam Plocher    schedule 28.09.2012

Различия, которые вы видите, могут быть связаны с тем, что размещенный элемент управления веб-браузером работает в режиме совместимости. Попробуйте отключить режим совместимости и посмотреть, имеет ли это какой-либо эффект.

person Nathan Moinvaziri    schedule 29.09.2012
comment
Спасибо, но у меня уже есть ‹! DOCTYPE html› и ‹meta http-Equiv = X-UA-Compatible content = IE = 9 /›, поэтому режим quirks отключен - но все равно внешние веб-шрифты не загружаются. - person Alex Warren; 30.09.2012
comment
Если вы думаете, что это связано с разрешениями управления веб-браузером, происходит ли это, когда вы запускаете приложение в качестве администратора? - person Nathan Moinvaziri; 01.10.2012