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不愿意这样做?答案 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服务器有问题的网络服务器,所以我不认为这类问题在互联网上很常见。