我有一个web服务来下载文件。对于每个传入请求,我检查请求下载的文件的校验和和时间戳,以及服务器上的文件。如果它们相同,我不必再次下载。
服务器端的代码是:
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“
我该如何纠正?
当我使用fiddler并添加到“请求标头”时:
If-Modified-Since= last access time
If-None-Match= checksum
这很好。
答案 0 :(得分: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对象。
答案 1 :(得分:0)
在您的服务器端;你正在控制标题的格式;因为您从日期创建字符串,然后将其明确分配给请求标头字段。您应该正确格式化,以便它与客户端设置的标头匹配。
IfModifiedSince属性以正确的格式设置标头值;根据HTTP规范,see section 3.3 here