Заголовок ответа HTTP, формат для "Истекает"

Я устанавливаю это в С# с помощью этой строки:

WebOperationContext.Current.OutgoingResponse.Headers.Add(HttpResponseHeader.Expires, DateTime.Now.AddSeconds(10).ToString());

Теперь я знаю, что формат отключен, поскольку он ожидает следующее: Tue, 06 Dec 2011 20:24:15 GMT

Есть ли класс в .NET, реализующий IFormatProvider, я мог бы использовать здесь? Или мне нужно создать свой собственный?

Ответы

Ответ 2

Я использую DateTime.UtcNow.AddDays(30).ToString("R")

От MSDN:

Спецификатор стандартного формата "R" или "r" представляет собой пользовательскую строку формата даты и времени, которая определяется свойством DateTimeFormatInfo.RFC1123Pattern. Шаблон отражает определенный стандарт, и свойство доступно только для чтения. Поэтому он всегда один и тот же, независимо от используемой культуры или поставщика формата. Строка настраиваемого формата: "ddd, dd MMM yyyy HH": 'mm': 'ss' GMT ''. Когда используется этот спецификатор стандартного формата, операция форматирования или разбора всегда использует инвариантную культуру

Ответ 3

Вам не нужно передавать строку и задавать заголовок. Все, что вам нужно, это установить свойство LastModified:

WebOperationContext.Current.OutgoingResponse.LastModified = DateTime.Now; // DataTime.UtcNow;

Вам даже не нужно беспокоиться о прохождении времени UTC, оно обрабатывает его для вас.

Ответ 4

Я создал это:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WcfService1
{
    public static class HttpExpiresFormat
    {

        private enum Month
        {
            Jan = 1, Feb = 2, Mar = 3, Apr = 4, May = 5, Jun = 6, Jul = 7, Aug = 8, Sept = 9, Oct = 10, Nov = 11, Dec = 12
        }


        public static string HttpExpireDate(double secondsToAdd)
        {
            DateTime dateTime = DateTime.Now;

            string dayOfWeek = ConvertDayToSmall(dateTime.DayOfWeek.ToString());
            string day = dateTime.Day < 10 ? "0" + dateTime.Day.ToString() : dateTime.Day.ToString();
            string month = ((Month)dateTime.Month).ToString();
            string year = dateTime.Year.ToString();
            char[] trim = new char[] { '.' };
            string substring = dateTime.AddHours(5).AddSeconds(secondsToAdd).TimeOfDay.ToString();
            string time = substring.Remove(substring.LastIndexOf('.')) + " GMT";

            return string.Format("{0}, {1} {2} {3} {4}", dayOfWeek, day, month, year, time);
        }

        private static string ConvertDayToSmall(string day)
        {
            switch (day)
            {
                case "Monday":
                    return "Mon";
                case "Tuesday":
                    return "Tue";
                case "Wednesday":
                    return "Wed";
                case "Thursday":
                    return "Thu";
                case "Friday":
                    return "Fri";
                default:
                    return null;
            }
        }
    }
}