Почему Reactive Extensions отправляет HTTP GET в Microsoft ПРИ КОМПИЛЯЦИИ?

Я загрузил стабильную версию Reactive Extensions v1.0 SP1 с этого сайта http://msdn.microsoft.com/en-us/data/gg577610, и я использую его в среде .Net Framework 3.5 (Visual Studio 2008).

Я попытался использовать Reactive Extensions в проекте и заметил, что он очень медленно запускается. Перейдя в LinqPad, я ввел следующее «Выражение C#»:

(new int[0]).ToObservable()

Я также сослался на System.Reactive.dll и импортировал пространство имен System.Reactive.Linq. Когда я запускаю его, для компиляции и запуска требуется 12 секунд.

Я открыл Process Monitor и проверил LinqPad. Я обнаружил, что он отправляет HTTP-запрос на 124.155.222.226 ИЛИ 124.155.22.59. (К вашему сведению, сам LinqPad также звонит домой по номеру 157.55.161.150, когда вы его открываете). Я заметил, что с помощью WireShark он отправляет HTTP-запрос GET на

http://crl.microsoft.com/pki/crl/products/MicCodSigPCA_08-31-2010.crl

Кто-нибудь знает, почему он так звонит домой, когда код компилируется с помощью Reactive.Extensions? Кроме того, есть ли способ отключить его, потому что 12-секундная задержка до звонка домой при развертывании приложения (И работающем в производстве) особенно неудобна.

ПРИМЕЧАНИЕ. Вот так он звонит домой, когда вы КОМПИЛИРУЕТЕ код (или JIT компилирует его при отладке). На самом деле это не поведение во время выполнения, которое, кажется, делает это.


person Matt G    schedule 23.08.2012    source источник
comment
CRL — список отозванных сертификатов. Кажется, что он каким-то образом проверяет сертификат и нуждается в самой новой версии этого списка отзыва, чтобы узнать, действителен ли сертификат.   -  person Daniel Hilgarth    schedule 23.08.2012
comment
Но зачем нужно проверять действительность сертификата просто для того, чтобы скомпилировать код, содержащий IObservable‹int›? Кажется, это неподходящее время и место для HTTP-запросов.   -  person Matt G    schedule 24.08.2012
comment
Что касается LINQPad, который звонит по номеру 157.55.161.150, когда вы его открываете, это для проверки обновлений. Проверка выполняется в собственном потоке, поэтому ничего не замедляет. Тем не менее, вы можете отключить его, если хотите, запустив LINQPad с ключом -noupdate.   -  person Joe Albahari    schedule 24.08.2012
comment
Мои извинения. Я предположил, что LinqPad просто проверяет наличие обновлений, и не хотел намекать на то, что он пытается сделать что-то гнусное.   -  person Matt G    schedule 24.08.2012


Ответы (1)


Похоже, сборка Rx подписана Authenticode. ИМО, ошибочно подписывать Authenticode сборки .NET, созданные для Framework 3.5 или более ранней версии, потому что CLR проверяет список отзыва сертификатов перед чтением сборки, задерживая процесс в лучшем случае на несколько секунд (или в худшем случае на 30 секунд, если ваше интернет-соединение время вышло).

Эта ошибка была исправлена ​​в CLR 4: подписи Authenticode проверяются только по запросу, а не при каждой загрузке сборки.

(Именно по этой причине версия исполняемого файла LINQPad для Framework 3.5 не имеет подписи Authenticode.)

Возможно, вы могли бы попросить команду Rx рассмотреть возможность удаления подписи Authenticode из сборки 3.5 сборок Reactive (при условии, что это действительно проблема).

person Joe Albahari    schedule 24.08.2012
comment
Это ДЕЙСТВИТЕЛЬНО работало, так сказать. Я спросил здесь social.msdn .microsoft.com/Forums/en-US/rx/thread/ и был направлен на blogs.technet.com/b/markrussinovich/archive/2009/05/26/ - person Matt G; 28.08.2012