我有一個web服務來下載文件。對於每個傳入請求,我都會檢查請求下載的文件的校驗和和時間戳以及服務器上的文件。如果它們是相同的,我不必再次下載它。包括Http請求標頭中的校驗和
在服務器端的代碼是:
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
現在,這種變化會導致問題。每當請求到達服務器時,最後訪問時間總是以不同的格式,並且永遠不匹配。所以如果文件的最後修改時間是8/13/2010 5:27:12 PM,在服務器端我得到[「If-Modified-Since」]值爲「Fri,2010年8月13日17:27:12 GMT「
我該如何解決這個問題?
當我使用小提琴手,並添加到「請求頭」以下內容:
If-Modified-Since= last access time
If-None-Match= checksum
能正常工作。
我仍然不完全瞭解客戶端的變化,我應該這樣做:request.IfModifiedSince.ToUniversalTime()。ToString(「yyyy-MM-dd HH:mm:ss」)= File .GetLastAccessUtc(文件名) – Adam 2010-08-13 18:04:50
爲了完全理解服務器和客戶端,我必須重新閱讀您的問題,但現在我已經解決了我的問題。服務器現在將以相同的格式比較請求中的文件日期和標題日期。 – 2010-08-13 18:31:21