Ошибка загрузки AWS S3 PreSignedUrl

Я пытаюсь загрузить файлы в хранилище S3 с помощью .NET SDK и вижу следующий ответ на ошибку при вводе предварительно подписанного URL-адреса, предоставленного AWS:

Блок, к которому вы пытаетесь получить доступ, должен быть адресован с помощью указанной конечной точки

Вот код .Net-я подтвердил, что мое ведро находится в USWest2.

var amazonS3Client = new AmazonS3Client(accessKey, secretKey, RegionEndpoint.USWest2);
    // Generate a pre-signed URL.
    string folderName = "MyFolder";
    string key = "TestKey";
    GetPreSignedUrlRequest request = new GetPreSignedUrlRequest
    {
      BucketName = _bucketName,
      Key = folderName + "/" + key,
      Verb = HttpVerb.PUT,
      Expires = DateTime.Now.AddMinutes(5)
    };
    var uri = Uri(_amazonS3Client.GetPreSignedURL(request));

    // Upload a file using the pre-signed URL.
    Stream stream = ... // This is set elsewhere, contains a data stream.
    ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
    HttpWebRequest httpRequest = WebRequest.Create(uri) as HttpWebRequest;
    httpRequest.Method = "PUT";
    using (Stream dataStream = httpRequest.GetRequestStream())
    {
      byte[] buffer = new byte[8000];
      int bytesRead = 0;
      while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
      {
        dataStream.Write(buffer, 0, bytesRead);
      }
    }
    HttpWebResponse response = httpRequest.GetResponse() as HttpWebResponse;
    if(response.StatusCode != HttpStatusCode.OK)
      throw new Exception("Error uploading to AWS: " + response.StatusDescription);

1 ответ

  1. В конечном итоге это было вызвано тем, что URL-адрес, возвращенный вызовом:

    var uri = Uri(_amazonS3Client.GetPreSignedURL(request));
    

    Был формата:

    https://s3-us-west-2.amazonaws.com/....
    

    Но AWS перенаправил это на:

    https://s3.amazonaws.com/....
    

    Используя последний URL в качестве начала моего «предварительно подписанного URL», файлы теперь загружаются правильно.