request.GetResponse() выдает исключение ProtocolViolationException, когда последний измененный заголовок содержит пт, 20 ноября 2009 г., 15:53:16 E. Стандартное время Австралии.

Q1. Является ли это ошибкой в ​​.net или веб-сервером, который я использую для тестирования ( Mongoose ) не поддерживает поле заголовка Last-Modified в нужном формате?

  • Итак, в C# VS2008, если я позвоню:
    response = (HttpWebResponse)request.GetResponse();
    Console.Out.WriteLine(" - LM = " + response.LastModified);

  • Я получаю: ProtocolViolationException: значение строки даты в заголовке недопустимо

  • Когда я использую HTTPLiveHeaders для просмотра заголовка HTTP для последнего изменения, я вижу:

    Последнее изменение: пятница, 20 ноября 2009 г., 15:53:16, стандартное время Восточной Австралии.

Q2. Любые предложения о том, что делать, чтобы мои модульные тесты, основанные на использовании сервера Mongoose, не имели этой проблемы?

Q3 - Кто-нибудь знает, может ли это часто происходить на производственных веб-серверах в Интернете? т. е. должен ли я предполагать, что некоторые веб-серверы вернут поле Last-Modified обратно в формате, отличном от .net?


person Greg    schedule 23.11.2009    source источник


Ответы (2)


Q1)

Если вы обратитесь к RFC 2616, раздел 14, вы увидите что определение заголовка Last-Modified:

Last-Modified = "Last-Modified" ":" HTTP-дата

HTTP-дата указана в том же 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

Первый формат предпочтительнее в качестве интернет-стандарта и представляет собой подмножество фиксированной длины формата, определенного в RFC 1123 [8] (обновление RFC 822 [9]). Второй формат широко используется, но основан на устаревшем формате даты RFC 850 [12] и не имеет четырехзначного числа года. Клиенты и серверы HTTP/1.1, которые анализируют значение даты, ДОЛЖНЫ принимать все три формата (для совместимости с 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, поэтому я не думаю, что этот тип проблем распространен в Интернете в целом.

person Greg Beech    schedule 23.11.2009
comment
отлично - спасибо, Грег - возможно, тогда мне следует посмотреть на другой легкий веб-сервер для целей тестирования, я думаю - person Greg; 24.11.2009
comment
Ага. Не доверяйте веб-серверу, который явно игнорирует спецификации HTTP. Вы столкнулись с одним примером этого, и обязательно будут другие. - person Stephen C; 24.11.2009

На самом деле все, кроме GMT, недействительно:

«Все метки даты/времени HTTP ДОЛЖНЫ быть представлены в среднем времени по Гринвичу (GMT) без исключения». (см. RFC 2616, раздел 3.3.1, Параграф 5)

person Julian Reschke    schedule 24.11.2009