I've been using Nginx as a reverse proxy for an ASP.Net 5 project (specifically to allow two different servers to be available on the same "domain" to avoid CORS issues, ironically) and it's fantastic.

Yes the NPAPI plugin standard was removed from Chrome and Firefox (it was really terrible for the stability of the browser). Both browsers implemented alternatives, but nothing that can be shared between the two.

Neither did OP mention that he's using threads. TPL still requires locking if you share any resources between the parallel tasks (e.g. making requests to N different websites and throwing the HTML as entries in a collection)

Yes, you're absolutely right. If your cached item with key 'X' expires the lock object remains in the dictionary. Maybe you could combine a weakreference dictionary with storing a copy of the lock object in the HttpContext.Cache so that when the cache item expires, the reference disappears and so does the lock. That may introduce its own thread safety issues, though...

Hungarian notation encodes the type into the variable name, but the variable's type should be more or less obvious based on method names (findNearestStore should return a Store, not a Cat) or context clues (rectangle.Length should return a number, not a Point). I do use a form of Hungarian notation in configuration files, for example requestTimeoutMs for milliseconds, but that's just due to limitations of the type system (configs usually only support strings or ints rather than a full TimeSpan object).

Why make an exception? Because the semantics between classes and interfaces are so different, even though one can often be substituted for the other. The biggest difference being that classes can implement multiple interfaces, while they can only extend one class or abstract class (both of which I use un-prefixed).

They'd have to rewrite VS from scratch, which is doubtful. On the other hand, you can develop on Windows and deploy to Linux so you only have to pay for a Windows license on dev machines (VS2015 actually isn't too slow on a Windows 10 VM either)

Maybe it's because I started programming with Java, but I feel the same way. Methods on the builtins (string, int, float) use the capitalized versions but I don't mind using the alias for type signatures.

2) If two solutions reference a project, and the solutions are in different locations, nuget gets all manner of confused.

As /u/MrDoomBringer said, this completely misses the point of NuGet. Projects that are referenced by multiple projects should be converted to NuGet packages (which can simply be placed on a fileshare somewhere, no need for a "nuget server"). Putting a .nuspec file in the project folder (and optionally adding it to the project) rather than accepting the defaults makes it easy to see which projects are NuGet packages and which aren't.

However, I do think that in order to get real adoption of that process, creating and publishing a NuGet package needs to be mind-numbingly simple, like a single button click (or even during build) without much configuration. I don't think we're there yet.

While I agree that null isn't a bad idea (especially in languages where it's the only option), many functional languages like F# have a technique called discriminated unions which is kind of like a supercharged enum return value. One of the downsides of null is that it's context sensitive: although it uses the same symbol, a "null" lastSpousalAbuse value means an entirely different thing from a null getDriverSeatOccupant. Discriminated unions allow you to explicitly name the null value and help prevent "forgetting" to handle it.