Задайте значение по умолчанию для столбца в таблице на сервере MSSQL и в атрибуте добавления кода класса, например:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
для того же свойства.
После некоторых исследований я нашел заголовок ETag, который решает мою проблему. Установка заголовка ETag
работает, как описано здесь: Как использовать etags в файле PHP?
Также нашли некоторую информацию о том, как объединить это с заголовком Expires
: [114 ] ETag vs Header Expires - заголовок ETag делает по крайней мере один запрос для сравнения контрольной суммы файла, в то время как заголовок expires делает по крайней мере один запрос вообще.
Последняя часть головоломки была: HTTP: Заголовок ETag делает заголовок Cache-Control устаревшим? Как сделать так, чтобы Cache-Control не был вреден?
Поэтому у меня есть идеальный ответ (по крайней мере, я так думаю):
$quoted = sprintf('"%s"', addcslashes(basename($file), '"\\'));
$size = filesize($file);
$etag = hash_file('md5', $file);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $quoted);
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Pragma: public');
header('Content-Length: ' . $size);
header('Cache-Control: no-cache');
header('Expires: 0');
header('ETag: ' . $etag);