HTTP-antwoordkop, indeling voor "verloopt"

Ik stel dit in C# met deze regel:

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

Nu weet ik dat het formaat hiervan is uitgeschakeld omdat het het volgende verwacht: di, 06 dec 2011 20:24:15 GMT

Is er een klasse in .NET implementatie van IFormatProvider die ik hier zou kunnen gebruiken? Of moet ik mijn eigen maken?

17

4 antwoord

I use DateTime.UtcNow.AddDays(30).ToString("R")

Van MSDN :

De specificatie van de standaardindeling "R" of "r" staat voor een aangepaste tekenreeks voor de datum- en tijdnotatie die wordt gedefinieerd door DateTimeFormatInfo.RFC1123Pattern eigenschap. Het patroon geeft een gedefinieerde standaard weer en de eigenschap is alleen-lezen. Daarom is het altijd hetzelfde, ongeacht de gebruikte cultuur of de aangeboden aanbieder van het formaat. De aangepaste opmaakreeks is "ddd, dd MMM jjjj HH ':' mm ':' ss 'GMT'". Wanneer deze standaardformaatspecificatie wordt gebruikt, gebruikt de opmaak- of parseerbewerking altijd de invariante cultuur

29
toegevoegd
Dit zou het geaccepteerde antwoord moeten zijn.
toegevoegd de auteur Art, de bron
Dit is absoluut de juiste manier om het te doen!
toegevoegd de auteur mortb, de bron

U kunt de Aangepaste datum- en tijdnotatie-strings gebruiken .

Tue, 06 Dec 2011 20:24:15 GMT

genereer het bovenstaande formaat als volgt:

DateTime.Now.AddDays(30).ToUniversalTime()
    .ToString("ddd, dd MMM yyyy HH:mm:ss 'GMT'");
13
toegevoegd
Let op, deze code is niet cultuurongevoelig en zal de datum opmaken met behulp van de server locale. Gebruik thedate.ToString ("R") of thedate.ToString ("ddd, dd MMM jjjj UU: mm: ss 'GMT'", DateTimeFormatInfo.InvariantInfo)
toegevoegd de auteur Steve B, de bron
Natuurlijk moet u nog steeds .ToUniversalTime() aanroepen.
toegevoegd de auteur Steve B, de bron
Zoals voorgesteld door Steve B en in het antwoord van hieronder, is format string "R" de beste manier om dit te doen. bijv. DateTime.UtcNow.AddDays (30) .ToString ( "R")
toegevoegd de auteur dave, de bron
@SteveB je advies meer waard dan een antwoord. tnx zo veel.
toegevoegd de auteur Behnam Esmaili, de bron

Uiteindelijk heb ik dit gemaakt:

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;
            }
        }
    }
}
8
toegevoegd
Waarschijnlijke onderbrekingen voor machines die zijn ingesteld op andere locaties dan en-us.
toegevoegd de auteur binki, de bron

U hoeft geen tekenreeks door te geven en een koptekst in te stellen. Het enige wat u nodig hebt, is om de LastModified-eigenschap in te stellen:

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

Je hoeft je niet eens zorgen te maken over het verstrijken van de UTC-tijd, het regelt het voor je.

2
toegevoegd