Udostępnij za pośrednictwem


Dodatek: Poprawka przykładowej aplikacji (tworzenie aplikacji w chmurze Real-World za pomocą platformy Azure)

Autor: Rick Anderson, Tom Dykstra

Pobierz projekt naprawy

Książka elektroniczna Building Real World Cloud Apps with Azure (Tworzenie rzeczywistych aplikacji w chmurze za pomocą usługi Azure ) opiera się na prezentacji opracowanej przez Scotta Guthrie'ego. Wyjaśniono w nim 13 wzorców i praktyk, które mogą pomóc w pomyślnym tworzeniu aplikacji internetowych dla chmury. Aby uzyskać informacje o książce elektronicznej, zobacz pierwszy rozdział.

Ten dodatek do artykułu Building Real World Cloud Apps with Azure e-book zawiera następujące sekcje, które zawierają dodatkowe informacje o przykładowej aplikacji Fix It, którą można pobrać:

Znane problemy

Aplikacja Fix It została pierwotnie opracowana, aby zilustrować jak najprościej niektóre wzorce przedstawione w tej książce elektronicznej. Jednak ponieważ książka elektroniczna dotyczy tworzenia rzeczywistych aplikacji, poddaliśmy kod Fix It procesowi przeglądu i testowania podobnego do tego, co zrobilibyśmy dla wydanego oprogramowania. Znaleźliśmy wiele problemów, a podobnie jak w przypadku każdej rzeczywistej aplikacji, niektóre z nich rozwiązaliśmy, a niektóre z nich odroczyły się na późniejszą wersję.

Poniższa lista zawiera problemy, które należy rozwiązać w aplikacji produkcyjnej, ale z jednego lub innego powodu postanowiliśmy nie rozwiązać w początkowej wersji przykładowej aplikacji Fix It.

Zabezpieczenia

  • Upewnij się, że nie możesz przypisać zadania do nieistniejącego właściciela.
  • Upewnij się, że możesz wyświetlać i modyfikować tylko utworzone lub przypisane do Ciebie zadania.
  • Użyj protokołu HTTPS na potrzeby stron logowania i plików cookie uwierzytelniania.
  • Określ limit czasu dla plików cookie uwierzytelniania.

Walidacja danych wejściowych

Ogólnie rzecz biorąc, aplikacja produkcyjna będzie wykonywać większą weryfikację danych wejściowych niż aplikacja Fix It. Na przykład rozmiar obrazu/rozmiar pliku obrazu dozwolony do przekazywania powinien być ograniczony.

Funkcje administratora

Administrator powinien mieć możliwość zmiany własności istniejących zadań. Na przykład twórca zadania może opuścić firmę, pozostawiając nikogo z uprawnieniami do utrzymania zadania, chyba że jest włączony dostęp administracyjny.

Przetwarzanie komunikatów w kolejce

Przetwarzanie komunikatów w kolejce w aplikacji Fix It zostało zaprojektowane tak, aby było proste w celu zilustrowania wzorca pracy skoncentrowanego na kolejce z minimalną ilością kodu. Ten prosty kod nie byłby odpowiedni dla rzeczywistej aplikacji produkcyjnej.

  • Kod nie gwarantuje, że każdy komunikat kolejki będzie przetwarzany co najwyżej raz. Po otrzymaniu komunikatu z kolejki występuje limit czasu, w którym komunikat jest niewidoczny dla innych odbiorników kolejki. Jeśli limit czasu wygaśnie przed usunięciem wiadomości, komunikat stanie się ponownie widoczny. W związku z tym jeśli wystąpienie roli procesu roboczego spędza długi czas na przetwarzaniu komunikatu, teoretycznie jest możliwe, aby ten sam komunikat był przetwarzany dwa razy, co spowodowało zduplikowane zadanie w bazie danych. Aby uzyskać więcej informacji na temat tego problemu, zobacz Korzystanie z kolejek usługi Azure Storage.
  • Logika sondowania w kolejce może być bardziej opłacalna dzięki pobieraniu komunikatów wsadowych. Za każdym razem, gdy wywołujesz metodę CloudQueue.GetMessageAsync, jest koszt transakcji. Zamiast tego możesz wywołać metodę CloudQueue.GetMessagesAsync (zwróć uwagę na liczbę mnogą "s"), która pobiera wiele komunikatów w jednej transakcji. Koszty transakcji dla kolejek usługi Azure Storage są bardzo niskie, więc wpływ na koszty nie jest istotny w większości scenariuszy.
  • Ścisła pętla w kodzie przetwarzania komunikatów w kolejce powoduje koligację procesora CPU, która nie korzysta wydajnie z wielordzeniowych maszyn wirtualnych. Lepszy projekt będzie używać równoległości zadań do równoległego uruchamiania kilku zadań asynchronicznych.
  • Przetwarzanie komunikatów w kolejce ma tylko podstawową obsługę wyjątków. Na przykład kod nie obsługuje zatrutych komunikatów. (Gdy przetwarzanie komunikatów powoduje wyjątek, musisz zarejestrować błąd i usunąć komunikat lub rola procesu roboczego spróbuje przetworzyć go ponownie, a pętla będzie kontynuowana na czas nieokreślony).

Zapytania SQL są niezwiązane

Bieżąca poprawka kodu nie ogranicza liczby wierszy zwracanych przez zapytania dotyczące stron indeksu. Jeśli do bazy danych zostanie wprowadzona duża liczba zadań, rozmiar odebranych list może spowodować problemy z wydajnością. Rozwiązaniem jest zaimplementowanie stronicowania. Aby zapoznać się z przykładem, zobacz Sortowanie, filtrowanie i stronicowanie za pomocą platformy Entity Framework w aplikacji ASP.NET MVC.

Aplikacja Fix It używa klasy jednostki FixItTask do przekazywania informacji między kontrolerem a widokiem. Najlepszym rozwiązaniem jest użycie modeli widoku. Model domeny (np. klasa jednostki FixItTask) jest zaprojektowany wokół tego, co jest potrzebne do trwałości danych, podczas gdy model widoku może być przeznaczony do prezentacji danych.

Aplikacja Fix It przechowuje przekazane obrazy jako publiczne, co oznacza, że każdy, kto znajdzie adres URL, może uzyskać dostęp do obrazów. Obrazy mogą być zabezpieczone zamiast publiczne.

Brak skryptów automatyzacji programu PowerShell dla kolejek

Przykładowe skrypty automatyzacji programu PowerShell zostały napisane tylko dla podstawowej wersji poprawki, która działa całkowicie w Azure App Service Web Apps. Nie udostępniliśmy skryptów do konfigurowania i wdrażania w aplikacji internetowej oraz środowiska usługi w chmurze wymaganego do przetwarzania kolejek.

Specjalna obsługa kodów HTML w danych wejściowych użytkownika

ASP.NET automatycznie zapobiega wielu sposobom, na które złośliwi użytkownicy mogą próbować ataków skryptowych między witrynami, wprowadzając skrypt w polach tekstowych wejściowych użytkownika. A pomocnik MVC DisplayFor używany do wyświetlania tytułów zadań i notatek automatycznie koduje wartości HTML wysyłane do przeglądarki. Jednak w aplikacji produkcyjnej warto podjąć dodatkowe środki. Aby uzyskać więcej informacji, zobacz Sprawdzanie poprawności żądania w ASP.NET.

Najlepsze rozwiązania

Poniżej przedstawiono niektóre problemy, które zostały rozwiązane po odnalezieniu w przeglądzie kodu i testowaniu oryginalnej wersji aplikacji Fix It. Niektóre z nich były spowodowane tym, że oryginalny koder nie zna konkretnego najlepszego rozwiązania, niektóre po prostu dlatego, że kod został napisany szybko i nie był przeznaczony do wydania oprogramowania. W tym miejscu wymieniono problemy, jeśli istnieje coś, czego dowiedzieliśmy się z tej recenzji i testowania, które mogą być przydatne dla innych osób, które również opracowują aplikacje internetowe.

Usuwanie repozytorium bazy danych

Klasa FixItTaskRepository musi usunąć wystąpienie programu Entity Framework DbContext . Zrobiliśmy to, implementując IDisposable w FixItTaskRepository klasie:

public class FixItTaskRepository : IFixItTaskRepository, IDisposable
{
    private MyFixItContext db = new MyFixItContext();

    // other code not shown

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            // Free managed resources.
            if (db != null)
            {
                db.Dispose();
                db = null;
            }
        }
    }
}

Należy pamiętać, że funkcja AutoFac automatycznie usunie FixItTaskRepository wystąpienie, więc nie musimy jawnie go usuwać.

Inną opcją jest usunięcie zmiennej DbContext składowej z FixItTaskRepositorymetody , a zamiast tego utworzenie zmiennej lokalnej DbContext w ramach każdej metody repozytorium wewnątrz using instrukcji. Na przykład:

// Alternate way to dispose the DbContext
using (var db = new MyFixItContext())
{
    fixItTask = await db.FixItTasks.FindAsync(id);
}

Rejestrowanie pojedynczychtonów, takich jak di

Ponieważ potrzebne jest tylko jedno wystąpienie PhotoService klasy i Logger klasy, te klasy powinny być zarejestrowane jako pojedyncze wystąpienia iniekcji zależności w pliku DependenciesConfig.cs:

builder.RegisterType<Logger>().As<ILogger>().SingleInstance();
builder.RegisterType<FixItTaskRepository>().As<IFixItTaskRepository>();
builder.RegisterType<PhotoService>().As<IPhotoService>().SingleInstance();

Zabezpieczenia: nie pokazuj szczegółów błędów dla użytkowników

Oryginalna aplikacja Fix It nie ma ogólnej strony błędu i po prostu pozwól wszystkim wyjątkom bąbelkować do interfejsu użytkownika, więc niektóre wyjątki, takie jak błędy połączenia z bazą danych, mogą spowodować wyświetlenie pełnego śledzenia stosu w przeglądarce. Szczegółowe informacje o błędach mogą czasami ułatwiać ataki złośliwych użytkowników. Rozwiązaniem jest zarejestrowanie szczegółów wyjątku i wyświetlenie strony błędu użytkownikowi, który nie zawiera szczegółów błędu. Aplikacja Fix It została już rejestrowanie, a aby wyświetlić stronę błędu, dodaliśmy <customErrors mode=On> ją do pliku Web.config.

<system.web>
  <customErrors mode="On"/>
  <authentication mode="None" />
  <compilation debug="true" targetFramework="4.5" />
  <httpRuntime targetFramework="4.5" />
</system.web>

Domyślnie powoduje to wyświetlenie pliku Views\Shared\Error.cshtml pod kątem błędów. Możesz dostosować plik Error.cshtml lub utworzyć własny widok strony błędu i dodać defaultRedirect atrybut. Możesz również określić różne strony błędów pod kątem określonych błędów.

Zabezpieczenia: zezwalaj na edycję zadania tylko przez jego twórcę

Na stronie Indeks pulpitu nawigacyjnego są wyświetlane tylko zadania utworzone przez zalogowanego użytkownika, ale złośliwy użytkownik może utworzyć adres URL z identyfikatorem zadania innego użytkownika. Dodaliśmy kod w pliku DashboardController.cs , aby zwrócić wartość 404 w tym przypadku:

public async Task<ActionResult> Edit(int id)
{
    FixItTask fixittask = await fixItRepository.FindTaskByIdAsync(id);
    if (fixittask == null)
    {
        return HttpNotFound();
    }

    // Verify logged in user owns this FixIt task.
    if (User.Identity.Name != fixittask.Owner)
    {
       return HttpNotFound();
    }

    return View(fixittask);
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit(int id, [Bind(Include = "CreatedBy,Owner,Title,Notes,PhotoUrl,IsDone")]FormCollection form)
{
    FixItTask fixittask = await fixItRepository.FindTaskByIdAsync(id);

    // Verify logged in user owns this FixIt task.
    if (User.Identity.Name != fixittask.Owner)
    {
       return HttpNotFound();
    }

    if (TryUpdateModel(fixittask, form))
    {
        await fixItRepository.UpdateAsync(fixittask);
        return RedirectToAction("Index");
    }

    return View(fixittask);
}

Nie połykaj wyjątków

Oryginalna aplikacja Fix It właśnie zwróciła wartość null po zalogowaniu wyjątku, który wynika z zapytania SQL:

catch (Exception e)
{
    log.Error(e, "Error in FixItTaskRepository.FindTasksByOwnerAsync(userName={0})", userName);
    return null;
}

Spowoduje to, że będzie wyglądać na użytkownika tak, jakby zapytanie zakończyło się pomyślnie, ale po prostu nie zwróciło żadnych wierszy. Rozwiązaniem jest ponowne zgłoszenie wyjątku po przechwyceniu i rejestrowaniu:

catch (Exception e)
{
    log.Error(e, "Error in FixItTaskRepository.FindTasksByCreatorAsync(creater={0})", creator);
    throw;
}

Przechwyć wszystkie wyjątki w rolach procesów roboczych

Wszelkie nieobsługiwane wyjątki w roli procesu roboczego spowodują ponowne przetworzenie maszyny wirtualnej, więc chcesz owinąć wszystko, co robisz w bloku try-catch i obsłużyć wszystkie wyjątki.

Określanie długości właściwości ciągu w klasach jednostek

Aby wyświetlić prosty kod, oryginalna wersja aplikacji Fix It nie określiła długości pól jednostki FixItTask, a w rezultacie zostały zdefiniowane jako varchar(max) w bazie danych. W związku z tym interfejs użytkownika akceptuje niemal dowolną ilość danych wejściowych. Określanie długości określa limity, które mają zastosowanie zarówno do danych wejściowych użytkownika na stronie internetowej, jak i do rozmiaru kolumny w bazie danych:

public class FixItTask
{
    public int FixItTaskId  { get; set; }
    [StringLength(80)]
    public string CreatedBy { get; set; }
    [Required]
    [StringLength(80)]
    public string Owner { get; set; }
    [Required]
    [StringLength(80)]
    public string Title { get; set; }
    [StringLength(1000)]
    public string Notes { get; set; }
    [StringLength(200)]
    public string PhotoUrl { get; set; }
    public bool IsDone      { get; set; }  
}

Oznaczanie prywatnych członków jako readonly, gdy nie oczekuje się zmiany

Na przykład w DashboardController klasie wystąpienie FixItTaskRepository klasy jest tworzone i nie oczekuje się zmiany, więc zdefiniowaliśmy je jako tylko do odczytu.

public class DashboardController : Controller
    {
        private readonly IFixItTaskRepository fixItRepository = null;

Użyj listy. Any() zamiast listy. Count() > 0

Jeśli wszystko zależy Ci na tym, czy jeden lub więcej elementów na liście pasuje do określonych kryteriów, użyj metody Any , ponieważ zwraca ona natychmiast po znalezieniu elementu spełniającego kryteria, podczas gdy Count metoda zawsze musi iterować po każdym elemencie. Plik Dashboard Index.cshtml pierwotnie miał następujący kod:

@if (Model.Count() == 0) {
    <br />
    <div>You don't have anything currently assigned to you!!!</div>
}

Zmieniliśmy ją na następującą:

@if (!Model.Any()) {
    <br />
    <div>You don't have anything currently assigned to you!!!</div>
}

Generowanie adresów URL w widokach MVC przy użyciu pomocników MVC

W przypadku przycisku Utwórz poprawkę na stronie głównej aplikacja Fix It trwale koduje element kotwicy:

<a href="/Tasks/Create" class="btn btn-primary btn-large">Create a New FixIt &raquo;</a>

W przypadku linków Widok/Akcja, takich jak ten, lepiej użyć pomocnika URL.Action HTML, na przykład:

@Url.Action("Create","Tasks")

Używanie elementu Task.Delay zamiast Thread.Sleep w roli procesu roboczego

Nowy szablon projektu umieszcza Thread.Sleep przykładowy kod dla roli procesu roboczego, ale spowodowanie uśpienia wątku może spowodować, że pula wątków zduplikuje dodatkowe niepotrzebne wątki. Zamiast tego można tego uniknąć, używając funkcji Task.Delay .

while (true)
{
    try
    {
        await queueManager.ProcessMessagesAsync();
    }
    catch (Exception ex)
    {
        logger.Error(ex, "Exception in worker role Run loop.");
    }
    await Task.Delay(1000);
}

Unikanie asynchronicznego unieważnienia

Jeśli metoda asynchroniczna nie musi zwracać wartości, zwraca typ Task , a nie void.

Ten przykład pochodzi z FixItQueueManager klasy :

// Correct
public async Task SendMessageAsync(FixItTask fixIt) { ... }

// Incorrect
public async void SendMessageAsync(FixItTask fixIt) { ... }

Należy używać async void tylko w przypadku procedur obsługi zdarzeń najwyższego poziomu. Jeśli zdefiniujesz metodę jako async void, obiekt wywołujący nie może oczekiwać na metodę ani przechwycić żadnych wyjątków zgłaszanych przez metodę. Aby uzyskać więcej informacji, zobacz Najlepsze rozwiązania w programowaniu asynchronicznym.

Używanie tokenu anulowania w celu przerwania pętli roli procesu roboczego

Zazwyczaj metoda Run w roli procesu roboczego zawiera nieskończoną pętlę. Po zatrzymaniu roli procesu roboczego wywoływana jest metoda RoleEntryPoint.OnStop . Użyj tej metody, aby anulować pracę wykonywaną wewnątrz metody Run i bezpiecznie zakończyć działanie. W przeciwnym razie proces może zostać zakończony w trakcie operacji.

Rezygnacja z automatycznej procedury wąchania MIME

W niektórych przypadkach program Internet Explorer zgłasza typ MIME inny niż typ określony przez serwer internetowy. Jeśli na przykład program Internet Explorer znajdzie zawartość HTML w pliku dostarczonym z nagłówkiem odpowiedź HTTP Content-Type: text/plain, program Internet Explorer ustali, że zawartość powinna być renderowana jako HTML. Niestety, ten komunikat "MIME-sniffing" może również prowadzić do problemów z zabezpieczeniami serwerów hostujących niezaufaną zawartość. Aby rozwiązać ten problem, program Internet Explorer 8 wprowadził szereg zmian w kodzie określania typu MIME i umożliwia deweloperom aplikacji rezygnację z wąchania MIME. Następujący kod został dodany do pliku Web.config .

<system.webServer>
     <httpProtocol>
        <customHeaders>
           <add name="X-Content-Type-Options" value="nosniff"/>
        </customHeaders>
     </httpProtocol>
     <modules>
      <remove name="FormsAuthenticationModule" />
    </modules>
  </system.webServer>

Włączanie łączenia i minimalizowania

Gdy program Visual Studio tworzy nowy projekt internetowy, tworzenie pakietów i minimalizowanie plików JavaScript nie jest domyślnie włączone. Dodaliśmy wiersz kodu w pliku BundleConfig.cs:

// For more information on bundling, visit https://go.microsoft.com/fwlink/?LinkId=301862
public static void RegisterBundles(BundleCollection bundles)
{
    bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                "~/Scripts/jquery-{version}.js"));
 
   // Code removed for brevity/
 
   BundleTable.EnableOptimizations = true;
}

Ustawianie limitu czasu wygaśnięcia dla plików cookie uwierzytelniania

Domyślnie pliki cookie uwierzytelniania wygasają za dwa tygodnie. Krótszy czas jest bezpieczniejszy. To ustawienie można zmienić w pliku StartupAuth.cs:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    ExpireTimeSpan = System.TimeSpan.FromMinutes(20)
});

Jak uruchomić aplikację z poziomu programu Visual Studio na komputerze lokalnym

Istnieją dwa sposoby uruchamiania aplikacji Fix It:

  • Uruchom aplikację podstawową, która zapisuje nowe zadania bezpośrednio w bazie danych SQL.
  • Uruchom aplikację przy użyciu kolejki oraz usługi zaplecza, aby utworzyć zadania podrzędne. Wzorzec kolejki został opisany w rozdziale Wzorzec pracy skoncentrowany na kolejkach.

Uruchamianie aplikacji podstawowej

  1. Zainstaluj program Visual Studio 2017.
  2. Zainstaluj zestaw Azure SDK dla platformy .NET dla programu Visual Studio.
  3. Pobierz plik .zip z galerii kodu MSDN.
  4. W Eksplorator plików kliknij prawym przyciskiem myszy plik .zip, a następnie kliknij polecenie Właściwości, a następnie w okno Właściwości kliknij przycisk Odblokuj.
  5. Rozpakuj plik.
  6. Kliknij dwukrotnie plik sln, aby uruchomić program Visual Studio.
  7. W menu Narzędzia kliknij pozycję Menedżer pakietów NuGet, a następnie pozycję Konsola menedżera pakietów.
  8. W konsoli menedżera pakietów (PMC) kliknij przycisk Przywróć.
  9. Zamknij program Visual Studio.
  10. Uruchom emulator usługi Azure Storage.
  11. Uruchom ponownie program Visual Studio, otwierając plik rozwiązania zamknięty w poprzednim kroku.
  12. Upewnij się, że projekt FixIt został ustawiony jako projekt startowy, a następnie naciśnij klawisze CTRL+F5, aby uruchomić projekt.

Uruchamianie aplikacji z przetwarzaniem kolejek

  1. Postępuj zgodnie z instrukcjami dotyczącymi uruchamiania aplikacji podstawowej, a następnie zamknij przeglądarkę i zamknij program Visual Studio.

  2. Uruchom program Visual Studio z uprawnieniami administratora. (Będziesz używać emulatora usługi Azure Compute i wymaga to uprawnień administratora).

  3. W pliku Web.config aplikacji w projekcie MyFixIt (projekt internetowy) zmień wartość appSettings/UseQueues na "true":

    <appSettings>
        <!-- Other settings not shown -->
        <add key="UseQueues" value="true"/>
    </appSettings>
    
  4. Jeśli emulator usługi Azure Storage nie jest jeszcze uruchomiony, uruchom go ponownie.

  5. Uruchom jednocześnie projekt internetowy FixIt i projekt MyFixItCloudService.

    Korzystanie z programu Visual Studio:

    1. Naciśnij klawisz F5 , aby uruchomić projekt FixIt.
    2. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt MyFixItCloudService, a następnie kliknij polecenie Debuguj>uruchom nowe wystąpienie.

    Korzystanie z Visual Studio 2013 Express for Web:

    1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy rozwiązanie FixIt i wybierz pozycję Właściwości.

    2. Wybierz pozycję Wiele projektów startowych.

    3. Na liście rozwijanej Akcja w obszarze MyFixIt i MyFixItCloudService wybierz pozycję Uruchom.

    4. Kliknij przycisk OK.

    5. Naciśnij klawisz F5, aby uruchomić oba projekty.

      Po uruchomieniu projektu MyFixItCloudService program Visual Studio uruchamia emulator usługi Azure Compute. W zależności od konfiguracji zapory może być konieczne zezwolenie emulatorowi przez zaporę.

Jak wdrożyć aplikację podstawową w celu Azure App Service Web Apps przy użyciu skryptów Windows PowerShell

Aby zilustrować wzorzec automatyzowania wszystkiego , aplikacja Fix It jest dostarczana ze skryptami, które konfigurują środowisko na platformie Azure i wdrażają projekt w nowym środowisku. Poniższe instrukcje wyjaśniają sposób używania skryptów.

Jeśli chcesz uruchomić na platformie Azure bez używania kolejek i wprowadzono zmiany w celu uruchamiania lokalnego z kolejkami, przed wykonaniem poniższych instrukcji upewnij się, że ustawiono wartość UseQueues appSetting z powrotem na false.

W tych instrukcjach założono, że już pobrano i uruchomiono rozwiązanie Fix It lokalnie oraz że masz konto platformy Azure lub masz subskrypcję platformy Azure, którą masz uprawnienia do zarządzania.

  1. Zainstaluj konsolę Azure PowerShell. Aby uzyskać instrukcje, zobacz How to install and configure Azure PowerShell (Jak zainstalować i skonfigurować Azure PowerShell).

    Ta niestandardowa konsola jest skonfigurowana do pracy z subskrypcją platformy Azure. Moduł platformy Azure jest instalowany w katalogu Program Files i jest automatycznie importowany przy każdym użyciu konsoli Azure PowerShell.

    Jeśli wolisz pracować w innym programie hosta, takim jak Windows PowerShell ISE, pamiętaj, aby zaimportować moduł Platformy Azure za pomocą polecenia cmdlet Import-Module lub użyć polecenia w module platformy Azure, aby wyzwolić automatyczne importowanie modułu.

  2. Uruchom Azure PowerShell z opcją Uruchom jako administrator.

  3. Uruchom polecenie cmdlet Set-ExecutionPolicy, aby ustawić zasady wykonywania Azure PowerShell na RemoteSignedwartość . Wprowadź wartość Y (w polu Tak), aby ukończyć zmianę zasad.

    PS C:\> Set-ExecutionPolicy RemoteSigned
    

    To ustawienie umożliwia uruchamianie skryptów lokalnych, które nie są podpisane cyfrowo. (Można również ustawić zasady wykonywania na Unrestricted, co eliminuje konieczność odblokowania kroku później, ale nie jest to zalecane ze względów bezpieczeństwa).

  4. Uruchom polecenie cmdlet , Add-AzureAccount aby skonfigurować program PowerShell przy użyciu poświadczeń dla konta.

    PS C:\> Add-AzureAccount
    

    Te poświadczenia wygasają po upływie czasu i musisz ponownie uruchomić Add-AzureAccount polecenie cmdlet. Ponieważ ta książka elektroniczna jest zapisywana, limit czasu przed wygaśnięciem poświadczeń wynosi 12 godzin.

  5. Jeśli masz wiele subskrypcji, użyj polecenia cmdlet Select-AzureSubscription, aby określić subskrypcję, w której chcesz utworzyć środowisko testowe.

  6. Zaimportuj certyfikat zarządzania dla tej samej subskrypcji platformy Azure przy użyciu Get-AzurePublishSettingsFile poleceń cmdlet i Import-AzurePublishSettingsFile . Pierwsze z tych poleceń cmdlet pobiera plik certyfikatu, a w drugim określisz lokalizację tego pliku, aby go zaimportować. > [! WAŻNE]

    Zachowaj pobrany plik w bezpiecznej lokalizacji lub usuń go po zakończeniu pracy, ponieważ zawiera certyfikat, którego można użyć do zarządzania usługami platformy Azure.

    PS C:\Users\username\Documents\Visual Studio 2013\Projects\MyFixIt\Automation> Get-AzurePublishSettingsFile
    PS C:\Users\username\Documents\Visual Studio 2013\Projects\MyFixIt\Automation> Import-AzurePublishSettingsFile "C:\Users
    \username\Downloads\Azure MSDN - Visual Studio Ultimate-12-14-2013-credentials.publishsettings"
    

    Certyfikat jest używany do wywołania interfejsu API REST, które wykrywa adres IP maszyny deweloperskiej w celu ustawienia reguły zapory na serwerze SQL Database.

  7. Uruchom polecenie cmdlet Set-Location (aliasy to cd, chdiri sl), aby przejść do katalogu zawierającego skrypty. (Znajdują się one w folderze automation w folderze Fix It solution). Umieść ścieżkę w cudzysłowie, jeśli którakolwiek z nazw katalogów zawiera spacje. Aby na przykład przejść do c:\Sample Apps\FixIt\Automation katalogu, możesz wprowadzić następujące polecenie:

    PS C:\> cd "c:\Sample Apps\MyFixIt\Automation"
    
  8. Aby umożliwić Windows PowerShell uruchamianie tych skryptów, użyj polecenia cmdlet Unblock-File. (Skrypty są zablokowane, ponieważ zostały pobrane z Internetu).

    Ostrzeżenie

    Zabezpieczenia — przed uruchomieniem Unblock-File dowolnego skryptu lub pliku wykonywalnego otwórz plik w Notatniku, sprawdź polecenia i sprawdź, czy nie zawierają żadnego złośliwego kodu.

    Na przykład następujące polecenie uruchamia Unblock-File polecenie cmdlet we wszystkich skryptach w bieżącym katalogu.

    PS C:\Sample Apps\FixIt\Automation> Unblock-File -Path .\*.ps1
    
  9. Aby utworzyć aplikację internetową dla podstawowej (bez przetwarzania kolejek) Napraw aplikację It, uruchom skrypt tworzenia środowiska.

    Wymagany Name parametr określa nazwę bazy danych i jest również używany dla konta magazynu tworzonego przez skrypt. Nazwa musi być globalnie unikatowa w domenie azurewebsites.net. Jeśli określisz nazwę, która nie jest unikatowa, na przykład Fixit lub Test (a nawet jak w przykładzie fixitdemo), New-AzureWebsite polecenie cmdlet kończy się niepowodzeniem z błędem wewnętrznym zgłaszanym konfliktem. Skrypt konwertuje nazwę na wszystkie małe litery, aby spełnić wymagania dotyczące nazw aplikacji internetowych, kont magazynu i baz danych.

    Wymagany SqlDatabasePassword parametr określa hasło dla konta administratora, które zostanie utworzone dla SQL Database. Nie dołączaj specjalnych znaków XML w haśle (& ;) <> . Jest to ograniczenie sposobu pisania skryptów, a nie ograniczenia platformy Azure.

    Jeśli na przykład chcesz utworzyć aplikację internetową o nazwie "fixitdemo" i użyć hasła administratora SQL Server "Passw0rd1", możesz wprowadzić następujące polecenie:

    PS C:\Sample Apps\FixIt\Automation> .\New-AzureWebsiteEnv.ps1 -Name 
    fixitdemo <required params here>
    

    Nazwa musi być unikatowa w domenie azurewebsites.net, a hasło musi spełniać SQL Database wymagania dotyczące złożoności hasła. (Przykład Passw0rd1 spełnia wymagania).

    Należy pamiętać, że polecenie zaczyna się od ".". Aby zapobiec złośliwemu wykonywaniu skryptów, Windows PowerShell wymaga podania w pełni kwalifikowanej ścieżki do pliku skryptu podczas uruchamiania skryptu. Możesz użyć kropki, aby wskazać bieżący katalog (".") lub podać w pełni kwalifikowaną ścieżkę, na przykład:

    PS C:\Temp\FixIt\Automation> C:\Temp\FixIt\Automation\New-AzureWebsiteEnv.ps1 -Name fixitdemo -SqlDatabasePassword Pas$w0rd
    

    Aby uzyskać więcej informacji na temat skryptu, użyj Get-Help polecenia cmdlet .

    PS C:\Sample Apps\FixIt\Automation> Get-Help -Full .\New-AzureWebsiteEnv.ps1
    

    Możesz użyć Detailedparametrów , Full, Parametersi Examples polecenia cmdlet Get-Help, aby odfiltrować zwróconą pomoc.

    Jeśli skrypt zakończy się niepowodzeniem lub generuje błędy, takie jak "New-AzureWebsite: Wywołaj Set-AzureSubscription i Select-AzureSubscription najpierw", być może nie ukończono konfiguracji Azure PowerShell.

    Po zakończeniu działania skryptu możesz użyć portalu zarządzania Azure, aby wyświetlić utworzone zasoby, jak pokazano w rozdziale Automatyzowanie wszystkiego .

  10. Aby wdrożyć projekt FixIt w nowym środowisku platformy Azure, użyj skryptuAzureWebsite.ps1 . Na przykład:

    PS C:\Sample Apps\FixIt\Automation> .\Publish-AzureWebsite.ps1 ..\MyFixIt\MyFixIt.csproj -Launch
    

    Po zakończeniu wdrażania zostanie otwarta przeglądarka z uruchomioną poprawką uruchomioną na platformie Azure.

Rozwiązywanie problemów ze skryptami Windows PowerShell

Najczęstsze błędy występujące podczas uruchamiania tych skryptów są związane z uprawnieniami. Upewnij się, że Add-AzureAccount i Import-AzurePublishSettingsFile że zostały one pomyślnie użyte dla tej samej subskrypcji platformy Azure. Nawet jeśli Add-AzureAccount operacja zakończyła się pomyślnie, może być konieczne ponowne uruchomienie. Uprawnienia dodane przez Add-AzureAccount wygaśnięcie w ciągu 12 godzin.

odwołanie obiektu nie zostało ustawione na wystąpienie obiektu.

Jeśli skrypt zwraca błędy, takie jak "Odwołanie do obiektu nie jest ustawione na wystąpienie obiektu", co oznacza, że Windows PowerShell nie może odnaleźć obiektu do przetworzenia (jest to wyjątek odwołania o wartości null), uruchom Add-AzureAccount polecenie cmdlet i spróbuj ponownie wykonać skrypt.

New-AzureSqlDatabaseServer : Object reference not set to an instance of an object.
At C:\ps-test\azure-powershell-samples-master\WebSite\create-azure-sql.ps1:80 char:19
+ $databaseServer = New-AzureSqlDatabaseServer -AdministratorLogin $UserName -Admi ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [New-AzureSqlDatabaseServer], NullReferenceException
    + FullyQualifiedErrorId : 
Microsoft.WindowsAzure.Commands.SqlDatabase.Server.Cmdlet.NewAzureSqlDatabaseServer

InternalError: serwer napotkał błąd wewnętrzny.

Polecenie New-AzureWebsite cmdlet zwraca błąd wewnętrzny, gdy nazwa nie jest unikatowa w domenie azurewebsites.net. Aby rozwiązać ten problem, użyj innej wartości nazwy, która znajduje się w parametrze Name New-AzureWebsiteEnv.ps1.

New-AzureWebsite : InternalError: The server encountered an internal error. 
Please retry the request.
At line:1 char:1
+ New-AzureWebsite -Name fixitdemo
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          
: CloseError: (:) [New-AzureWebsite], Exception
+ FullyQualifiedErrorId : 
Microsoft.WindowsAzure.Commands.Websites.NewAzureWebsiteCommand

Ponowne uruchamianie skryptu

Jeśli musisz ponownie uruchomić skrypt New-AzureWebsiteEnv.ps1 , ponieważ nie powiodło się, zanim wydrukował komunikat "Skrypt został ukończony", możesz usunąć zasoby utworzone przez skrypt, zanim został zatrzymany. Jeśli na przykład skrypt utworzył już aplikację internetową ContosoFixItDemo i ponownie uruchomisz skrypt o tej samej nazwie, skrypt zakończy się niepowodzeniem, ponieważ nazwa jest używana.

Aby określić zasoby utworzone przed zatrzymaniem skryptu, użyj następujących poleceń cmdlet:

  • Get-AzureWebsite
  • Get-AzureSqlDatabaseServer
  • Get-AzureSqlDatabase: Aby uruchomić to polecenie cmdlet, należy przekazać potok nazwy serwera bazy danych do Get-AzureSqlDatabase: Get-AzureSqlDatabaseServer | Get-AzureSqlDatabase.

Aby usunąć te zasoby, użyj następujących poleceń. Pamiętaj, że jeśli usuniesz serwer bazy danych, automatycznie usuniesz bazy danych skojarzone z serwerem.

  • Get-AzureWebsite -Name <WebsiteName> | Remove-AzureWebsite
  • Get-AzureSqlDatabase -Name <DatabaseName> -ServerName <DatabaseServerName> | Remove-SqlAzureDatabase
  • Get-AzureSqlDatabaseServer | Remove-AzureSqlDatabaseServer

Jak wdrożyć aplikację przy użyciu przetwarzania kolejek w celu Azure App Service Web Apps i usługi Azure Cloud Service

Aby włączyć kolejki, wprowadź następującą zmianę w pliku MyFixIt\Web.config. W obszarze appSettingszmień wartość na UseQueues "true":

<appSettings>
    <!-- Other settings not shown -->
    <add key="UseQueues" value="true"/>
</appSettings>

Następnie wdróż aplikację MVC w aplikacji internetowej w Azure App Service zgodnie z wcześniejszym opisem.

Następnie utwórz nową usługę w chmurze platformy Azure. Skrypty dołączone do aplikacji Fix It nie tworzą ani nie wdrażają usługi w chmurze, dlatego w tym celu należy użyć Azure Portal. W portalu kliknij pozycję Nowe -- obliczeniaszybkie tworzenieusługi -- w chmurze, a następnie wprowadź adres URL i lokalizację centrum danych. Użyj tego samego centrum danych, w którym wdrożono aplikację internetową.

Diagram przedstawiający witrynę Azure Cloud Service Portal i wiele kart z dostępnymi opcjami na potrzeby tworzenia nowego projektu usługi w chmurze platformy Azure

Przed wdrożeniem usługi w chmurze należy zaktualizować niektóre pliki konfiguracji.

W MyFixIt.WorkerRole\app.config w obszarze connectionStringszastąp wartość appdb parametry połączenia rzeczywistym parametry połączenia dla SQL Database. Możesz pobrać parametry połączenia z portalu. W portalu kliknij pozycję Sql Databases - appdb - View SQL Database parametry połączenia dla ADO .Net, ODBC, PHP i JDBC. Skopiuj ADO.NET parametry połączenia i wklej wartość do pliku app.config. Zastąp ciąg "{your_password_here}" hasłem bazy danych. (Zakładając, że skrypty zostały użyte do wdrożenia aplikacji MVC, określono hasło bazy danych w parametrze skryptu SqlDatabasePassword ).

Wynik powinien wyglądać następująco:

<add name="appdb" connectionString="Server=tcp:####.database.windows.net,1433;Database=appdb;User ID=####;Password=####;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;" providerName="System.Data.SqlClient" />

W tym samym pliku MyFixIt.WorkerRole\app.config w obszarze appSettingszastąp dwie wartości symboli zastępczych konta usługi Azure Storage.

<appSettings>
  <add key="StorageAccountName" value="{StorageAccountName}" />
  <add key="StorageAccountAccessKey" value="{StorageAccountAccessKey}" />
</appSettings>

Klucz dostępu można uzyskać z portalu. Zobacz Jak zarządzać kontami magazynu.

W pliku MyFixItCloudService\ServiceConfiguration.Cloud.cscfg zastąp te same dwa symbole zastępcze dla konta usługi Azure Storage.

<ConfigurationSettings>
    <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" 
             value="DefaultEndpointsProtocol=https;AccountName={StorageAccountName};AccountKey={StorageAccountAccessKey}" />
  </ConfigurationSettings>

Teraz możesz przystąpić do wdrażania usługi w chmurze. W obszarze Eksplorowanie rozwiązań kliknij prawym przyciskiem myszy projekt MyFixItCloudService i wybierz pozycję Publikuj. Aby uzyskać więcej informacji, zobacz "Deploy the Application to Azure" (Wdrażanie aplikacji na platformie Azure), która znajduje się w części 2 tego samouczka.