Quickstart: Azure Cache voor Redis met ASP.NET-web-app gebruiken

In deze snelstartgids gebruikt u Visual Studio 2019 om een ASP.NET-web-app die verbinding maakt met Azure Cache voor Redis om gegevens op te slaan en op te halen uit de cache. U kunt de app vervolgens in Azure App Service implementeren.

Ga naar de code op GitHub

Als u direct naar de code wilt gaan, bekijkt u de ASP.NET quickstart op GitHub.

Vereisten

Het Visual Studio-project maken

  1. Open Visual Studio en selecteer bestand > Nieuw > project.

  2. Ga als volgt te werk in het dialoogvenster Een nieuw project maken:

    Project maken

    a. Voer in het zoekvak C# in ASP.NET Web Application.

    b. Selecteer ASP.NET Web Application (.NET Framework).

    c. Selecteer Volgende.

  3. Geef in het vak Projectnaam het project een naam. In dit voorbeeld wordt de naam ContosoTeamStats gebruikt.

  4. Controleer of .NET Framework 4.6.1 of hoger is geselecteerd.

  5. Selecteer Maken.

  6. Selecteer MVC als het projecttype.

  7. Zorg ervoor dat Geen verificatie is opgegeven voor de instellingen bij Verificatie. Afhankelijk van uw versie van Visual Studio wijkt de standaardinstelling voor Verificatie mogelijk af. Als u dit wilt wijzigen, selecteert u Verificatie wijzigen en vervolgens Geen verificatie.

  8. Selecteer Maken om het project te maken.

Een cache maken

Maak vervolgens de cache voor de app.

  1. Als u een cache wilt maken, meldt u zich aan bij de Azure-portal en selecteert u Een resource maken.

    Een resource maken is gemarkeerd in het linkernavigatiedeelvenster.

  2. Selecteer op de pagina Nieuw de optie Databases en selecteer vervolgens Azure Cache voor Redis.

    In Nieuw is Databases gemarkeerd. Azure Cache voor Redis is ook gemarkeerd.

  3. Configureer op de pagina Nieuwe Redis-cache de instellingen voor de nieuwe cache.

    Instelling Voorgestelde waarde Beschrijving
    DNS-naam Geef een wereldwijd unieke naam op. De cachenaam is een tekenreeks van 1 tot 63 tekens die alleen cijfers, letters en afbreekstreepjes mag bevatten. De naam moet beginnen en eindigen met een cijfer of letter en mag geen opeenvolgende afbreekstreepjes bevatten. De hostnaam van uw cache-exemplaar wordt <DNS name>.redis.cache.windows.net.
    Abonnement Open de vervolgkeuzelijst en selecteer uw abonnement. Het abonnement waarmee dit nieuwe Azure Cache voor Redis-exemplaar wordt gemaakt.
    Resourcegroep Open de vervolgkeuzelijst en selecteer een resourcegroep of kies Nieuwe maken en geef een naam voor de nieuwe resourcegroep op. Naam voor de resourcegroep waarin de cache en andere resources moeten worden gemaakt. Door al uw app-resources in één resourcegroep te plaatsen, kunt u ze eenvoudig beheren of verwijderen.
    Locatie Open de vervolgkeuzelijst en selecteer een locatie. Selecteer een regio in de buurt van andere services die gaan gebruikmaken van de cache.
    Prijscategorie Open de vervolgkeuzelijst en selecteer een Prijscategorie. De prijscategorie bepaalt de grootte, prestaties en functies die beschikbaar zijn voor de cache. Zie het Azure Cache voor Redis-overzicht voor meer informatie.
  4. Selecteer het tabblad Netwerken of klik op de knop Netwerken onderaan de pagina.

  5. Selecteer uw verbindingsmethode op het tabblad Netwerk.

  6. Selecteer het tabblad Volgende: Geavanceerd of klik op de knop Volgende: Geavanceerd onderaan de pagina.

  7. Selecteer in het tabblad Geavanceerd voor een basic of standard cache-exemplaar de schakeloptie inschakelen als u een niet-TLS-poort wilt inschakelen. U kunt ook selecteren welke Redis-versie u wilt gebruiken: 4 of 6 (preview).

    Redis-versie 4 of 6.

  8. Configureer in het tabblad Geavanceerd voor premium cache-exemplaar de instellingen voor een niet-TLS-poort, clustering en gegevenspersistentie. U kunt ook selecteren welke Redis-versie u wilt gebruiken: 4 of 6 (preview).

  9. Selecteer het tabblad Volgende: Tags of klik op de knop Volgende: Tags onderaan de pagina.

  10. Voer desgewenst in het tabblad Tags de naam en waarde in om de resource te categoriseren.

  11. Selecteer Controleren + maken. Het tabblad Beoordelen + maken wordt weergegeven, waar uw configuratie wordt gevalideerd in Azure.

  12. Selecteer Maken nadat het groene bericht Validatie geslaagd verschijnt.

Het duurt even voor de cache is gemaakt. U kunt de voortgang bekijken op de overzichtspagina van Azure Cache voor Redis. Als u bij Status Wordt uitgevoerd ziet staan, kunt u de cache gebruiken.

Hostnaam, poorten en toegangssleutels ophalen uit Azure Portal

Cache-clients hebben de hostnaam, poorten en sleutels van de cache nodig om verbinding te maken met een Azure Cache for Redis-instantie. Sommige clients kunnen enigszins andere namen gebruiken om naar deze items te verwijzen. U kunt de hostnaam, poorten en toegangssleutels ophalen uit Azure Portal.

  • Als u de toegangssleutels wilt ophalen, selecteert u in de linkernavigatie van de cache de optie Toegangssleutels.

    Sleutels van Azure Cache voor Redis

  • Als u de hostnaam en poorten wilt ophalen, selecteert u in de linkernavigatie van de cache de optie Eigenschappen. De hostnaam heeft de indeling <DNS name>.redis.cache.windows.net.

    Eigenschappen van Azure Cache voor Redis

Het bestand CacheSecrets.config bewerken

  1. Maak op de computer een bestand met de naam CacheSecrets.config. Sla dit bestand op een locatie op waar het niet wordt ingecheckt met de broncode van de voorbeeldtoepassing. Voor deze snelstart bevindt het bestand CacheSecrets.config zich op C:\AppSecrets\CacheSecrets.config.

  2. Bewerk het bestand CacheSecrets.config. Voeg nu de volgende inhoud toe:

    <appSettings>
        <add key="CacheConnection" value="<cache-name>.redis.cache.windows.net,abortConnect=false,ssl=true,allowAdmin=true,password=<access-key>"/>
    </appSettings>
    
  3. Vervang <cache-name> door de hostnaam van uw cache.

  4. Vervang <access-key> door de primaire sleutel voor uw cache.

    Tip

    U kunt de secundaire toegangssleutel tijdens sleutelroulatie gebruiken als een alternatieve sleutel terwijl u de primaire toegangssleutel opnieuw genereert.

  5. Sla het bestand op.

De MVC-toepassing bijwerken

In deze sectie werkt u de toepassing bij voor de ondersteuning van een nieuwe weergave waarin een eenvoudige test wordt weergegeven op basis van Azure Cache voor Redis.

Het web.config-bestand bijwerken met een app-instelling voor de cache

Als u de toepassing lokaal uitvoert, wordt de informatie in CacheSecrets.config gebruikt om verbinding te maken met uw instantie van Azure Cache voor Redis. Later implementeert u deze toepassing in Azure. Op dat moment configureert u een app-instelling in Azure die in de toepassing wordt gebruikt om de cacheverbindingsinformatie op te halen in plaats van dit bestand.

Omdat het bestand CacheSecrets.config niet in Azure wordt geïmplementeerd met uw toepassing, gebruikt u het alleen tijdens het lokaal testen van de toepassing. Houd deze informatie zo veilig mogelijk om schadelijke toegang tot de gegevens in de cache te voorkomen.

Het bestand web.config bijwerken

  1. Dubbelklik in Solution Explorer op het bestand web.config om het te openen.

    Web.config

  2. Ga in het bestand web.config naar het element <appSetting>. Voeg vervolgens het volgende file-kenmerk toe. Als u een andere bestandsnaam of -locatie gebruikt, vervangt u deze waarden door de waarden die in het voorbeeld worden weergegeven.

  • Voor: <appSettings>
  • Na: <appSettings file="C:\AppSecrets\CacheSecrets.config">

De ASP.NET-runtime voegt de inhoud van het externe bestand samen met de opmaak van het element <appSettings>. Als het opgegeven bestand niet kan worden gevonden, negeert de runtime het bestandskenmerk. Uw geheimen (de verbindingsreeks naar uw cache) worden niet opgenomen in de broncode van de toepassing. Wanneer u de web-app implementeert in Azure, wordt het bestand CacheSecrets.config niet geïmplementeerd.

De toepassing configureren voor het gebruik van StackExchange.Redis

  1. Als u de app wilt configureren voor gebruik van het NuGet-pakket StackExchange.Redis voor Visual Studio, selecteert u Tools > NuGet Package Manager > Package Manager Console.

  2. Voer de volgende opdracht uit vanuit het venster Package Manager Console:

    Install-Package StackExchange.Redis
    
  3. Met het NuGet-pakket downloadt u de vereiste assembly-verwijzingen voor de clienttoepassing en voegt u deze toe om met de StackExchange.Azure Cache voor Redis-client toegang te krijgen tot Azure Cache voor Redis. Als u een versie met een sterke naam van de StackExchange.Redis-clientbibliotheek verkiest, installeert u het StackExchange.Redis.StrongName-pakket.

De HomeController en lay-out bijwerken

  1. Vouw in Solution Explorer de map Controllers uit en open vervolgens het bestand HomeController.cs.

  2. Voeg bovenaan using het bestand de volgende -instructies toe.

    using StackExchange.Redis;
    using System.Configuration;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading;
    
  3. Voeg de volgende leden toe aan de HomeController klasse ter ondersteuning van een nieuwe actie die enkele opdrachten op de nieuwe cache uit te RedisCache voeren.

    public ActionResult RedisCache()
    {
        ViewBag.Message = "A simple example with Azure Cache for Redis on ASP.NET.";
    
        IDatabase cache = GetDatabase();
    
        // Perform cache operations using the cache object...
    
        // Simple PING command
        ViewBag.command1 = "PING";
        ViewBag.command1Result = cache.Execute(ViewBag.command1).ToString();
    
        // Simple get and put of integral data types into the cache
        ViewBag.command2 = "GET Message";
        ViewBag.command2Result = cache.StringGet("Message").ToString();
    
        ViewBag.command3 = "SET Message \"Hello! The cache is working from ASP.NET!\"";
        ViewBag.command3Result = cache.StringSet("Message", "Hello! The cache is working from ASP.NET!").ToString();
    
        // Demonstrate "SET Message" executed as expected...
        ViewBag.command4 = "GET Message";
        ViewBag.command4Result = cache.StringGet("Message").ToString();
    
        // Get the client list, useful to see if connection list is growing...
        // Note that this requires allowAdmin=true in the connection string
        ViewBag.command5 = "CLIENT LIST";
        StringBuilder sb = new StringBuilder();
        var endpoint = (System.Net.DnsEndPoint)GetEndPoints()[0];
        IServer server = GetServer(endpoint.Host, endpoint.Port);
        ClientInfo[] clients = server.ClientList();
    
        sb.AppendLine("Cache response :");
        foreach (ClientInfo client in clients)
        {
            sb.AppendLine(client.Raw);
        }
    
        ViewBag.command5Result = sb.ToString();
    
        return View();
    }
    
    private static long lastReconnectTicks = DateTimeOffset.MinValue.UtcTicks;
    private static DateTimeOffset firstErrorTime = DateTimeOffset.MinValue;
    private static DateTimeOffset previousErrorTime = DateTimeOffset.MinValue;
    
    private static readonly object reconnectLock = new object();
    
    // In general, let StackExchange.Redis handle most reconnects,
    // so limit the frequency of how often ForceReconnect() will
    // actually reconnect.
    public static TimeSpan ReconnectMinFrequency => TimeSpan.FromSeconds(60);
    
    // If errors continue for longer than the below threshold, then the
    // multiplexer seems to not be reconnecting, so ForceReconnect() will
    // re-create the multiplexer.
    public static TimeSpan ReconnectErrorThreshold => TimeSpan.FromSeconds(30);
    
    public static int RetryMaxAttempts => 5;
    
    private static Lazy<ConnectionMultiplexer> lazyConnection = CreateConnection();
    
    public static ConnectionMultiplexer Connection
    {
        get
        {
            return lazyConnection.Value;
        }
    }
    
    private static Lazy<ConnectionMultiplexer> CreateConnection()
    {
        return new Lazy<ConnectionMultiplexer>(() =>
        {
            string cacheConnection = ConfigurationManager.AppSettings["CacheConnection"].ToString();
            return ConnectionMultiplexer.Connect(cacheConnection);
        });
    }
    
    private static void CloseConnection(Lazy<ConnectionMultiplexer> oldConnection)
    {
        if (oldConnection == null)
            return;
    
        try
        {
            oldConnection.Value.Close();
        }
        catch (Exception)
        {
            // Example error condition: if accessing oldConnection.Value causes a connection attempt and that fails.
        }
    }
    
    /// <summary>
    /// Force a new ConnectionMultiplexer to be created.
    /// NOTES:
    ///     1. Users of the ConnectionMultiplexer MUST handle ObjectDisposedExceptions, which can now happen as a result of calling ForceReconnect().
    ///     2. Don't call ForceReconnect for Timeouts, just for RedisConnectionExceptions or SocketExceptions.
    ///     3. Call this method every time you see a connection exception. The code will:
    ///         a. wait to reconnect for at least the "ReconnectErrorThreshold" time of repeated errors before actually reconnecting
    ///         b. not reconnect more frequently than configured in "ReconnectMinFrequency"
    /// </summary>
    public static void ForceReconnect()
    {
        var utcNow = DateTimeOffset.UtcNow;
        long previousTicks = Interlocked.Read(ref lastReconnectTicks);
        var previousReconnectTime = new DateTimeOffset(previousTicks, TimeSpan.Zero);
        TimeSpan elapsedSinceLastReconnect = utcNow - previousReconnectTime;
    
        // If multiple threads call ForceReconnect at the same time, we only want to honor one of them.
        if (elapsedSinceLastReconnect < ReconnectMinFrequency)
            return;
    
        lock (reconnectLock)
        {
            utcNow = DateTimeOffset.UtcNow;
            elapsedSinceLastReconnect = utcNow - previousReconnectTime;
    
            if (firstErrorTime == DateTimeOffset.MinValue)
            {
                // We haven't seen an error since last reconnect, so set initial values.
                firstErrorTime = utcNow;
                previousErrorTime = utcNow;
                return;
            }
    
            if (elapsedSinceLastReconnect < ReconnectMinFrequency)
                return; // Some other thread made it through the check and the lock, so nothing to do.
    
            TimeSpan elapsedSinceFirstError = utcNow - firstErrorTime;
            TimeSpan elapsedSinceMostRecentError = utcNow - previousErrorTime;
    
            bool shouldReconnect =
                elapsedSinceFirstError >= ReconnectErrorThreshold // Make sure we gave the multiplexer enough time to reconnect on its own if it could.
                && elapsedSinceMostRecentError <= ReconnectErrorThreshold; // Make sure we aren't working on stale data (e.g. if there was a gap in errors, don't reconnect yet).
    
            // Update the previousErrorTime timestamp to be now (e.g. this reconnect request).
            previousErrorTime = utcNow;
    
            if (!shouldReconnect)
                return;
    
            firstErrorTime = DateTimeOffset.MinValue;
            previousErrorTime = DateTimeOffset.MinValue;
    
            Lazy<ConnectionMultiplexer> oldConnection = lazyConnection;
            CloseConnection(oldConnection);
            lazyConnection = CreateConnection();
            Interlocked.Exchange(ref lastReconnectTicks, utcNow.UtcTicks);
        }
    }
    
    // In real applications, consider using a framework such as
    // Polly to make it easier to customize the retry approach.
    private static T BasicRetry<T>(Func<T> func)
    {
        int reconnectRetry = 0;
        int disposedRetry = 0;
    
        while (true)
        {
            try
            {
                return func();
            }
            catch (Exception ex) when (ex is RedisConnectionException || ex is SocketException)
            {
                reconnectRetry++;
                if (reconnectRetry > RetryMaxAttempts)
                    throw;
                ForceReconnect();
            }
            catch (ObjectDisposedException)
            {
                disposedRetry++;
                if (disposedRetry > RetryMaxAttempts)
                    throw;
            }
        }
    }
    
    public static IDatabase GetDatabase()
    {
        return BasicRetry(() => Connection.GetDatabase());
    }
    
    public static System.Net.EndPoint[] GetEndPoints()
    {
        return BasicRetry(() => Connection.GetEndPoints());
    }
    
    public static IServer GetServer(string host, int port)
    {
        return BasicRetry(() => Connection.GetServer(host, port));
    }
    
  4. Vouw in Solution Explorer de map Views > Shared uit. Open vervolgens het bestand _Layout.cshtml.

    Vervang:

    @Html.ActionLink("Application name", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
    

    door:

    @Html.ActionLink("Azure Cache for Redis Test", "RedisCache", "Home", new { area = "" }, new { @class = "navbar-brand" })
    

Een nieuwe RedisCache-weergave toevoegen

  1. Vouw in Solution Explorer de map Views uit en klik met de rechtermuisknop op de map Home. Kies Add > View... .

  2. Voer in het dialoogvenster Add View als weergavenaam in: RedisCache. Selecteer vervolgens Toevoegen.

  3. Vervang de code in het bestand RedisCache.cshtml door de volgende code:

    @{
        ViewBag.Title = "Azure Cache for Redis Test";
    }
    
    <h2>@ViewBag.Title.</h2>
    <h3>@ViewBag.Message</h3>
    <br /><br />
    <table border="1" cellpadding="10">
        <tr>
            <th>Command</th>
            <th>Result</th>
        </tr>
        <tr>
            <td>@ViewBag.command1</td>
            <td><pre>@ViewBag.command1Result</pre></td>
        </tr>
        <tr>
            <td>@ViewBag.command2</td>
            <td><pre>@ViewBag.command2Result</pre></td>
        </tr>
        <tr>
            <td>@ViewBag.command3</td>
            <td><pre>@ViewBag.command3Result</pre></td>
        </tr>
        <tr>
            <td>@ViewBag.command4</td>
            <td><pre>@ViewBag.command4Result</pre></td>
        </tr>
        <tr>
            <td>@ViewBag.command5</td>
            <td><pre>@ViewBag.command5Result</pre></td>
        </tr>
    </table>
    

De app lokaal uitvoeren

Het project is standaard geconfigureerd voor het lokaal hosten van de app in IIS Express voor testen en foutopsporing.

De app lokaal uitvoeren

  1. Selecteer in Visual Studio Debug > Start Debugging om de app lokaal te bouwen en te starten voor testen en foutopsporing.

  2. Selecteer in de browser Azure Cache voor Redis Test op de navigatiebalk.

  3. In het volgende voorbeeld ziet u dat de Message-sleutel eerder een waarde in de cache had, die was ingesteld met behulp van de Azure Cache voor Redis-console in de portal. De app heeft die waarde in de cache bijgewerkt. De app heeft ook de opdrachten PING en CLIENT LIST uitgevoerd.

    Eenvoudige test lokaal voltooid

Publiceren en uitvoeren in Azure

Nadat het lokaal testen van de app is geslaagd, implementeert u de app in Azure en voert u deze uit in de cloud.

De app publiceren in Azure

  1. Klik in Visual Studio met de rechtermuisknop op het projectknooppunt in Solution Explorer. Selecteer vervolgens Publiceren.

    Publiceren

  2. Selecteer Microsoft Azure App Service, selecteer Nieuwe maken en selecteer vervolgens Publiceren.

    Publiceren naar App Service

  3. Breng in het dialoogvenster App Service maken de volgende wijzigingen aan:

    Instelling Aanbevolen waarde Beschrijving
    Naam van app Gebruik de standaard. De app-naam is de hostnaam voor de app wanneer deze is geïmplementeerd in Azure. Aan de naam is mogelijk een tijdstempel als achtervoegsel toegevoegd om deze uniek te maken, indien nodig.
    Abonnement Kies uw Azure-abonnement. Voor dit abonnement worden eventuele gerelateerde hostingkosten in rekening gebracht. Als u meerdere Azure-abonnementen hebt, controleert u of het gewenste abonnement is geselecteerd.
    Resourcegroep Gebruik dezelfde resourcegroep waar u de cache hebt gemaakt. (Bijvoorbeeld, TestResourceGroup.) Met een resourcegroep kunt u alle resources als een groep beheren. Als u de app later wilt verwijderen, verwijdert u gewoon de groep.
    App Service-plan Selecteer Nieuw en maak vervolgens een nieuw App Service-plan met de naam TestingPlan.
    Gebruik dezelfde locatie die u hebt gebruikt bij het maken van uw cache.
    Kies Vrij voor de grootte.
    Een App Service-plan definieert een set van rekenresources waarmee een web-app wordt uitgevoerd.

    Dialoogvenster App Service

  4. Nadat u de instellingen voor App Service-hosting hebt geconfigureerd, selecteert u Maken.

  5. Controleer het venster Uitvoer in Visual Studio om de publicatiestatus te zien. Nadat de app is gepubliceerd, wordt de URL voor de app geregistreerd:

    Publicatie-uitvoer

De app-instelling voor de cache toevoegen

Nadat de nieuwe app is gepubliceerd, voegt u een nieuwe app-instelling toe. Deze instelling wordt gebruikt om de verbindingsgegevens van de cache op te slaan.

De app-instelling toevoegen

  1. Typ de app-naam in de zoekbalk boven aan Azure Portal om te zoeken naar de nieuwe app die u hebt gemaakt.

    App zoeken

  2. Voeg een nieuwe app instelling met de naam CacheConnection toe die de app kan gebruiken om verbinding te maken met de cache. Gebruik dezelfde waarde die u hebt geconfigureerd voor CacheConnection in het bestand CacheSecrets.config. De waarde bevat de hostnaam en toegangssleutel van de cache.

    App-instelling toevoegen

De app in Azure uitvoeren

Ga in de browser naar de URL voor de app. De URL wordt weergegeven in de resultaten van de publicatiebewerking in het uitvoervenster van Visual Studio. Deze is ook beschikbaar in Azure Portal op de overzichtspagina van de app die u hebt gemaakt.

Selecteer op de navigatiebalk Azure Cache voor Redis Test om toegang tot de cache te testen.

Eenvoudige test voltooid in Azure

Resources opschonen

Als u verder wilt gaan met de volgende zelfstudie, kunt u de resources die u in deze snelstart hebt gemaakt, behouden en opnieuw gebruiken.

Als klaar bent met de voorbeeldtoepassing uit de snelstart, kunt u de Azure-resources die u in deze snelstart hebt gemaakt, verwijderen om kosten te voorkomen.

Belangrijk

Het verwijderen van een resourcegroep kan niet ongedaan worden gemaakt. Wanneer u een resourcegroep verwijdert, worden alle resources in de groep definitief verwijderd. Zorg ervoor dat u niet per ongeluk de verkeerde resourcegroep of resources verwijdert. Als u de resources hebt gemaakt voor het hosten van dit voorbeeld in een bestaande resourcegroep die resources bevat die u wilt behouden, kunt u elke resource afzonderlijk aan de linkerkant verwijderen in plaats van de resourcegroep te verwijderen.

Een resourcegroep verwijderen

  1. Meld u aan bij Azure Portal en selecteer vervolgens Resourcegroepen.

  2. Typ in het vak Filteren op naam... de naam van de resourcegroep. In de instructies voor dit artikel is een resourcegroep met de naam TestResources gebruikt. Selecteer in de resourcegroep, in de resultatenlijst, de optie ... . Selecteer vervolgens Resourcegroep verwijderen.

    Verwijderen

U wordt gevraagd om het verwijderen van de resourcegroep te bevestigen. Typ ter bevestiging de naam van de resourcegroep. Selecteer vervolgens Verwijderen.

Na enkele ogenblikken worden de resourcegroep en alle bijbehorende resources verwijderd.

Volgende stappen

In de volgende zelfstudie gebruikt u Azure Cache voor Redis in een realistischer scenario om de prestaties van een app te verbeteren. U werkt deze toepassing bij zodat leaderboardresultaten in de cache worden geplaatst met behulp van het cache-aside-patroon met ASP.NET en een database.