Podpora ukládání dat do mezipaměti pro webové HTTP služby WCF

Rozhraní .NET Framework 4.6.1 umožňuje používat deklarativní mechanismus ukládání do mezipaměti, který je již k dispozici v ASP.NET ve službách WCF Web HTTP. To vám umožní ukládat odpovědi z operací webové služby HTTP WCF. Když uživatel odešle službě http GET nakonfigurovanou pro ukládání do mezipaměti, ASP.NET odešle zpět odpověď uloženou v mezipaměti a metoda služby se nevolá. Po vypršení platnosti mezipaměti se při příštím odeslání příkazu HTTP GET zavolá metoda služby a odpověď se znovu ukládá do mezipaměti. Další informace o ukládání do mezipaměti ASP.NET naleznete v tématu ASP.NET Ukládání do mezipaměti Přehled.

Základní Ukládání do mezipaměti webové služby HTTP

Chcete-li povolit ukládání webové služby HTTP do mezipaměti, musíte nejprve povolit kompatibilitu ASP.NET použitím AspNetCompatibilityRequirementsAttribute nastavení RequirementsMode služby na Allowed nebo Required.

Rozhraní .NET Framework 4 zavádí nový atribut, AspNetCacheProfileAttribute který umožňuje zadat název profilu mezipaměti. Tento atribut se použije u operace služby. Následující příklad platí AspNetCompatibilityRequirementsAttribute pro službu, která povolí kompatibilitu ASP.NET a nakonfiguruje GetCustomer operaci pro ukládání do mezipaměti. Atribut AspNetCacheProfileAttribute určuje profil mezipaměti, který obsahuje nastavení mezipaměti, která se mají použít.

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]
public class Service
{
    [WebGet(UriTemplate = "{id}")]
    [AspNetCacheProfile("CacheFor60Seconds")]
    public Customer GetCustomer(string id)
    {
        // ...
    }
}

Zapněte také režim kompatibility ASP.NET v souboru Web.config, jak je znázorněno v následujícím příkladu.

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>

Upozorňující

Pokud ASP.NET režim kompatibility není zapnutý a AspNetCacheProfileAttribute použije se výjimka.

Název profilu mezipaměti určený AspNetCacheProfileAttribute identifikátorem identifikuje profil mezipaměti přidaný do konfiguračního souboru Web.config. Profil mezipaměti je definován v elementu <outputCacheSetting> , jak je znázorněno v následujícím příkladu konfigurace.

<!-- ...  -->
<system.web>  
   <caching>  
      <outputCacheSettings>  
         <outputCacheProfiles>  
            <add name="CacheFor60Seconds" duration="60" varyByParam="none" sqlDependency="MyTestDatabase:MyTable"/>  
         </outputCacheProfiles>  
      </outputCacheSettings>  
   </caching>  
   <!-- ... -->  
</system.web>  

Jedná se o stejný konfigurační prvek, který je k dispozici pro ASP.NET aplikace. Další informace o profilech mezipaměti ASP.NET naleznete v tématu OutputCacheProfile. U webových služeb HTTP jsou nejdůležitější atributy v profilu mezipaměti: cacheDuration a varyByParam. Oba tyto atributy jsou povinné. cacheDuration nastaví dobu, po kterou má být odpověď uložena v mezipaměti v sekundách. varyByParam umožňuje zadat parametr řetězce dotazu, který se používá k ukládání odpovědí do mezipaměti. Všechny požadavky provedené s různými hodnotami parametrů řetězce dotazu se ukládají do mezipaměti samostatně. Například po provedení http://MyServer/MyHttpService/MyOperation?param=10počátečního požadavku by se všechny následné požadavky provedené se stejným identifikátorem URI vrátily odpověď uloženou v mezipaměti (pokud doba trvání mezipaměti uplynula). Odpovědi na podobný požadavek, který je stejný, ale má jinou hodnotu parametru parametru řetězce dotazu, se ukládají do mezipaměti samostatně. Pokud toto samostatné chování při ukládání do mezipaměti nechcete, nastavte varyByParam na hodnotu none .

Závislost mezipaměti SQL

Odpovědi webové služby HTTP je také možné ukládat do mezipaměti pomocí závislosti mezipaměti SQL. Pokud vaše webová služba HTTP WCF závisí na datech uložených v databázi SQL, můžete chtít uložit odpověď služby do mezipaměti a zneplatnit odpověď uloženou v mezipaměti, když se data v tabulce databáze SQL změní. Toto chování je nakonfigurováno zcela v rámci souboru Web.config. Nejprve definujte připojovací řetězec v elementu<connectionStrings>.

<connectionStrings>
  <add name="connectString"
       connectionString="Data Source=MyService;Initial Catalog=MyTestDatabase;Integrated Security=True"
       providerName="System.Data.SqlClient" />
</connectionStrings>

Potom je nutné povolit závislost mezipaměti SQL v rámci <caching> elementu v rámci elementu <system.web> , jak je znázorněno v následujícím příkladu konfigurace.

<system.web>
  <caching>
    <sqlCacheDependency enabled="true" pollTime="1000">
      <databases>
        <add name="MyTestDatabase" connectionStringName="connectString" />
      </databases>
    </sqlCacheDependency>
    <!-- ... -->
  </caching>
  <!-- ... -->
</system.web>

Tady je povolená závislost mezipaměti SQL a je nastavena doba dotazování 1000 milisekund. Pokaždé, když čas dotazování uplynou v tabulce databáze, zkontroluje aktualizace. Pokud se zjistí, že se obsah mezipaměti odebere a při příštím vyvolání operace služby se do mezipaměti zapíše nová odpověď. V elementu <sqlCacheDependency> přidejte databáze a odkazujte na připojovací řetězec uvnitř <databases> elementu, jak je znázorněno v následujícím příkladu.

<system.web>
  <caching>
    <sqlCacheDependency enabled="true" pollTime="1000">
      <databases>
        <add name="MyTestDatabase" connectionStringName="connectString" />
      </databases>  
    </sqlCacheDependency>  
    <!-- ... -->  
  </caching>  
  <!-- ... -->  
</system.web>  

Dále musíte nakonfigurovat nastavení výstupní mezipaměti v rámci elementu <caching> , jak je znázorněno v následujícím příkladu.

<system.web>
  <caching>  
    <!-- ...  -->
    <outputCacheSettings>
      <outputCacheProfiles>
        <add name="CacheFor60Seconds" duration="60" varyByParam="none" sqlDependency="MyTestDatabase:MyTable" />
      </outputCacheProfiles>
    </outputCacheSettings>
  </caching>
  <!-- ... -->
</system.web>

Zde je doba trvání mezipaměti nastavená na 60 sekund, varyByParam je nastavená na žádnou a sqlDependency je nastavena na seznam párů názvů/tabulek oddělených středníkem databáze nebo tabulek oddělených dvojtečkami. Při změně dat MyTable v mezipaměti se odebere odpověď pro operaci služby a při vyvolání nové odpovědi se vygeneruje (voláním operace služby), uložená do mezipaměti a vrácena klientovi.

Důležité

Pro přístup k databázi SQL ASP.NET musíte použít nástroj pro registraci sql serveru ASP.NET. Kromě toho musíte povolit příslušný uživatelský účet přístup k databázi a tabulce. Další informace naleznete v tématu Přístup k SQL Serveru z webové aplikace.

Podmíněný Ukládání do mezipaměti založený na HTTP GET

Ve scénářích webového http se podmíněný http GET často používá službami k implementaci inteligentního ukládání do mezipaměti HTTP, jak je popsáno ve specifikaci HTTP. K tomu musí služba nastavit hodnotu hlavičky značky ETag v odpovědi HTTP. Musí také zkontrolovat hlavičku If-None-Match v požadavku HTTP a zjistit, jestli některá ze zadaných jmenovek ETag odpovídá aktuální značkě ETag.

U požadavků CheckConditionalRetrieve GET a HEAD vezme hodnotu značky ETag a zkontroluje ji v hlavičce Požadavku If-None-Match. Pokud je hlavička přítomná a existuje shoda, WebFaultException vyvolá se stavový kód HTTP 304 (Neupraveno) a do odpovědi se přidá hlavička ETag s odpovídající značkou ETag.

Jedno přetížení CheckConditionalRetrieve metody trvá datum poslední změny a zkontroluje ho v hlavičce If-Modified-Since požadavku. Pokud je hlavička přítomná a prostředek se od té doby nezměnil, WebFaultException vyvolá se stavový kód HTTP 304 (Neupraveno).

U požadavků CheckConditionalUpdate PUT, POST a DELETE přebírá aktuální hodnotu značky ETag prostředku. Pokud je aktuální hodnota značky ETag null, metoda zkontroluje, zda hlavička If-None- Match má hodnotu "*". Pokud aktuální hodnota značky ETag není výchozí hodnotou, metoda zkontroluje aktuální hodnotu značky ETag na hlavičku If- Match požadavku. V obou případech vyvolá metoda stavový WebFaultException kód HTTP 412 (předběžná podmínka se nezdařila), pokud očekávaná hlavička není v požadavku nebo její hodnota nevyhovuje podmíněné kontrole a nastaví hlavičku ETag odpovědi na aktuální hodnotu značky ETag.

Metody CheckConditional i SetETag metoda zajišťují, že hodnota ETag nastavená v hlavičce odpovědi je platná značka ETag podle specifikace HTTP. To zahrnuje obklopování hodnoty ETag v dvojitých uvozovkách, pokud ještě nejsou přítomny a správně uvozují všechny interní znaky dvojité uvozovky. Slabé porovnání značky ETag není podporováno.

Následující příklad ukazuje, jak tyto metody používat.

[WebGet(UriTemplate = "{id}"), Description("Returns the specified customer from customers collection. Returns NotFound if there is no such customer. Supports conditional GET.")]
public Customer GetCustomer(string id)
{
    lock (writeLock)
    {
        // return NotFound if there is no item with the specified id.
        object itemEtag = customerEtags[id];
        if (itemEtag == null)
        {
            throw new WebFaultException(HttpStatusCode.NotFound);
        }
  
        // return NotModified if the client did a conditional GET and the customer item has not changed
        // since when the client last retrieved it
        WebOperationContext.Current.IncomingRequest.CheckConditionalRetrieve((long)itemEtag);
        Customer result = this.customers[id] as Customer;

        // set the customer etag before returning the result
        WebOperationContext.Current.OutgoingResponse.SetETag((long)itemEtag);
        return result;
    }
}

Aspekty zabezpečení

Požadavky, které vyžadují autorizaci, by neměly mít odpovědi uložené v mezipaměti, protože autorizace se neprovádí při obsluhování odpovědi z mezipaměti. Ukládání do mezipaměti takové reakce by zavedly vážné ohrožení zabezpečení. Požadavky, které vyžadují autorizaci, obvykle poskytují data specifická pro uživatele, a proto ukládání do mezipaměti na straně serveru není ani výhodné. Vtakovýchch