Just some thougts about that all here:
Request.Url.Host is fine. You can use Global.asax or an own (Abstract) base controller (I always call this
ControllerBase
). I'd not recommend you to use it in each and every controller you write - try to put everything necessary in some kind of configuration-Class and load it on application Start or on Demand in BaseController - you can change the Constructor of such an base class to take an identifier for the tenant.You can do both - It will probably be easiest, if you just add bindings to a single site and application pool.
That's one approach to that, but you could also do some sort of claim based authentication, which contains the target tenant(s)
You can create a caching, which is dependent on you tenant (as you can define caching which is dependent on the logged on user.