Если вы используете fiddler2 (http://www.fiddler2.com/fiddler2/), вы можете точно увидеть, какие заголовки отправляются в IE, что может помочь вам в отладке.
Возможно, вы можете опубликовать полученные заголовки здесь?
Я сомневаюсь, что добавление Content-Type и Content-Disposition перед перенаправлением окажет какое-либо влияние, так как браузер видит заголовок перенаправления и делает совершенно новый http-запрос к перенаправленному URL, который будет совершенно другим набором. заголовков.
Однако вы можете попробовать Server.Transfer, который представляет собой перенаправление на стороне сервера, что-то вроде следующего:
Response.Clear(); //In case your .aspx page has already written some html content
Response.AddHeader("Content-Type", "application/octet-stream");
string disp = String.Format("attachment; filename={0}", fileName); // fileName = file.exe
Response.AddHeader("Content-Disposition", disp);
Server.Transfer(@"http://www.example.com/file.exe?id=12345");
Или, альтернативно, используйте Response.BinaryWrite:
Response.Clear(); //In case your .aspx page has already written some html content
byte[] exeContent = ... //read the content of the .exe into a byte[]
Response.AddHeader("Content-Type", "application/octet-stream");
string disp = String.Format("attachment; filename={0}", fileName); // fileName = file.exe
Response.AddHeader("Content-Disposition", disp);
Response.BinaryWrite(exeContent);