1

Q1 - 这是 .net 中的一个错误,还是我用于测试的网络服务器 ( Mongoose ) 没有以它应该的格式提供标头字段 Last-Modified?

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

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

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

    最后修改时间:2009 年 11 月 20 日星期五 15:53:16 E. Australia Standard Time

Q2 - 关于如何处理的任何建议,以便我依赖使用 Mongoose 服务器的单元测试不会出现这个问题?

Q3 - 任何人都知道这是否会在生产 Internet Web 服务器上经常发生?即我是否应该假设某些网络服务器会以.net 会拒绝的不同格式返回 Last-Modified 字段?

4

2 回答 2

2

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

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

于 2009-11-24T08:09:51.400 回答
1

Q1)

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

Last-Modified = "Last-Modified" ":" HTTP-日期

HTTP-date在同一 RFC 第 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

第一种格式是首选的 Internet 标准,它代表 RFC 1123 [8](对 RFC 822 [9] 的更新)定义的固定长度子集。第二种格式是常用的,但基于过时的 RFC 850 [12] 日期格式并且缺少四位数的年份。解析日期值的 HTTP/1.1 客户端和服务器必须接受所有三种格式(为了与 HTTP/1.0 兼容),尽管它们必须只生成 RFC 1123 格式来表示标头字段中的 HTTP 日期值

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

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

RFC 822 第 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 在调用时遇到问题的 Web 服务器,所以我不相信这种类型的问题在互联网上普遍存在。

于 2009-11-23T21:01:22.167 回答