2010-08-13 62 views
0

我有一個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 

能正常工作。

回答

0

您既可以將兩個字符串都讀入您比較的DateTime對象中,也可以確保日期字符串的格式相同。

在服務器端:

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對象。

+0

我仍然不完全瞭解客戶端的變化,我應該這樣做:request.IfModifiedSince.ToUniversalTime()。ToString(「yyyy-MM-dd HH:mm:ss」)= File .GetLastAccessUtc(文件名) – Adam 2010-08-13 18:04:50

+0

爲了完全理解服務器和客戶端,我必須重新閱讀您的問題,但現在我已經解決了我的問題。服務器現在將以相同的格式比較請求中的文件日期和標題日期。 – 2010-08-13 18:31:21

0

在您的服務器端;您正在控制標題的格式;因爲您從日期創建字符串,然後將其明確分配給請求標題字段。您應該正確格式化,以便與客戶端設置的標頭匹配。

IfModifiedSince屬性以正確的格式設置標題值;根據HTTP規範,see section 3.3 here

+0

我還不清楚的是:如果我提到一個名爲「If-Modified-Since」的請求頭和字符串值,Fiddler將它精確地設置爲該值,但我無法設置爲字符串值。 – Adam 2010-08-13 18:16:58