which means that my server maximum output would be 12MB/s
Ah. No. Rather like 10MB/S. There is some protocol overhead - it is not like the data travels without any checksums etc.
which is 24 Mbps which is not even reaching half of what I was promised.
Ok, so what do you do here? Seriously, this is not a technical issue. Raise it with your hoster, show them your SLA, Trigger the penalties embedded in it.
I am thinking thinking could it be because of my source code written in ASP.NET MVC?
How do I optimize windows 2008 server to maximize network power and send large output?
OK, other angle. What do you do here? Crappy programming is hardly a server admin issue. Fix your code.
Start by finding out how bad it is. Put STATIC file into the server. Use that for speed testing. THen you have the baseline - that is what your server is calable of delivering. Anything less is your issue.
The code is using 3MB buffer size and allow partial download which when I use download
manager and uses 3 section, it would still only gave around 80KB/s
LÖet's get serious - 80kb is a comical number, something is VERY wrong. 3mb buffer is ok IF you use async load to load the next slice while a transfer is in progress - not totally junior progrmaming, not really complex (i.e. load the next 3mb while the first are sent). .NET 4.5 has a nice async keyword for that, older versions please use tasks.
Oh, and consider how goot it is to run outdated server OS - 23008 is OLD. 2008 R2 would be "old", but 2012 is current.
As I said - validate it is your code, then fix it. Put up a repro case in your lab, run a profiler, find out where it hangs. Could be a totally crappy disc subsystem - but then, 80kb/s is REALLLLLLLY little.
Whatever it is, it is not a serverfault.com case - outside the analysis. Either you write terrible code (stackoverflow.com) or it is a SLA issue (legal, handle with providers support). Nail it down with a static file test case - your code not involved then.