11

I downloaded the Stable release of Reactive Extensions v1.0 SP1 from this site http://msdn.microsoft.com/en-us/data/gg577610, and I am using it in a .Net Framework 3.5 environment (Visual Studio 2008)

I tried using Reactive Extensions in a project, and noticed it was very slow to start up. Going to LinqPad, I entered the following "C# Expression":

(new int[0]).ToObservable()

I also referenced System.Reactive.dll and imported the System.Reactive.Linq namespace. When I run it, it takes 12 Seconds to compile & run.

I opened Process Monitor and monitored LinqPad. I found that it is sending an HTTP request to 124.155.222.226 OR 124.155.22.59. (FYI LinqPad itself also phones home to 157.55.161.150 when you open it). With WireShark, I noticed it is sending an HTTP GET request to

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

Does anyone know why it is phoning home like this when code compiles with Reactive.Extensions? Furthermore, is there any way to turn it off, because a 12 second delay to phone home when devoloping the application (AND running in production) is particularlly inconvenient.

NOTE: It phones home like this when you COMPILE the code (or the JIT compiles it when debugging). It is not actually the run-time behavior that appears to be doing this.

Matt G
  • 437
  • 3
  • 9
  • 4
    CRL - Certificate Revocation List. It seems as if it somehow checks a certificate and needs the newest version of that revocation list for it to know if the certificate is still valid. – Daniel Hilgarth Aug 23 '12 at 19:59
  • But why does it need to check if a certificate is valid simply to compile code that contains IObservable? That seems like the wrong time and place to make HTTP requests. – Matt G Aug 23 '12 at 20:26
  • 1
    Regarding LINQPad phoning 157.55.161.150 when you open it, this is to check for updates. The check runs on its own thread, so it doesn't slow anything down. Nonetheless, you can disable it if you want by starting LINQPad with the -noupdate switch. – Joe Albahari Aug 24 '12 at 01:52
  • My apologies. I assumed LinqPad was just checking for updates, and did not mean to insinuate it was attempting anything nefarious. – Matt G Aug 24 '12 at 12:47

1 Answers1

7

It sounds like the Rx assembly is Authenticode-signed. IMO, it's a mistake to Authenticode-sign .NET assemblies built for Framework 3.5 or earlier - because the CLR checks the certification revocation list before reading the assembly, delaying things by a few seconds at best (or 30 seconds at worst if your Internet connection times out).

This misfeature was fixed in CLR 4: Authenticode signatures are verified only on demand, not every time you load the assembly.

(It's for this reason that the Framework 3.5 version of the LINQPad executable is not Authenticode-signed.)

Maybe you could ask the Rx team to consider removing the Authenticode signature from the 3.5 build of the Reactive assemblies (assuming this is indeed the problem).

Joe Albahari
  • 30,118
  • 7
  • 80
  • 91
  • This DID work, as it were. I asked here http://social.msdn.microsoft.com/Forums/en-US/rx/thread/00c9718b-5962-42ad-b02d-f170dc91ed36 , and was directed to http://blogs.technet.com/b/markrussinovich/archive/2009/05/26/3244913.aspx – Matt G Aug 28 '12 at 01:20