Each request is served by a stream. In other words, a thread can only serve one request at a time.
Now HttpContext.Current supported by CallContext.HostContext , which is actually a stream-static property (the getter / setter property works on every thread).
Gets or sets the host context associated with the current stream.
And the way HttpContext.Current manages to always return the correct context for each request, even if several requests are served in parallel - the current thread is associated with the HttpContext, which, in turn, is associated with a specific request.
source share