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"
4 Réponses :
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;
Il y a des choses à clarifier: strong> Votre motif de date est incorrect. p> li>
Le httpwebrequest dans d'autres versions de framework .NET, vous ne pourrez pas modifier le httpwebrequest solution pour votre problème (testé et travail): strong> p> vos importations: EM>
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
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>
// "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");
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)});
En supposant que vous souhaitez définir l'en-tête de date pour l'en-tête d'autorisation au travail. P>
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. P>
Voici le lien vers les docs ici < / p>
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.
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); }