2012-02-02 4 views
0

J'utilise Amazon AWS .NET SDK pour se connecter à Amazon S3.AWS .NET SDK clés illégales

La méthode WithKey() de PutObjectRequest code automatiquement toute chaîne que vous lui lancez, mais il existe encore des motifs qu'elle ne peut pas gérer. Ne pas gérer les clés signifie l'erreur suivante:

Amazon.S3.AmazonS3Exception: The request signature we calculated 
does not match the signature you provided 

J'ai trouvé peu ou pas de documentation sur les clés légales d'Amazon. Quels modèles sont illégaux à utiliser dans les clés S3 et jeter cette exception?

Répondre

3

J'ai créé une méthode pour normaliser slash dans les clés lors du téléchargement de

private static string NormalizeKey(string relativePath) 
    { 
      return relativePath.Replace("~/", "").Replace(@"~\", "").Replace(@"\", @"/").Replace(@"//", @"/"); 
    } 

Cordialement.

+1

Merci Shoaib! J'ai une méthode similaire pour éviter de créer accidentellement des dossiers lors de la construction de mes clés. Quel est le tilde '~' dans les appels Remplacer? Sans que cela semble fonctionner correctement pour moi. –

+1

~ est utilisé dans mon code parce que j'ai configuré mon chemin relatif comme ils existent dans mon projet local. dans votre cas, cela pourrait être évité. –

1

Dans mon cas particulier, le problème était double:

  1. Amazon ne peut pas gérer la barre oblique inverse caractère « \ » dans les clés
  2. Amazon ne permet pas de dossiers pour mettre fin à une période

j'ai écrit les deux méthodes suivantes pour aider lors de la construction mes clés:

// Cleans a piece of a key - a folder name or final object name: 
// - replaces illegal characters with valid ones 
// - avoids accidental folder creation by removing slashes inside the key 
private string CleanPartialKey(string partialKey) 
{ 
    return partialKey.Replace('/', '-') // Add slashes separately - avoid creating accidental folders 
        .Replace('\\', '_'); // Amazon knows not how to deal with backslashes, so replace them with something else 
} 

// Ensures a full key does not have any illegal patterns. 
// This should only be called with a complete key 
private string CleanKey(string fullKey) 
{ 
    return fullKey.Replace("./", "/"); // ending a folder with a period is illegal 
}