【问题标题】:including Checksum in Http Request headers包括 Http 请求标头中的校验和
【发布时间】:2010-08-13 17:42:07
【问题描述】:

我有一个网络服务来下载文件。对于每个传入的请求,我都会检查请求下载的文件的校验和和时间戳,以及服务器上的文件。如果它们相同,我不必再次下载。

服务器端的代码是:

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

现在,此更改会导致问题。每当请求到达服务器时,最后一次访问时间总是采用不同的格式,并且永远不会匹配。因此,如果文件的最后修改时间是 2010 年 8 月 13 日下午 5:27:12,在服务器端,我将 ["If-Modified-Since"] 值设为“Fri, 13 Aug 2010 17:27:12格林威治标准时间"

我该如何纠正这个问题?

当我使用提琴手并将以下内容添加到“请求标头”时:

If-Modified-Since= last access time
If-None-Match= checksum

这很好用。

【问题讨论】:

    标签: c# http-headers


    【解决方案1】:

    在您的服务器端;您正在控制标题的格式;因为您从日期创建字符串,然后将其显式分配给请求标头字段。您应该正确格式化它,以便它与客户端设置的标头匹配。

    IfModifiedSince 属性以正确的格式设置标题值;根据 HTTP 规范,see section 3.3 here

    【讨论】:

    • 我仍然不清楚的是:如果我提到一个名为“If-Modified-Since”的请求标头和字符串值,Fiddler 将其设置为该值,但我无法设置为一个字符串值。
    【解决方案2】:

    您可以将这两个字符串读入您比较的 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 对象。

    【讨论】:

    • 我仍然没有完全理解客户端的变化,我应该这样做:request.IfModifiedSince.ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss") = File.GetLastAccessUtc (文件名)
    • 我必须重新阅读您的问题才能完全理解有关服务器和客户端的问题,但我想我现在已经修复了我的答案。服务器现在将以相同的格式比较请求中的文件日期和标头日期。
    猜你喜欢
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 2017-10-07
    • 2015-07-13
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多