A WCF webes HTTP-szolgáltatások gyorsítótárazási támogatása
.NET-keretrendszer 4.6.1 lehetővé teszi, hogy a WCF webes HTTP-szolgáltatásaiban már elérhető deklaratív gyorsítótárazási mechanizmust használja ASP.NET. Így gyorsítótárazhatja a WCF webes HTTP-szolgáltatás műveleteiből érkező válaszokat. Amikor egy felhasználó gyorsítótárazáshoz konfigurált HTTP GET-t küld a szolgáltatásnak, ASP.NET visszaküldi a gyorsítótárazott választ, és a szolgáltatás metódusa nem lesz meghívva. Amikor a gyorsítótár lejár, a következő alkalommal, amikor egy felhasználó HTTP GET-t küld, meghívja a szolgáltatás metódusát, és a rendszer ismét gyorsítótárazza a választ. A ASP.NET gyorsítótárazással kapcsolatos további információkért lásd ASP.NET gyorsítótárazási áttekintést.
Alapszintű webes HTTP-szolgáltatás gyorsítótárazása
A WEB HTTP-szolgáltatás gyorsítótárazásának engedélyezéséhez először engedélyeznie kell a ASP.NET kompatibilitást a AspNetCompatibilityRequirementsAttribute szolgáltatásra vonatkozó beállítás RequirementsModeAllowed alkalmazásával.Required
.NET-keretrendszer 4 egy új attribútumot vezet AspNetCacheProfileAttribute be, amely lehetővé teszi a gyorsítótárprofil nevének megadását. Ez az attribútum egy szolgáltatásműveletre lesz alkalmazva. Az alábbi példa egy szolgáltatásra alkalmazza a AspNetCompatibilityRequirementsAttribute ASP.NET kompatibilitásának engedélyezéséhez és a GetCustomer
gyorsítótárazási művelet konfigurálásához. Az AspNetCacheProfileAttribute attribútum egy gyorsítótárprofilt ad meg, amely tartalmazza a használni kívánt gyorsítótár-beállításokat.
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]
public class Service
{
[WebGet(UriTemplate = "{id}")]
[AspNetCacheProfile("CacheFor60Seconds")]
public Customer GetCustomer(string id)
{
// ...
}
}
Kapcsolja be ASP.NET kompatibilitási módot is a Web.config fájlban az alábbi példában látható módon.
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
Figyelmeztetés
Ha ASP.NET kompatibilitási mód nincs bekapcsolva, és a AspNetCacheProfileAttribute rendszer kivételt alkalmaz.
A gyorsítótárprofil által megadott név azonosítja a AspNetCacheProfileAttribute Web.config konfigurációs fájlhoz hozzáadott gyorsítótárprofilt. A gyorsítótárprofil egy <outputCacheSetting
> elemben van definiálva, ahogyan az a következő konfigurációs példában is látható.
<!-- ... -->
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="CacheFor60Seconds" duration="60" varyByParam="none" sqlDependency="MyTestDatabase:MyTable"/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
<!-- ... -->
</system.web>
Ez ugyanaz a konfigurációs elem, amely ASP.NET alkalmazások számára érhető el. További információ ASP.NET gyorsítótárprofilokról: OutputCacheProfile. A webes HTTP-szolgáltatások esetében a gyorsítótárprofil legfontosabb attribútumai a következők: cacheDuration
és varyByParam
. Mindkét attribútumra szükség van. cacheDuration
beállítja, hogy a válasz mennyi ideig legyen gyorsítótárazva másodpercben. varyByParam
lehetővé teszi a válaszok gyorsítótárazásához használt lekérdezési sztringparaméter megadását. A különböző lekérdezési sztringparaméter-értékekkel végrehajtott összes kérés külön gyorsítótárazva lesz. Ha például egy kezdeti kérést küld http://MyServer/MyHttpService/MyOperation?param=10
, az azonos URI-val küldött összes további kérés a gyorsítótárazott választ adja vissza (amennyiben a gyorsítótár időtartama nem telt el). Az azonos, de a paraméter lekérdezési sztring paraméteréhez eltérő értékkel rendelkező hasonló kérésekre adott válaszok külön gyorsítótárazva lesznek. Ha nem szeretné ezt a különálló gyorsítótárazási viselkedést, állítsa be a "none" értéket varyByParam
.
SQL Cache-függőség
A webes HTTP-szolgáltatás válaszai SQL Cache-függőséggel is gyorsítótárazhatók. Ha a WCF webes HTTP-szolgáltatása egy SQL-adatbázisban tárolt adatoktól függ, érdemes lehet gyorsítótárazni a szolgáltatás válaszát, és érvényteleníteni a gyorsítótárazott választ, amikor az SQL-adatbázistáblában lévő adatok megváltoznak. Ez a viselkedés teljesen a Web.config fájlban van konfigurálva. Először definiáljon egy kapcsolati sztring az <connectionStrings
> elemben.
<connectionStrings>
<add name="connectString"
connectionString="Data Source=MyService;Initial Catalog=MyTestDatabase;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
Ezután engedélyeznie kell az SQL Cache-függőséget az elem egyik <caching
> elemében az <system.web
> alábbi konfigurációs példában látható módon.
<system.web>
<caching>
<sqlCacheDependency enabled="true" pollTime="1000">
<databases>
<add name="MyTestDatabase" connectionStringName="connectString" />
</databases>
</sqlCacheDependency>
<!-- ... -->
</caching>
<!-- ... -->
</system.web>
Itt engedélyezve van az SQL Cache-függőség, és a lekérdezési idő 1000 ezredmásodperc. Minden alkalommal, amikor a lekérdezési idő eltelt, a rendszer ellenőrzi az adatbázistáblát a frissítések keresésekor. Ha a rendszer módosításokat észlel, a gyorsítótár tartalma el lesz távolítva, és a szolgáltatásművelet következő meghívásakor a rendszer új választ ad a gyorsítótárba. Az elemen <sqlCacheDependency
> belül adja hozzá az adatbázisokat, és hivatkozzon az elemen belüli <databases
> kapcsolati sztring az alábbi példában látható módon.
<system.web>
<caching>
<sqlCacheDependency enabled="true" pollTime="1000">
<databases>
<add name="MyTestDatabase" connectionStringName="connectString" />
</databases>
</sqlCacheDependency>
<!-- ... -->
</caching>
<!-- ... -->
</system.web>
Ezután konfigurálnia kell a kimeneti gyorsítótár beállításait az elemen belül az <caching
> alábbi példában látható módon.
<system.web>
<caching>
<!-- ... -->
<outputCacheSettings>
<outputCacheProfiles>
<add name="CacheFor60Seconds" duration="60" varyByParam="none" sqlDependency="MyTestDatabase:MyTable" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
<!-- ... -->
</system.web>
Itt a gyorsítótár időtartama 60 másodpercre van beállítva, varyByParam
nincs, és sqlDependency
pontosvesszővel tagolt adatbázis-név/táblázatpárok kettősponttal elválasztott listájára van beállítva. Az adatok MyTable
módosításakor a szolgáltatásművelet gyorsítótárazott válasza törlődik, és a művelet meghívásakor új válasz jön létre (a szolgáltatásművelet meghívásával), gyorsítótárazva, és visszakerül az ügyfélhez.
Fontos
Ahhoz, hogy ASP.NET hozzáférhessen egy SQL-adatbázishoz, az ASP.NET SQL Server regisztrációs eszközt kell használnia. Emellett engedélyeznie kell a megfelelő felhasználói fiók hozzáférését az adatbázishoz és a táblához. További információ: SQL Server elérése webalkalmazásból.
Feltételes HTTP GET-alapú gyorsítótárazás
Webes HTTP-forgatókönyvekben a szolgáltatások gyakran használnak feltételes HTTP GET-t az intelligens HTTP-gyorsítótárazás megvalósításához a HTTP-specifikációban leírtak szerint. Ehhez a szolgáltatásnak be kell állítania az ETag fejléc értékét a HTTP-válaszban. A HTTP-kérelemben az If-None-Match fejlécet is ellenőriznie kell, hogy a megadott ETag valamelyike megfelel-e az aktuális ETagnek.
A GET és a HEAD kérelmek esetében egy ETag-értéket vesz fel, CheckConditionalRetrieve és ellenőrzi a kérés If-None-Match fejlécén. Ha az élőfej jelen van, és egyezés van, WebFaultException a rendszer egy 304-ben (nem módosított) HTTP-állapotkóddal rendelkező eTag-fejlécet ad hozzá a válaszhoz a megfelelő ETaggel.
A metódus egyik túlterhelése CheckConditionalRetrieve egy utolsó módosítási dátumot vesz igénybe, és ellenőrzi a kérés If-Modified-Since fejlécén. Ha a fejléc jelen van, és az erőforrás azóta nem lett módosítva, a WebFaultException rendszer egy 304-as (nem módosított) HTTP-állapotkóddal rendelkezik.
A PUT, POST és DELETE kérelmek CheckConditionalUpdate esetében az erőforrás aktuális ETag-értékét veszi fel. Ha az aktuális ETag értéke null, a metódus ellenőrzi, hogy az If-None- Egyezés fejléc "*" értékű-e. Ha az aktuális ETag-érték nem alapértelmezett érték, akkor a metódus ellenőrzi az aktuális ETag-értéket a kérés If- Egyezés fejlécén. A metódus mindkét esetben a 412-s HTTP-állapotkóddal ( WebFaultException az előkondicionálás sikertelen), ha a várt fejléc nem szerepel a kérelemben, vagy az értéke nem felel meg a feltételes ellenőrzésnek, és beállítja a válasz ETag-fejlécét az aktuális ETag-értékre.
Mind a CheckConditional
metódus, mind a SetETag metódus biztosítja, hogy a válaszfejlécen beállított ETag érték érvényes ETag legyen a HTTP-specifikációnak megfelelően. Ez magában foglalja az ETag értékét dupla idézőjelekben, ha még nincsenek jelen, és megfelelő módon kerüli el a belső idézőjelek karaktereit. Gyenge ETag-összehasonlítás nem támogatott.
Az alábbi példa bemutatja, hogyan használhatja ezeket a metódusokat.
[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;
}
}
Biztonsági szempontok
Az engedélyezést igénylő kéréseknek nem szabad gyorsítótárazniuk a válaszaikat, mert az engedélyezés nem történik meg a válasz gyorsítótárból való kézbesítésekor. Az ilyen válaszok gyorsítótárazása súlyos biztonsági rést jelentene. Az engedélyezést igénylő kérések általában felhasználóspecifikus adatokat biztosítanak, ezért a kiszolgálóoldali gyorsítótárazás nem is előnyös. Ilyen helyzetekben az ügyféloldali gyorsítótárazás vagy egyszerűen egyáltalán nem gyorsítótárazás megfelelőbb lesz.