У меня есть веб-сервис для загрузки файлов. При каждом входящем запросе я проверяю контрольную сумму и временную метку файла, который требуется загрузить, и файла на сервере. Если они одинаковые, мне не нужно загружать их снова.
Код на стороне сервера:
string checksum; //calculate this using methods in System.Security.Cryptography
string timestamp = File.GetLastAccessTimeUtc(filename).ToString();
string incCheckSum = WebOperationContext.Current.IncomingRequest.Header["If-None-Match"];
string incTimestamp = WebOperationContext.Current.IncomingRequest.Header["If-Modified-Since"];
if(checksum == incCheckSum && timestamp == incTimeStamp)
{
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.NotModified;
return null;
}
WebOperationContext.Current.OutgoingResponse.Headers["Last-Modified"] = timestamp;
WebOperationContext.Current.OutgoingResponse.Headers["ETag"] = checksum;
return FileStream("Filename",FileMode.Open, FileAccess.Read,FileShare.Read);
На стороне клиента:
HttpWebRequest request = (HttpWebRequest)WebRequest.create("http://somewebsite.com");
request.Header["If-None-Match"] = //get checksum file on the disk
request.Header["If-Modified-Since"] = "Last Modified Time" // I get an exception here:
Исключение говорит:
"Заголовок должен быть изменен с помощью
соответствующее свойство "
Тогда я делаю
request.IfModifiedSince = //Last Access UTC time of the file
Теперь, это изменение вызывает проблемы. Всякий раз, когда запрос поступает на сервер, время последнего доступа всегда находится в другом формате и никогда не совпадает. Поэтому, если время последнего изменения файла - 13.08.2010 17:27:12, на стороне сервера я получаю значение ["If-Modified-Since"] как "Пт, 13 августа 2010 17:27:12 GMT "
Как я могу это исправить?
Когда я использую fiddler и добавляю в «заголовки запроса» следующее:
If-Modified-Since= last access time
If-None-Match= checksum
это отлично работает.