Я записал функция высшего порядка , чтобы заставить его работать правильно. Мы использовали это в нескольких проектах, и это, кажется, работает отлично. Это - то, как вещи должны были быть сделаны от запуска без парадигмы "использования" или и так далее.
TReturn UseService(Func code)
{
var chanFactory = GetCachedFactory();
TChannel channel = chanFactory.CreateChannel();
bool error = true;
try {
TReturn result = code(channel);
((IClientChannel)channel).Close();
error = false;
return result;
}
finally {
if (error) {
((IClientChannel)channel).Abort();
}
}
}
можно выполнить вызовы как это:
int a = 1;
int b = 2;
int sum = UseService((ICalculator calc) => calc.Add(a, b));
Console.WriteLine(sum);
Это в значительной степени точно так же, как Вы имеете в своем примере. В некоторых проектах мы пишем вспомогательные методы со строгим контролем типов, таким образом, мы заканчиваем тем, что писали вещи как "Wcf. UseFooService (f => f...)".
я нахожу это довольно изящным, учитывая все обстоятельства. Существует ли конкретная проблема, с которой Вы встретились?
Это позволяет другим изящным функциям быть включенными. Например, на одном сайте, сайт проходит проверку подлинности к сервису от имени зарегистрированного пользователя. (Сайт не имеет никаких учетных данных отдельно.) Путем записи нашему собственному помощнику метода "UseService", мы можем настроить фабрику канала путем, мы хотим и т.д. Мы также не связываемся с использованием сгенерированных прокси - любой интерфейс сделает.
Вам нужно проверить значение document.documentMode, которое будет иметь значение 8 в истинном режиме IE8 и 7 в Режим IE7. Строка пользовательского агента будет идентична в обоих случаях и по-прежнему будет указывать на IE8. Обратите внимание, что эта переменная JavaScript доступна только в IE8.
Не совсем «обнаружение режима совместимости с IE8», но это может также помочь:
Если у вас есть доступ к самому серверу, вы можете отправить HTTP-заголовок, взгляните на Блог Майка Ормонда об этом . На странице MSDN для реализации метапереключателя на IIS есть подробности о заголовке и о том, как его установить / отправить.
IE8 включает маркер трезубца в строку User-Agent независимо от режима совместимости.
См. MSDN для получения дополнительных сведений: http://blogs.msdn.com/ie/ archive / 01.09.2009 / the-internet-explorer-8-user-agent-string-updated-edition.aspx
IE7 в Windows Vista
Mozilla / 4.0 (совместимый; MSIE 7.0 ; Windows NT 6.0)
IE8 в Windows Vista (режим совместимости)
Mozilla / 4.0 (совместимый; MSIE 7.0 ; Windows NT 6.0; Trident / 4.0 )
IE8 в Windows Vista
Mozilla / 4.0 (совместимый; MSIE 8.0 ; Windows NT 6.0; Trident / 4.0 )
Проблема на самом деле становится еще более сложной, когда вы имеете дело со ссылками, поступающими на ваш сайт с сайтов BLACKLIST с эмуляцией IE8, таких как Facebook.
Совместная ссылка на Facebook заставляет ваши ссылки открываться во всплывающем окне - ЕСЛИ «ВКЛЮЧИТЬ ОБНОВЛЕНИЕ ВЕБЛИСТОВ» отмечен в настройках просмотра совместимости, который установлен по умолчанию, всплывающее окно видит источник перехода из черного списка из Facebook и первоначально открывает окно в режиме черного списка. При поиске в фоновом режиме для Trident \ 4.0 - вы увидите значение и установите CSS нижнего уровня.
Однако после загрузки браузера он переключается из режима совместимости и переходит в режим СТАНДАРТ без обновления. Следовательно, у вас неправильный CSS для стандартных режимов.
Решение - вывести браузер IE из режима совместимости. Ага - кажется странным, зачем позволять пользователю переходить на более низкий уровень на вашем сайте, если вам это не нужно.
Так же, как и на нижнем уровне, вы устанавливаете IE = EmulateI7, чтобы принудительно выключить браузер, вы можете добавить IE = EmulateIE8 и заставить пользователя просматривать вашу страницу в IE8 Standard . этот режим даже лишает их возможности выбирать просмотр в режиме совместимости и сокращает количество тестов для этого режима
FYI, для получения подробной информации о том, как обнаружить режим совместимости (AKA как обнаружить Compatibility View), пожалуйста, ознакомьтесь со следующей ссылкой...
http://msdn.microsoft.com/en-us/library/cc288325(VS.85).aspx
...где представлена некоторая полезная информация.