29

ASP.Net MVC 4 앱을 개발 중이며 Azure Blob을 사용하여 사용자가 업로드 할 이미지를 저장하고 있습니다. 나는 다음과 같은 코드가 있습니다 :Azure Blob 400 컨테이너 생성시 요청이 잘못되었습니다.

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 
    } 

가능한 한 빨리 문 나는 다음과 같은 예외를 받고 있어요 excecuted 경우 :

{"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}

업데이트 : 난 그냥 image에 컨테이너 이름을 변경하고 난 여전히 같은 예외가 . 또한 개발 연결 문자열은 다음과 같습니다 : <add name="StorageConnection" connectionString="UseDevelopmentStorage=true" />

답변

6

실제로 문제를 발견하게되었습니다.

내 문제는 BLOB 저장소 에뮬레이터가 시작되지 않는다는 것입니다 (다른 에뮬레이터가 시작되고 BLOB가 누락 됨). 문제는 포트 10000 (기본 blob 에뮬레이터 포트)이 이미 다른 소프트웨어에 의해 사용되고 있다는 것이 었습니다. 나는 Netstat cmd 도구를 사용하여 그것이 어떤 소프트웨어인지, 죽 였는지, 지금은 매력처럼 작동하는지 확인합니다 !!! 모두에게 감사드립니다!

+0

Netstat에서 사용한 명령은 무엇입니까? – nmit026

74

연구를 통해 알게되었으므로 문제는 이름입니다.

테스트 컨테이너의 이름은 imageads-57905553-8585-4d7c-8270-be9e611eda81이지만 코드에는 ImageAds-57905553-8585-4d7c-8270-be9e611eda81이 사용됩니다. 대문자 사용의 차이점을 주목하십시오. 컨테이너 이름을 모두 소문자로 바꾸면 제대로 작동합니다.


은 자세한 내용은 Naming and Referencing Containers, Blobs, and Metadata에서 컨테이너 이름 아래 # 3 참조 :

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

안녕하세요, 답장을 보내 주셔서 감사합니다. 그 문장의 마지막에는'.ToLower()'가있어 문자열 전체를 소문자로 변환합니다. 두 경우 모두 나는 무언가를 놓친 것 같았고 머리를 감고 정적 인 '이미지'로 이름을 바꾸었고 나는 똑같은 예외를 겪었다. – hjavaher

+2

포인트 3이 나를 위해 일했습니다. 감사 !! –

+0

제 경우에는 컨테이너 이름이 너무 짧습니다 (최소 3 자 이상이어야합니다). – Illidan

1

container.CreateIfNotExist()이 (가) container.CreateIfNotExists()이되었으므로 이전 버전의 클라이언트 라이브러리를 사용하고있는 것 같습니다. 최신 클라이언트 버전 (2.1) 업그레이드를 고려해 보셨습니까?

+0

안녕하세요, 사실 저는 방금 문제를 발견했는데 이것은 문제가 아닙니다. 그러나 나는 새로운 (실제로는 더 새로운 방법으로) 패키지가 있다는 것을 깨닫지 못하고 그것을 업그레이드했다. – hjavaher

+4

제 경우의 문제는 에뮬레이터가 오래되었다는 것입니다. 최신 에뮬레이터를 설치하면 (전체 2.7 SDK로 이동할 필요가 없음)이 문제가있는 시스템의 문제가 해결되었습니다. –

0

경우에 따라 의 httpstatus 메시지가 필요합니다. 내 경우에는 오류가 발생했습니다. 요청한 URI가 서버의 리소스를 나타내지 않기 때문입니다.

는 그래서 난 내가 본

CloudBlobContainer container = > blobClient.GetContainerReference(BlobContainerName); 

다른 경우 컨테이너의 이름을 잘못 내 BlobContainerName는하지 않을 권리 컨테이너를 포함 (또는하지 존재하는) 것을 보았다."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 ""; 
     } 
10

는 @ kwill의 대답에 확장하려면 컨테이너 추가 blobcontainername, 내가로 문자열을 변환하는 솔루션을 구현 Azure's rules for container naming에 따라 허용 컨테이너 이름 : 당신이 용기를 얻을 수하려고 할 때 다음

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()); 
+1

이 작업은 가능하지만 일반적으로 충돌로 끝날 수 있으므로 (예 : 동일한 이름으로 해결되는 두 개의 별개 이름) –

5

저장소 라이브러리 및 저장소 에뮬레이터의 버전이 "비 동기화"되어 있지 않은지 확인하십시오. 라이브러리를 업데이트했지만 에뮬레이터를 최신 버전으로 업데이트하지 않았고 정확한 상황이 발생했습니다.

+0

감사합니다. NuGet을 통해 WindowsAzure.Storage 패키지를 업그레이드했으며이 오류가 발생했습니다. Azure Storage Simulator의 최신 버전을 제거하고 다운로드하여 오류를 해결하고 모든 것이 잘 작동되도록했습니다. –

2

컨테이너 이름은 항상 소문자 여야합니다. 내부적으로 암시 적 변환이 있어야만 원래의 Blob을 소문자로 만들지 만 createifnotexists (async)에서 비교하면 그렇지 않습니다. 그러나 그것을 다시 만들 때, 그것은 다시 사건을 낮추고, 결과는 충돌을 일으킨다. 이것은 가장 좋은 추측입니다.

2

방금이 문제가 발생하여 해결되었습니다.

내 컨테이너 이름은 괜찮 았지만 실수로 연결 문자열에 AccountName 매개 변수가 대문자로 표시되었습니다. 이되었다 내 400

4

당신은 , 갱신WindowsAzure.Storage nuget 패키지를 가지고 앱 HTTP 오류 400 잘못된 요청와 충돌 시작한 경우 :이 일이 내 경우

때 8.2.1로 업데이트되었고 로컬 에뮬레이터는 5.1 버전이었습니다. "푸른 저장 에뮬레이터"에 대한

  1. 이동 마이크로 소프트 애저에 SDK 페이지 here.
  2. 검색 및 최신 저장 에뮬레이터를 다운로드 :

    내 솔루션이 있습니다. 일반적으로 페이지 왼쪽의 "명령 줄 도구"섹션에서

  3. 최신 에뮬레이터를 설치하십시오.
  4. 잘 하시길 바랍니다.

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

My humble request if anybody from Microsoft Azure Storage Emulator team reads this - 개발 모드에 대한 검사를 추가하고 같은 메시지와 함께 의미있는 예외를 던져주십시오 -. 을 "당신은 푸른 저장 에뮬레이터 버전이 XYZ 설치되어 푸른로 현재 WindowsAzure.Storage 라이브러리 ** VVV을 사용하려면 에뮬레이터에서이 링크의 에뮬레이터 버전 ZZZ를 설치해야합니다. "** 또는 유용하다고 생각하는 것이 무엇이든간에.

이런 종류의 문제는 내 시간으로 몇 시간을 낭비했으며 전 세계 수천 명의 개발자에게도 마찬가지 일 것이라고 추측합니다.이 예외는 4 년 넘게 계속됩니다.