programing

Azure Blob 400 컨테이너 생성 시 잘못된 요청.

batch 2023. 5. 6. 14:10
반응형

Azure Blob 400 컨테이너 생성 시 잘못된 요청.

ASP를 개발하고 있습니다.Net MVC 4 앱과 저는 Azure Blob을 사용하여 사용자가 업로드할 이미지를 저장하고 있습니다.다음 코드가 있습니다.

 var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["StorageConnection"].ConnectionString);

 var blobStorage = storageAccount.CreateCloudBlobClient();
 //merchantKey is just a GUID that is asociated with the merchant
 var containerName = ("ImageAds-" + merchant.merchantKey.ToString()).ToLower();
 CloudBlobContainer container = blobStorage.GetContainerReference(containerName);
 if (container.CreateIfNotExist())
    {
       //Upload the file
    } 

if 문이 실행되는 즉시 다음 예외가 발생합니다.

  {"The remote server returned an error: (400) Bad Request."}

컨테이너 이름인 줄 알았는데 이상이 없네요.연결 문자열은 BLOB에 대한 모든 세부 정보가 포함된 좋은 저장소를 생성하는 것 같습니다.난 어쩔 줄 모르겠다.제가 웹사이트를 조사해보니 모두가 이름 짓기 문제라고 하는데 잘못된 점을 찾을 수가 없네요.

: 사한테스컨너이름이테:imageads-57905553-8585-4d7c-8270-be9e611eda81

과 같은 uri가 .{http://127.0.0.1:10000/devstoreaccount1/imageads-57905553-8585-4d7c-8270-be9e611eda81}

업데이트: 컨테이너 이름을 just로 변경했습니다.image그리고 저는 여전히 같은 예외를 받습니다.또한 개발 연결 문자열은 다음과 같습니다.<add name="StorageConnection" connectionString="UseDevelopmentStorage=true" />

당신이 조사를 통해 알아낸 것처럼, 문제는 이름입니다.

이 당은당테스컨이테의름이너이라고 말합니다.imageads-57905553-8585-4d7c-8270-be9e611eda81하지만 당신이 사용하고 있는 코드에서는ImageAds-57905553-8585-4d7c-8270-be9e611eda81대문자와 소문자의 차이에 주목하십시오.컨테이너 이름을 모두 소문자로 바꾸면 올바르게 작동합니다.


자세한 내용은 컨테이너, 블롭 및 메타데이터 이름 지정 및 참조컨테이너 이름 아래의 #3을 참조하십시오.

컨테이너 이름의 모든 문자는 소문자여야 합니다.

@kwill의 답변을 확장하기 위해, 는 컨테이너 명명에 대한 Azure의 규칙을 기반으로 모든 문자열을 허용 가능한 컨테이너 이름으로 변환하는 솔루션을 구현했습니다.

public static string ToURLSlug(this string s)
{
    return Regex.Replace(s, @"[^a-z0-9]+", "-", RegexOptions.IgnoreCase)
        .Trim(new char[] { '-' })
        .ToLower();
}

그런 다음 용기를 가져오려고 할 때 먼저 용기를 청소합니다.

CloudBlobContainer container = blobClient.GetContainerReference(bucket.ToURLSlug());

저는 결국 문제를 발견하게 되었습니다.

제 문제는 블롭 스토리지 에뮬레이터가 시작되지 않는다는 것이었습니다(다른 에뮬레이터가 시작되고 저는 블롭을 놓쳤습니다).문제는 포트 10000(기본 블롭 에뮬레이터 포트)이 이미 다른 소프트웨어에서 사용되고 있다는 것입니다.저는 용한사를 요.Netstatcmd 도구가 어떤 소프트웨어인지 확인하고, 죽였으며, 이제 매력적으로 작동합니다!!!여러분 감사합니다!!

스토리지 라이브러리와 스토리지 에뮬레이터의 버전이 "동기화되지 않음"이 아닌지 확인합니다.라이브러리를 업데이트했지만 에뮬레이터를 최신 버전으로 업데이트하지 않아 정확한 상황이 발생했습니다.

Windows Azure를 방금 업데이트한 경우.스토리지 너겟 패키지 및 앱이 http 오류 400 잘못된 요청과 함께 충돌하기 시작했습니다.

저의 경우 8.2.1로 업데이트하고 로컬 에뮬레이터가 버전 5.1일 때 발생했습니다.

제 해결책은 다음과 같습니다.

  1. 여기에서 Microsoft Azure SDK 페이지로 이동합니다.
  2. "Azure Storage Emulator"를 검색하고 최신 스토리지 Emulator를 다운로드합니다.일반적으로 "도구" 섹션의 왼쪽 페이지 중앙에 있습니다.
  3. 최신 에뮬레이터 설치
  4. 당신은 가도 좋습니다.

Storage Emulator 5.2를 다운로드하고 5.1에서 업그레이드하면 오류가 중지됩니다.그런 오류는 이미 나에게 여러 번 있었습니다.

Microsoft Azure Storage Emulator 팀에서 이 문서를 읽은 사람이 있다면, "You have a Azure Storage Emulator version X"와 같은 메시지와 함께 의미 있는 예외를 추가해 주십시오.Y.Z가 설치되었습니다. 현재 Windows Azure를 사용하려면 다음과 같이 하십시오.스토리지 라이브러리 V.V.Azure Emulator가 설치된 V에서는 버전 Z.Z를 설치해야 합니다.이 링크에서 에뮬레이터의 Z".당신이 유용하다고 생각하는 어떤 것이든.

이런 종류의 문제는 제 시간의 몇 시간을 낭비했고 저는 전 세계 수천 명의 개발자들에게 똑같은 일이 일어났다고 생각합니다. 그리고 여전히 이 예외는 4년 이상 동안 존재합니다!

저는 방금 이 문제를 해결했습니다.

컨테이너 이름은 괜찮았지만 실수로 연결 문자열의 AccountName 매개 변수가 대문자로 표시되었습니다.이것이 제 400점으로 이어졌습니다.

내 이름은 바보 같은 이름 문제였어요!이름에 대문자는 사용할 수 없는같습니다.

방금 변경한 내용:

CloudBlobContainer container = blobClient.GetContainerReference("MyContainer");
container.CreateIfNotExists();

로.

CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");
container.CreateIfNotExists();

실험 결과, 용기 이름은 항상 소문자여야 하는 것으로 나타났습니다.내부적으로 암묵적인 변환이 있어야 하므로 소문자로 원본 블롭을 만들 수 있지만, 존재하지 않는 경우 생성(비동기)에서 비교할 때는 그렇지 않습니다.그러나 그것이 그것을 다시 만들 때, 그것은 그것을 다시 낮추고, 그것은 갈등을 초래합니다.이것은 가장 좋은 추측입니다.

패키지를 업데이트한 후 이 오류가 발생했지만 내 코드는 발생하지 않았습니다.문제는 몇 년 전 Azure Storage를 처음 사용하기 시작한 이후로 연결 문자열 형식과 내용이 변경되었다는 것입니다.zure 포털의 액세스 키 옵션에서 연결 문자열을 적절하게 업데이트해야 합니다.

내 경우:연결 문자열 EndpointSuffix=core에 누락되었습니다.창문그물을

당신의 문제를 재현하려고 했지만, 당신은 이전 버전의 클라이언트 라이브러리를 사용하고 있는 것 같습니다.container.CreateIfNotExist()지금은container.CreateIfNotExists()최신 클라이언트 버전(2.1) 업그레이드를 고려해 보셨습니까?

예외적으로 httpstatus 메시지를 볼 필요가 있습니다. 제 경우 요청된 URI가 서버의 리소스를 나타내지 않기 때문에 오류가 발생했습니다.

그래서 나는 그것을 보았습니다.BlobContainerName올바른 컨테이너를 포함하지 않음(또는 존재하지 않음

CloudBlobContainer container = > blobClient.GetContainerReference(BlobContainerName);

내가 본 다른 경우는 컨테이너의 잘못된 이름입니다. blob 컨테이너 이름은 "mycontainer1" 또는 "mycontainer2"와 같은 이름이어야 합니다.

여기에 컨테이너를 추가할 코드가 있습니다.

try
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["StorageConnectionString"].ConnectionString);

            // Create the blob client.
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

            // Retrieve reference to a previously created container.
            CloudBlobContainer container = blobClient.GetContainerReference(BlobContainerName);

            container.CreateIfNotExists();

           //creo se non esiste e aggiungo i permessi
            BlobContainerPermissions containerPermissions = new BlobContainerPermissions();
            containerPermissions.PublicAccess = BlobContainerPublicAccessType.Blob;
            container.SetPermissions(containerPermissions);

            // Retrieve reference to a blob named "myblob".
            CloudBlockBlob blockBlob = container.GetBlockBlobReference(Filename); 

            blockBlob.UploadFromStream(inFileUpload);
        }
        catch (Exception ex)
        {
            return "";
        }

이 문제에 대한 간단한 해결책은 용기가 항상 소문자로 있어야 한다는 것입니다.저도 같은 문제가 있었는데, 컨테이너 이름을 모두 소문자로 변경한 후 해결되었습니다.

다음 사항을 추가해야 했습니다.

// Enable TLS 1.2 before connecting to Azure Storage
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

참조: 클라이언트 TLS 버전 구성

언급URL : https://stackoverflow.com/questions/19599819/azure-blob-400-bad-request-on-creation-of-container

반응형