7
votes

C # Httpwebrequest Date Formatage d'en-tête

Je fais un httpwebrequest à S3, et j'essaie de définir l'en-tête de la date à quelque chose comme ceci:

"Lun, 16 juil 2012 01:16:18 -0000" P> blockQuote>

Voici ce que j'ai essayé: p> xxx pré>

mais, quand je regarde les en-têtes de la demande, voici ce que je reçois: P >

request.Headers.Get("Date");
// "Mon, 16 Jul 2012 07:16:18 GMT"


0 commentaires

4 Réponses :


1
votes

Le httpwebrequest formatera correctement la date en soi. Votre problème est que vous devez soumettre une date actuelle valide. Vous devez vérifier que l'horloge de l'ordinateur est exacte, puis que vous envoyez la date appropriée concernant les zones de temps et les problèmes UTC et GMT ...

Essayez les deux: P>

request.Date = DateTime.Now;
request.Date = DateTime.UtcNow;


0 commentaires

13
votes

Il y a des choses à clarifier: strong>

  • Votre motif de date est incorrect. p> li>

  • Le httpwebrequest demande.date code> L'en-tête peut être modifié uniquement dans .NET Framew 4 et selon la documentation, l'espace de noms code> system.net code> va toujours écrire Cet en-tête sous forme de formulaire standard utilisant Format GMT (UTC) FORT>. Ainsi, tout ce que vous pouvez faire pour formater votre date comme vous le souhaitez, ne fonctionnera pas! P> Li>

  • dans d'autres versions de framework .NET, vous ne pourrez pas modifier le httpwebrequest demande.date code> en-tête car il utilisera la date réelle dans le format GMT correct (UTC), à moins que vous n'utilisiez une sorte de hack pour définir votre propre date et format (voir ci-dessous). p> li> ul>


    solution pour votre problème (testé et travail): strong> p>

    vos importations: EM>

    // "myDate" will output the same date as the first moment: 
    // Mon, 16 Jul 2012 01:16:18 -0000
    // As you can see, you will never get this again:
    // Mon, 16 Jul 2012 07:16:18 GMT
    string myDate = request.Headers.Get("Date");
    


3 commentaires

Grande solution et exemple. Je dois utiliser un timbre de temps unix (décimal) pour ma date, et c'était la solution parfaite. Acclamations!


J'aimerais pouvoir pouvoir upouver plus d'une fois! très bonne réponse :)


En .NET 4.7 Utilisation: Headers.getType (). GetMethod ("tryaddwithouttvalidation", nouveau type [] {typeof (string), typeof (string)});



0
votes

En supposant que vous souhaitez définir l'en-tête de date pour l'en-tête d'autorisation au travail.

Amazon fournit un autre en-tête personnalisé qui sera utilisé au lieu de la date (si fourni). Si vous ne pouvez pas définir l'en-tête de la date, vous pouvez utiliser l'en-tête personnalisé, la date X-Amz à la place.

Voici le lien vers les docs ici < / p>


1 commentaires

Veuillez poster plus d'informations dans ce message au lieu de simplement quitter un lien. Il est plus utile pour les futurs visiteurs, apparaît mieux dans les recherches et persistera si le lien va mal.



-1
votes

Vous devez utiliser l'en-tête "X-AMZ-DATE".

public void GetObject(string AccessKeyID, string SecretKey){           
        /*objectKey = folder/folder/filename.zzz*/
        var url = "http://somehost/bucket/objectkey"

        HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
        /*Fiddler proxy*/
        /*request.Proxy = new WebProxy("http://127.0.0.1:8888");*/

        request.Headers.Add("X-Amz-Date",String.Format("{0:ddd,' 'dd' 'MMM' 'yyyy' 'HH':'mm':'ss' 'K}", DateTime.Now));
        request.Headers.Add("Authorization", $"AWS {AccessKeyID}:{SignAuthorizationString(request, SecretKey)}");

        WebResponse response = request.GetResponse();
        }
private string SignAuthorizationString(HttpWebRequest request, string SecretKey){
        //TODO: DOCS - http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html

        string canonicalizedResource = request.RequestUri.PathAndQuery;
        string canonicalizedAmzHeaders  = ComposeSignatureAmzHeadersForSigning(request);
        string stringToSign = request.Method + "\n"
                              + request.Headers.Get("Content-MD5") + "\n"
                              + request.ContentType + "\n"
                              + request.Headers.Get("Date") + "\n" /*Here the date will be blank*/
                              + canonicalizedAmzHeaders + canonicalizedResource;

        return GetSignedMessage(SecretKey, stringToSign);
        }
 private string ComposeSignatureAmzHeadersForSigning(HttpWebRequest request){
        SortedDictionary<string, string> headersDictionary = new SortedDictionary<string, string>(StringComparer.OrdinalIgnoreCase);
        foreach (string _key in request.Headers.Keys)
        {
            key = _key.ToLower(); 
            if (key.StartsWith("x-amz"))
            {
                if ("x-amz-meta-reviewedby".Equals(key))
                {
                    if (headersDictionary.ContainsKey(key))
                        headersDictionary[key] = headersDictionary[key] + "," + request.Headers[key];
                    else
                        headersDictionary[key] = request.Headers[key];
                }
                else
                    headersDictionary[key] = request.Headers.Get(key);
            }
        }
        StringBuilder stringBuilder = new StringBuilder();
        foreach (var pair in headersDictionary)
        {
            stringBuilder.Append(pair.Key)
                .Append(":")
                .Append(pair.Value)
                .Append("\n");

        }
        return stringBuilder.ToString();
        }
private static string GetSignedMessage(string key, string message){
        var crypt = HMACSHA1.Create();
        crypt.Key = Encoding.ASCII.GetBytes(key);
        crypt.ComputeHash(Encoding.UTF8.GetBytes(message));

        return Convert.ToBase64String(crypt.Hash);
        }


0 commentaires