В настоящее время я наблюдаю странное поведение в моем приложении .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;