request.GetResponse()在标题最后修改包含“Fri,2009年11月20日15:53:16 E. Australia Standard Time”时给出一个ProtocolViolationException

时间:2009-11-23 20:39:33

标签: .net http http-headers httpwebresponse mongoose-web-server

Q1 - 这是.net中的错误,还是我用于测试的网络服务器(Mongoose)没有以其应该的格式提供最后修改的标题字段?

  • 所以在C#VS2008中,如果我拨打电话:
    response = (HttpWebResponse)request.GetResponse();
    Console.Out.WriteLine(" - LM = " + response.LastModified);

  • 我得到:ProtocolViolationException:标题中日期字符串的值无效

  • 当我使用HTTPLiveHeaders查看最后修改的HTTP头时,我看到:

    最后修改时间:2009年11月20日星期五15:53:16 E.澳大利亚标准时间

Q2 - 关于如何处理依赖于使用Mongoose服务器的单元测试的任何建议都没有这个问题?

第三季度 - 任何人都知道这是否会在生产互联网网络服务器上发生很多事情?也就是说,我应该假设一些网络服务器会以不同的格式提供Last-Modified字段,以便.net不愿意这样做?

2 个答案:

答案 0 :(得分:2)

实际上,除了GMT之外的任何东西都是无效的:

“所有HTTP日期/时间戳必须以格林威治标准时间(GMT)表示,无一例外。” (见RFC 2616, Section 3.3.1, Paragraph 5

答案 1 :(得分:1)

Q1)

如果您参考RFC 2616 Section 14,您会看到Last-Modified标头的定义是:

  

Last-Modified =“Last-Modified”“:”HTTP-date

指定了HTTP日期in the same RFC, section 3

  Sun, 06 Nov 1994 08:49:37 GMT  ; RFC 822, updated by RFC 1123
  Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
  Sun Nov  6 08:49:37 1994       ; ANSI C's asctime() format
     

首选格式为   互联网标准和代表一个   定义的固定长度子集   RFC 1123 [8](RFC 822的更新   [9])。第二种格式是共同的   使用,但基于过时的RFC   850 [12]日期格式,缺少一个   四位数年份。 HTTP / 1.1客户端和   解析日期值的服务器必须   接受所有三种格式(for   但是,与HTTP / 1.0的兼容性   他们必须只生成RFC 1123   表示HTTP日期的格式   标题字段中的值

由于标题中的日期与其中第一个匹配,只有时区看起来不同,您可以查看RFC 1123以查看它是否合法。关于时区,这说明了。

  

有一个强烈的趋势   使用数字时区指标,   和实现应该使用数字   时区而不是时区名称。   但是,所有实现都必须   接受任何一种表示法。如果是时区   使用名称,它们必须完全正确   如RFC-822中所定义。

RFC 822 Section 5我们可以看到区域的定义:

 zone        =  "UT"  / "GMT"                ; Universal Time
                                             ; North American : UT
             /  "EST" / "EDT"                ;  Eastern:  - 5/ - 4
             /  "CST" / "CDT"                ;  Central:  - 6/ - 5
             /  "MST" / "MDT"                ;  Mountain: - 7/ - 6
             /  "PST" / "PDT"                ;  Pacific:  - 8/ - 7
             /  1ALPHA                       ; Military: Z = UT;
                                             ;  A:-1; (J not used)
                                             ;  M:-12; N:+1; Y:+12
             / ( ("+" / "-") 4DIGIT )        ; Local differential
                                             ;  hours+min. (HHMM)

由于此处未列出标题中的时区,因此我们可以断定它无效,并且服务器实际上违反了协议,因此异常似乎是合理的。

Q2)

我担心我不知道如何处理它,除了将代理设置为修复标头有效的方式,或者请求编写/维护Mongoose服务器的人修复它(或者自己修复并提交补丁,因为它是一个开源项目。)

Q3)

我很少(如果有的话)看过.NET服务器有问题的网络服务器,所以我不认为这类问题在互联网上很常见。