Statikus tartalom üzemeltetési mintaStatic Content Hosting pattern

A statikus tartalmakat egy felhőalapú társzolgáltatásban helyezheti üzembe, amely közvetlenül az ügyfélnek közvetíti azt.Deploy static content to a cloud-based storage service that can deliver them directly to the client. Ezzel csökkenthető a potenciálisan drága számítási példányok igénye.This can reduce the need for potentially expensive compute instances.

Kontextus és problémaContext and problem

A Webalkalmazások rendszerint tartalmazzák a statikus tartalom néhány elemét.Web applications typically include some elements of static content. A statikus tartalom magában foglalhat HTML-lapokat és más erőforrásokat, például az ügyfél számára hozzáférhető lemezképeket, amelyek vagy a HTML-lapok részei (például a beágyazott képek, a stíluslapok és az ügyféloldali JavaScript-fájlok), vagy külön letölthetőek (például PDF-dokumentumok).This static content might include HTML pages and other resources such as images and documents that are available to the client, either as part of an HTML page (such as inline images, style sheets, and client-side JavaScript files) or as separate downloads (such as PDF documents).

Bár a webkiszolgálók dinamikus megjelenítésre és kimeneti gyorsítótárazásra vannak optimalizálva, továbbra is kezelniük kell a kérelmeket a statikus tartalom letöltéséhez.Although web servers are optimized for dynamic rendering and output caching, they still have to handle requests to download static content. Ez lefoglalja a feldolgozási ciklusokat, amelyek gyakran végezhetnének hasznosabb feladatokat.This consumes processing cycles that could often be put to better use.

MegoldásSolution

A legtöbb felhőalapú üzemeltetési környezetben egy alkalmazás erőforrásait és statikus oldalait is elhelyezheti egy tárolási szolgáltatásban.In most cloud hosting environments, you can put some of an application's resources and static pages in a storage service. A tárolási szolgáltatás az ilyen erőforrásokra vonatkozó kéréseket képes kiszolgálni, így csökkentve a más webes kérelmeket kezelő számítási erőforrások terhelését.The storage service can serve requests for these resources, reducing load on the compute resources that handle other web requests. A felhőben üzemeltetett tárolás költsége általában sokkal alacsonyabb, mint a számítási példányoké.The cost for cloud-hosted storage is typically much less than for compute instances.

Amikor egy alkalmazás egyes részeit egy tárolási szolgáltatásban üzemelteti, a fő szempontok az alkalmazás telepítésével és az olyan erőforrások védelmével kapcsolatosak, amelyekhez a névtelen felhasználóknak nem szabad hozzáférniük.When hosting some parts of an application in a storage service, the main considerations are related to deployment of the application and to securing resources that aren't intended to be available to anonymous users.

Problémák és megfontolandó szempontokIssues and considerations

A minta megvalósítása során az alábbi pontokat vegye figyelembe:Consider the following points when deciding how to implement this pattern:

  • Az üzemeltetett társzolgáltatásnak fel kell fednie egy HTTP-végpontot, amelyhez a felhasználók hozzáférhetnek a statikus erőforrások letöltéséhez.The hosted storage service must expose an HTTP endpoint that users can access to download the static resources. Bizonyos tárolási szolgáltatások támogatják a HTTPS-t is, így lehetséges olyan erőforrásokat üzemeltetni az adattárolási szolgáltatásokban, amelyek megkövetelik az SSL használatát.Some storage services also support HTTPS, so it's possible to host resources in storage services that require SSL.

  • A legjobb teljesítmény és rendelkezésre állás érdekében érdemes egy tartalomkézbesítési hálózatot (CDN-t) használni, amellyel a tároló tartalmát több különböző adatközpontban gyorsítótárazhatja világszerte.For maximum performance and availability, consider using a content delivery network (CDN) to cache the contents of the storage container in multiple datacenters around the world. A CDN használatáért azonban általában díjat kell fizetni.However, you'll likely have to pay for using the CDN.

  • A tárfiókok gyakran alapértelmezés szerint georeplikáltak, ami olyan események ellen biztosít védelmet, amelyek hatással lehetnek az adatközpontra.Storage accounts are often geo-replicated by default to provide resiliency against events that might affect a datacenter. Ez azt jelenti, hogy az IP-cím változhat, de az URL-cím ugyanaz marad.This means that the IP address might change, but the URL will remain the same.

  • Ha egyes tartalmak egy Storage-fiókban találhatók, és más tartalmak egy üzemeltetett számítási példányban találhatóak, akkor nagyobb kihívást jelent az alkalmazás üzembe helyezése és frissítése.When some content is located in a storage account and other content is in a hosted compute instance, it becomes more challenging to deploy and update the application. Lehetséges, hogy különálló üzembe helyezéseket kell végeznie, és verziószámmal kell ellátnia az alkalmazást és a tartalmakat, hogy egyszerűbben felügyelhesse azokat – különösen, ha a statikus tartalom parancsfájlokat vagy felhasználói felületi összetevőket is magában foglal.You might have to perform separate deployments, and version the application and content to manage it more easily—especially when the static content includes script files or UI components. Ha azonban csak statikus erőforrásokat kell frissítenie, akkor egyszerűen feltöltheti őket a tárfiókra anélkül, hogy újból üzembe helyezné az alkalmazáscsomagot.However, if only static resources have to be updated, they can simply be uploaded to the storage account without needing to redeploy the application package.

  • Előfordulhat, hogy a tárolási szolgáltatások nem támogatják az egyéni tartománynevek használatát.Storage services might not support the use of custom domain names. Ebben az esetben fontos az erőforrások teljes URL-címének megadása, mert egy másik tartományban lesznek, mint a hivatkozásokat tartalmazó dinamikusan létrehozott tartalom.In this case it's necessary to specify the full URL of the resources in links because they'll be in a different domain from the dynamically-generated content containing the links.

  • A tárolókat nyilvános olvasási hozzáféréssel kell konfigurálni, de elengedhetetlen az is, hogy azok ne legyenek nyilvános írási hozzáférésre konfigurálva, hogy a felhasználók ne tudjanak tartalmat feltölteni.The storage containers must be configured for public read access, but it's vital to ensure that they aren't configured for public write access to prevent users being able to upload content.

  • Érdemes lehet egy inasi kulcsot vagy jogkivonatot használni a névtelenül nem elérhető erőforrásokhoz való hozzáférés szabályozásához.Consider using a valet key or token to control access to resources that shouldn't be available anonymously. További információért tekintse meg a szerviz kulcs mintáját .See the Valet Key pattern for more information.

Mikor érdemes ezt a mintát használni?When to use this pattern

Ez a minta az alábbi esetekben hasznos:This pattern is useful for:

  • A statikus erőforrásokat tartalmazó webhelyek és alkalmazások üzemeltetési költségeinek csökkentése.Minimizing the hosting cost for websites and applications that contain some static resources.

  • A csak statikus tartalomból és erőforrásokból álló webhelyek üzemeltetési költségeinek csökkentése.Minimizing the hosting cost for websites that consist of only static content and resources. A szolgáltató tárolási rendszerének képességeitől függően lehetséges, hogy teljes egészében statikus webhelyet üzemeltet egy Storage-fiókban.Depending on the capabilities of the hosting provider's storage system, it might be possible to entirely host a fully static website in a storage account.

  • Más üzemeltetési környezetben vagy helyszíni kiszolgálókon futó alkalmazások statikus erőforrásainak és tartalmainak felfedése.Exposing static resources and content for applications running in other hosting environments or on-premises servers.

  • Több földrajzi területen található adatok megkeresése egy tartalomkézbesítési hálózattal (CDN), amely világszerte több adatközpontban gyorsítótárazza a tároló tartalmát.Locating content in more than one geographical area using a content delivery network that caches the contents of the storage account in multiple datacenters around the world.

  • A költségek és a sávszélesség-használat monitorozása.Monitoring costs and bandwidth usage. Egy külön tárfiók használata az összes vagy csak bizonyos statikus tartalmakhoz lehetővé teszi, hogy a költségek könnyebben elkülönüljenek az üzemeltetési és futtatási költségektől.Using a separate storage account for some or all of the static content allows the costs to be more easily separated from hosting and runtime costs.

Nem érdemes ezt a mintát használni a következő helyzetekben:This pattern might not be useful in the following situations:

  • Az alkalmazásnak fel kell dolgoznia a statikus tartalmat, mielőtt elküldené az ügyfélnek.The application needs to perform some processing on the static content before delivering it to the client. Szükség lehet például egy dokumentum időbélyeggel való ellátására.For example, it might be necessary to add a timestamp to a document.

  • A statikus tartalom mennyisége elenyésző.The volume of static content is very small. A különálló tárolóról érkező tartalom fogadásával járó terhelés meghaladja a számítógép erőforrásaitól való elkülönítés előnyeit.The overhead of retrieving this content from separate storage can outweigh the cost benefit of separating it out from the compute resource.

PéldaExample

Az Azure Storage közvetlenül a tárolóból támogatja a statikus tartalmak kiszolgálását.Azure Storage supports serving static content directly from a storage container. A fájlok névtelen hozzáférési kérelmeken keresztül lesznek kézbesítve.Files are served through anonymous access requests. Alapértelmezés szerint a fájlok egy altartományában található URL-cím ( core.windows.net például https://contoso.z4.web.core.windows.net/image.png ).By default, files have a URL in a subdomain of core.windows.net, such as https://contoso.z4.web.core.windows.net/image.png. Konfigurálhat egyéni tartománynevet, és a Azure CDN használatával is elérheti a fájlokat HTTPS-kapcsolaton keresztül.You can configure a custom domain name, and use Azure CDN to access the files over HTTPS. További információ: statikus webhely üzemeltetése az Azure Storage-ban.For more information, see Static website hosting in Azure Storage.

Egy alkalmazás statikus részeinek kézbesítése közvetlenül a Storage szolgáltatásból

A statikus webhely üzemeltetése lehetővé teszi, hogy a fájlok elérhetők legyenek a névtelen hozzáféréshez.Static website hosting makes the files available for anonymous access. Ha meg kell határoznia, hogy ki férhet hozzá a fájlokhoz, az Azure Blob Storage-ban tárolhatja a fájlokat, majd a hozzáférés korlátozásához létrehozhat közös hozzáférési aláírásokat .If you need to control who can access the files, you can store files in Azure blob storage and then generate shared access signatures to limit access.

Az ügyfélnek küldött lapok hivatkozásainak meg kell adniuk az erőforrás teljes URL-címét.The links in the pages delivered to the client must specify the full URL of the resource. Ha az erőforrást egy inasi kulccsal (például közös hozzáférési aláírással) védik, az aláírásnak szerepelnie kell az URL-címben.If the resource is protected with a valet key, such as a shared access signature, this signature must be included in the URL.

A githubonelérhető egy minta alkalmazás, amely a statikus erőforrások külső tárolójának használatát mutatja be.A sample application that demonstrates using external storage for static resources is available on GitHub. Ez a példa konfigurációs fájlokat használ a statikus tartalmat tároló Storage-fiók és-tároló megadásához.This sample uses configuration files to specify the storage account and container that holds the static content.

<Setting name="StaticContent.StorageConnectionString"
         value="UseDevelopmentStorage=true" />
<Setting name="StaticContent.Container" value="static-content" />

A StaticContentHosting.Web projekt Settings.cs fájljának Settings osztálya olyan metódusokat tartalmaz, amelyekkel ezek az adatok kinyerhetők, és létrehozható egy sztringérték, amely tartalmazza a felhőalapú tárfiók tárolójának URL-címét.The Settings class in the file Settings.cs of the StaticContentHosting.Web project contains methods to extract these values and build a string value containing the cloud storage account container URL.

public class Settings
{
  public static string StaticContentStorageConnectionString {
    get
    {
      return RoleEnvironment.GetConfigurationSettingValue(
                              "StaticContent.StorageConnectionString");
    }
  }

  public static string StaticContentContainer
  {
    get
    {
      return RoleEnvironment.GetConfigurationSettingValue("StaticContent.Container");
    }
  }

  public static string StaticContentBaseUrl
  {
    get
    {
        var blobServiceClient = new BlobServiceClient(StaticContentStorageConnectionString);

        return string.Format("{0}/{1}", blobServiceClient.Uri.ToString().TrimEnd('/'), StaticContentContainer.TrimStart('/'));
    }
  }
}

A StaticContentUrlHtmlHelper.cs fájl StaticContentUrlHtmlHelper osztálya tartalmaz egy StaticContentUrl nevű metódust, amely létrehoz egy, a felhőalapú tárfiók útvonalát tartalmazó URL-címet, ha az általa fogadott URL-cím az ASP.NET gyökérútvonal-karakterével (~) kezdődik.The StaticContentUrlHtmlHelper class in the file StaticContentUrlHtmlHelper.cs exposes a method named StaticContentUrl that generates a URL containing the path to the cloud storage account if the URL passed to it starts with the ASP.NET root path character (~).

public static class StaticContentUrlHtmlHelper
{
  public static string StaticContentUrl(this HtmlHelper helper, string contentPath)
  {
    if (contentPath.StartsWith("~"))
    {
      contentPath = contentPath.Substring(1);
    }

    contentPath = string.Format("{0}/{1}", Settings.StaticContentBaseUrl.TrimEnd('/'),
                                contentPath.TrimStart('/'));

    var url = new UrlHelper(helper.ViewContext.RequestContext);

    return url.Content(contentPath);
  }
}

A Views\Home mappa Index.cshtml fájlja tartalmaz egy képet, amely a StaticContentUrl metódus használatával létrehoz egy URL-címet az src attribútumához.The file Index.cshtml in the Views\Home folder contains an image element that uses the StaticContentUrl method to create the URL for its src attribute.

<img src="@Html.StaticContentUrl("~/media/orderedList1.png")" alt="Test Image" />