IIS 7.5 and 8 are actually really good, and among the best to interact with programmatically. You can write the equivalent of nginx modules in C#, and even implement custom framing and protocols.
Hmm. As someone who's had to run a massive IIS cluster over the last 3-4 years, I disagree. It's obtuse, unreliable, incredibly overcomplicated and regularly just fucks you because it can.
Some things that are utterly broken that really shouldn't be that have cost me literally DAYS.
1. Using IIS ARR to proxy subversion = hell. The moment someone requests a web.config file from the back end SVN server via the IIS front end, it shits a brick. You have to piss around in the applicationHost.config to fix this.
2. It knackers XML encoding transparently inside ARR somehow resulting in clients losing requests as they come down as application/octet-stream rather than what you sent them as. This breaks lots of clients randomly.
2. Wildcard SSL domains i.e. star.whatever.com. If you delete one site instance, it kills all the others completely dead and you can't re-add the certificate on the others: you have to create new site instances again from scratch. Workaround: stop a site instance and leave it there to rot forever. That's fine but we can have up to 100 instances on a cluster.
3. Thread reuse. Each module (in integrated mode) can run in a different thread so it knackers thread local variables like the current culture and identity system in .Net. This is an absolute fucker to debug as it only happens under heavy load and is barely documented.
4. Sometimes servers in our cluster randomly just stop for a few seconds for no apparent reason (7.5 on 2008 R2). Our phones start ringing then. We've had Microsoft working on a fix for over a year and even they can't work out why it's happening. They admit it is IIS that is doing it.
5. Deployment hell. You're supposed to be able to just "xcopy" deploy everything because it uses some mish-mash of shadow copies but occasionally this screws up and leaves an older dll in the ASP.Net Temporary Files folder which means your site suddenly has broken code contracts everywhere and your site goes down big time with YSOD (as even the error pages fall over) until someone fires up the magic "fix it quick" powershell script which cleans out all the crud, redeploys and restarts the cluster. That's fine but we have 16 front end IIS servers and 80 million requests a day so this means trouble for us.
6. IIS Express and Visual Studio integration is just shit. It doesn't work with source control software at all leading to constant problems when people do updates. The only solution is to shut everything down, delete the IISExpress directory in your documents folder and try again.
7. The whole dynamic vs static thing falls over when you have a module which rewrites static URLs. Everything has to run through the dynamic then. The coupling internally for features like this is terrible.
It's stuff like that which means it's still a broken pile of crap that I hate more and more every day.
For reference, we moved ALL of our development stuff over to an Apache mod_proxy setup with LDAP / AD integration and it just works. We'd love to do it with the front end but we can't for obvious reasons...
As a web hoster supporting both Apache and IIS I used to long for the configuration flexibility of Apache in IIS <=6. IIS7+ was rewritten from the ground up and is a serious a game changer for MS, it's a bloody nice web server.