Посмотрите, как работает HTTP. Клиент (= браузер) не полагается на расширения, он только хочет, чтобы сервер возвращал некоторые метаданные вместе с документом.
Метаданные могут быть добавлены с помощью Response.AddHeader, и одна «строка метаданных» состоит из имени и значения.
Content-Type - это свойство, которое вас интересует, а значением является MIME-тип данных (исследование: RFC1945 для HTTP-заголовков, google для MIME-типа).
Для порядковых страниц aspx (html, ....) это свойство text / html (не так тривиально, но для этого примера этого достаточно). Если вы возвращаете JPG-изображение, оно может иметь имя «image.gif», но если вы отправляете «image / jpeg» в Content-Type, оно обрабатывается как JPG-изображение.
Тип содержимого для pdf - «application / pdf».
Браузер будет работать в соответствии с поведением по умолчанию, например, с плагином Adobe, он отобразит PDF в своем окне, если у вас нет плагина для PDF, он должен загрузить файл и т. Д.
В заголовке Content-Disposition указано, что вы должны делать с данными. Если вы хотите, чтобы клиент явно «загружал» некоторые HTML / PDF / что-либо еще и не отображал их по умолчанию, вам нужно значение «attachment». Он должен иметь другой параметр (как предложено Джастином Нисснером), который используется в случае чего-то вроде:
http://server/download.aspx?file=11 -> Content-Disposition: attachment; filename = file.jpg говорит, как файл должен иметь имя по умолчанию.