包括Http Request标头中的Checksum

时间:2010-08-13 17:42:08

标签: c# http-headers

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

这很好。

2 个答案:

答案 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