2013-08-16 10 views
9

Próbuję użyć emulatora pamięci Azure do pracy z pamięcią typu blob. Po prostu nie mogę zmusić go do pracy i zmarnowałem cały dzień próbując bezskutecznie. Wciąż dostaję zabronionego błędu 403, mimo że jest to miejsce dla programistów. Mam nadzieję, że ktoś tu może mi pomóc.Azure EMV - tworzenie blobów daje 403 Forbidden message

Poprzednio z powodzeniem uruchomiłem ten sam program na platformie Azure. Jednak moja 3-miesięczna wersja próbna wygasła bez mojego używania w ogóle, a teraz gdy wróciłem do przeglądania Azure, muszę uruchomić emulator pamięci masowej (po zmianie ciągu połączenia na pamięć dev).

Opiszę szczegółowo, co zrobiłem.

pierwsze chciałbym zapewnić, że mam wszystko, co niezbędne jest zainstalowany (chyba):

mam zarówno Visual Studio 2012 Pro i Visual Studio 2012 Express, do sieci (co jest darmowe). Zainstalowałem dodatkowe elementy wymagane dla platformy Azure za pomocą instalatora platformy internetowej. Jeśli patrzę w Dodaj/Usuń programy widzę mam

  • Windows Azure Tools for Visual Studio 2012 -v2.1
  • Azure Biblioteki Windows for .NET -v2.1
  • Emulator Windows Azure - v2.1
  • Windows Azure Authoring Tools -v2.1

jestem w stanie stworzyć projekt chmura w VS2012, jeśli chcę, i jeśli mogę to zrobić z powodzeniem wprowadza na emulatorze. Wydaje mi się, że mój problem dotyczy tylko pamięci emulatora.

Oto co zrobiłem:

Krok 1.

utworzyć nowy projekt ASP.NET MVC4. Korzystam z platformy .NET 4.5. który tworzy podstawowy szablon projektu z HomeController.cs i AccountController.cs

Krok 2.

używam Nuget dostać "Windows Azure Storage". Wierzę, że to stawia WindowsAzure.Storage.dll wersja 2.0.6.1 w moich odniesień projektu. Poza tym widzę, że moje referencje obejmują również -Microsoft.WindowsAzure.Configuration v2.0.0.0 -Microsoft.WindowsAzure.Diagnostics v2.1.0.0 -Microsoft.WindowsAzure.ServiceRuntime v2.1.0.0 -Microsoft .WindowsAzure.StorageClient v1.7.0.0

Krok 3.

W pliku Web.config, dodać następujący tag w obrębie tagów

jest to w zasadzie nazwa konta i klucz wszyscy powinni używać podczas używania emulatora.

Etap 4.

W HomeController.cs utworzyć działanie. Ta akcja ma na celu utworzenie kontenera na magazynie BLOB Azure i przesłanie do niego pliku. Oto kod.Jak widać jest to dość dużo standardowy kod można znaleźć w przykładach początkujących


public ActionResult AddBlobToBlobContainerStorageEmulator() 
    { 
     // Retrieve storage account from connection string 
     CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["EmulatorStorageConnectionString"]); 

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

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

     // Create the container if it doesn't already exist. 
     container.CreateIfNotExists(); 


     // Retrieve reference to a blob named "mytestblob". 
     CloudBlockBlob blockBlob = container.GetBlockBlobReference("myemulatortestblob.jpg"); 

     // Create or overwrite the "mytestblob" blob with contents from a local file. 
     using (var fileStream = System.IO.File.OpenRead(@"E:\TUTORIALS\Windows Azure\Azure NOTES and stuff\table.jpg")) 
     { 
      blockBlob.UploadFromStream(fileStream); 
     } 

     return Content("Blob uploaded to container on storage emulator"); 
    } 

Krok 5.

I upewnij się, że emulator obliczeniowa jest uruchomiona: Start> Wszystkie programy > Windows Azure> Emulator> Windows Azure Compute Emulator

Krok 6.

To wszystko. Nie utworzyłem projektu w chmurze ani nic takiego, więc kiedy go uruchomię, będzie on działał na "lokalnym serwerze sieciowym IIS" zgodnie z właściwościami projektu (znanym również jako IIS Express).

Teraz idę do Debug> Uruchom debugowania i uruchamia witrynę w oknie przeglądarki, jak oczekiwano na localhost: 57810.

Gdybym przejdź do

http://localhost:57810/Home/AddBlobToBlobContainerStorageEmulator 

powinien odpalić moją metodę działania.

Zamiast widzę

enter image description here

Linia 118 jest w RED .... więc w zasadzie pojemnik nie może być utworzony.

Czy ktoś może mi powiedzieć, co jest nie tak. Czy muszę w jakiś sposób dodać jakieś pozwolenie do emulatora pamięci programistycznej? Nie rozumiem, dlaczego jest napisane "Zakazane".

Zastanawiałem się, czy może jest jakiś problem na moim komputerze, czy może istnieje jakiś konflikt między Azure. Czy wersje bibliotek dll w moim projekcie są w jakiś sposób niepoprawne dla emulatora programistycznego? A może jest błąd w wersji 2.1?

mam wyjaśnił dokładnie, jak zrobiłem mój projekt, ale byłbym skłonny, aby przesłać całą rzecz jeśli ktoś chce tylko spróbuj uruchomić go.

Dziękujemy za udzielenie pomocy.

+0

Jeśli debugujesz, jak wygląda "storageAccount"? Czy "EmulatorStorageConnectionString" jest poprawny? –

+1

Czy przyznałeś publiczny dostęp do swojego obiektu blob? –

+0

@lc: EmulatorStorageConnectionString powinien być poprawny, jest to domyślny ciąg znaków używany w emulatorze. Dostałem go stąd: http://msdn.microsoft.com/en-us/library/windowsazure/hh403989.aspx – Gary

Odpowiedz

14

Szczerze mówiąc jestem trochę zły, że oryginalny kod nie zrobił pracy. Po tym wszystkim, artykuł MSDN Microsoft (https://azure.microsoft.com/en-us/documentation/articles/storage-use-emulator/) wyraźnie stwierdza, powinniśmy używać:

Nazwa konta: devstoreaccount1 Key Account: Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw ==

Więc dlaczego do cholery to się nie pracować ?

Zasadniczo emulator pamięci ma różne punkty końcowe niż konto przechowywania w chmurze. Na przykład domyślnym punktem końcowym typu blob dla konta magazynu w chmurze jest http://[youraccount].blob.core.windows.net, natomiast punktem końcowym obszaru blob dla emulatora pamięci jest http://127.0.0.1:10000. Gdy podasz nazwę konta pamięci i klucz emulatora pamięci w łańcuchu połączenia, biblioteka pamięci masowej traktuje go jak konto pamięci masowej w chmurze i próbuje połączyć się z http://devstoreaccount1.blob.core.windows.net przy użyciu podanego klucza konta. Ponieważ klucz devstoreaccount1 w chmurze nie jest tym, który podałeś, otrzymujesz błąd 403.

Jeśli chcesz połączyć się z emulatorem pamięci masowej za pomocą nazwy konta i klucza, musisz podać dodatkowe szczegóły, takie jak różne punkty końcowe. Tak więc Twój ciąg połączenia może wyglądać następująco:

var connectionString = @"DefaultEndpointsProtocol=http;AccountName=devstoreaccount1; 
AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==; 
    BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1; 
    TableEndpoint=http://127.0.0.1:10002/devstoreaccount1; 
    QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;"; 

Zwróć uwagę na punkty końcowe, które określiłem w łańcuchu połączenia.

var connectionString = "UseDevelopmentStorage=true"; 

Powyższy kod jest krótką formą dużego ciągu połączenia, który wymieniono powyżej.

Mam nadzieję, że to wyjaśni wątpliwości.

+1

Gaurav Zaznaczam to jako poprawną odpowiedź, dzięki za wyjaśnienie przyczyny połączenia, nawet nie przyszło mi do głowy, że punkty końcowe są wymienione w łańcuchu połączenia! Widzę, że masz bloga na platformie Azure. Przechodzę teraz przez Twój artykuł na temat HTML5 i przesyłanie fragmentów na Azure, świetne rzeczy. – Gary

4

Wymyśliłem to !! Lub więcej odpowiednio znalazłem odpowiedź tutaj: https://stackoverflow.com/a/17500876/1400153

W kodzie napisałem powyżej, zmieniłem linie

// Retrieve storage account from connection string 
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["EmulatorStorageConnectionString"]); 

do

var connectionString = "UseDevelopmentStorage=true"; 
var storageAccount = CloudStorageAccount.Parse(connectionString); 

To jest dosłownie jedyna zmiana zrobiłem do kod.

Ponadto ja kliknięciu prawym przyciskiem myszy ikonę emulatora na pasku zadań Windows> Pokaż przechowywania emulatora UI i kliknąłem przycisk Reset. Nie jestem pewien, czy to pomogło, po prostu dokumentuję dwie rzeczy, które zrobiłem dla następnego faceta, który utknął w tym.

A teraz to działa ...

Szczerze mówiąc jestem trochę zły, że oryginalny kod nie działa.Po tym wszystkim, artykuł MSDN przez Microsoft (http://msdn.microsoft.com/en-us/library/windowsazure/hh403989.aspx) wyraźnie stwierdza, powinniśmy używać: imię

konta: devstoreaccount1 klucz konta: Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw ==

Więc dlaczego do cholery to się nie działa? Artykuł został zaktualizowany w lipcu 2012 roku, więc nie jest dokładnie nieaktualny. Tyle godzin zmarnowany ... ale przynajmniej mogę iść teraz spać wiedząc, że wreszcie coś pracy :)

0

Jak wspomniano we wcześniejszych postach, nie używaj konta "devstoreaccount1" do łączenia się z emulatorem pamięci Azure. Zamiast tego używaj tylko "" UseDevelopmentStorage = true "" jako łańcucha połączenia i dołączonego DB zamiast nazwy "devstoreaccount1".

Kompletny przykład: W config:

add name ="ConnString" connectionString="UseDevelopmentStorage=true" 
..... 

W kodzie:

string connStr = ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;    
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connStr); 

teraz połączyć z kontem devStorage albo Storage Explorer lub przez Server Explorer (VSTS) i monitorować operacje DB.

0
container.SetPermissions(
        new BlobContainerPermissions 
        { 
         PublicAccess = 
          BlobContainerPublicAccessType.Blob 
        }); 

Po inicjalizacji połączenia. Najpierw jednak użyj klienta do magazynu i zmień zezwolenie kontenera za pomocą klienta.

pracuje dla mnie;)

0

prostu zobaczyłem to z WindowsAzure.Storage 8.6.0. Śledziłem this issue „s komentarze i poprawka, która pracowała dla mnie jest to, aby dodać następujące ExcludeComponentCorrelationHttpHeadersOnDomains w ApplicationInsights.config:

<Add>localhost</Add> 
<Add>127.0.0.1</Add> 

Wydaje się jakby w pewnym momencie regresji został wprowadzony, który powoduje AI modyfikować nagłówki żądania do emulator powodujący błąd 403 Forbidden.

Powiązane problemy