включая контрольную сумму в заголовках Http-запроса - PullRequest
0 голосов
/ 13 августа 2010

У меня есть веб-сервис для загрузки файлов. При каждом входящем запросе я проверяю контрольную сумму и временную метку файла, который требуется загрузить, и файла на сервере. Если они одинаковые, мне не нужно загружать их снова.

Код на стороне сервера:

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

это отлично работает.

Ответы [ 2 ]

0 голосов
/ 13 августа 2010

на вашей стороне сервера; вы контролируете формат заголовка; потому что вы создаете строку из даты, а затем явно присваиваете ее полю заголовка запроса. Вы должны отформатировать это правильно, чтобы он соответствовал заголовку, установленному клиентом.

Свойство IfModifiedSince устанавливает значение заголовка в правильном формате; согласно спецификации HTTP, см. раздел 3.3 здесь

0 голосов
/ 13 августа 2010

Вы можете либо прочитать обе строки в объект DateTime, который вы сравниваете, либо убедиться, что строки Date имеют одинаковый формат.

На стороне сервера:

string timestamp = File.GetLastAccessTimeUtc(filename).ToString("yyyy-MM-dd HH:mm:ss");

и

string incTimestamp = WebOperationContext.Current.IncomingRequest.IfModifiedSincee.ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss");

Вы также можете удалить ToString и напрямую сравнить объекты DateTime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...