It is currently impossible to programatically modify the 'Host' header, which most engineers of Enterprise-class applications would agree is an oversight that should be corrected, either by removing the Host header protection, or by exposing a method to modify it. Please consider adding this functionality in the next .NET release.
Consider a scenario where multiple servers (host1.example.com, host2.example.com, and host3.example.com) each virtually serve a group of websites (x.example.com, y.example.com, and z.example.com) from behind a load balancing configuration. Then consider an application such as a Health Check service, which may need to specifically check the health of the instance of z.example.com being served specifically from server2.example.com. In a NLB configuration, it is 66% more likely that a generic request made for z.example.com would be serviced by server1 or server2, than server3. Therefore, the Health Checking agent would need to explicitly connect to server3, and provide a host header of z.example.com, in order to check the health of that instance.
Due to the ease in implementing the HttpWebRequest object, it seems like a prime candidate for any agent that needs to make an Http request. However, the inability to provide a custom Host header makes it impossible to effectivly work in scenarios such as the one described above. I understand there is a work-around in that you can provide the host header in the proxy setting, however, that is suboptimal, as it would then inhibit an agent from utilizing a real proxy that may be necessary for web access.