Aracılığıyla paylaş


WCF Web HTTP Hizmetleri için Önbelleğe Alma Desteği

.NET Framework 4.6.1, WCF Web HTTP hizmetlerinizdeki ASP.NET zaten kullanılabilir olan bildirim temelli önbelleğe alma mekanizmasını kullanmanıza olanak tanır. Bu, WCF Web HTTP hizmeti işlemlerinizden gelen yanıtları önbelleğe almanızı sağlar. Kullanıcı hizmetinize önbelleğe alma için yapılandırılmış bir HTTP GET gönderdiğinde, ASP.NET önbelleğe alınan yanıtı geri gönderir ve hizmet yöntemi çağrılmaz. Önbelleğin süresi dolduğunda, kullanıcı bir sonraki HTTP GET gönderişinde hizmet yönteminiz çağrılır ve yanıt bir kez daha önbelleğe alınır. ASP.NET önbelleğe alma hakkında daha fazla bilgi için bkz. ASP.NET Önbelleğe Alma Genel Bakış.

Temel Web HTTP Hizmeti Önbelleğe Alma

WEB HTTP hizmeti önbelleğe almayı etkinleştirmek için, önce veya 'a hizmet ayarı RequirementsModeAllowedRequireduygulayarak AspNetCompatibilityRequirementsAttribute ASP.NET uyumluluğu etkinleştirmeniz gerekir.

.NET Framework 4, önbellek profili adı belirtmenize olanak tanıyan adlı AspNetCacheProfileAttribute yeni bir öznitelik tanıtır. Bu öznitelik bir hizmet işlemine uygulanır. Aşağıdaki örnek, ASP.NET uyumluluğunu etkinleştirmek için hizmetini bir hizmete uygular AspNetCompatibilityRequirementsAttribute ve işlemi önbelleğe almak üzere yapılandırılır GetCustomer . AspNetCacheProfileAttribute özniteliği, kullanılacak önbellek ayarlarını içeren bir önbellek profili belirtir.

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

Ayrıca, aşağıdaki örnekte gösterildiği gibi Web.config dosyasında ASP.NET uyumluluk modunu açın.

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

Uyarı

ASP.NET uyumluluk modu açık değilse ve AspNetCacheProfileAttribute kullanılırsa bir özel durum oluşturulur.

tarafından AspNetCacheProfileAttribute belirtilen önbellek profili adı, Web.config yapılandırma dosyanıza eklenen bir önbellek profilini tanımlar. Önbellek profili, aşağıdaki yapılandırma örneğinde gösterildiği gibi öğesinde <outputCacheSetting> ile tanımlanır.

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

Bu, ASP.NET uygulamalarda kullanılabilen yapılandırma öğesiyle aynıdır. ASP.NET önbellek profilleri hakkında daha fazla bilgi için bkz OutputCacheProfile. . Web HTTP hizmetleri için önbellek profilindeki en önemli öznitelikler şunlardır: cacheDuration ve varyByParam. Bu özniteliklerin her ikisi de gereklidir. cacheDuration yanıtın saniyeler içinde önbelleğe alınması gereken süreyi ayarlar. varyByParam , yanıtları önbelleğe almak için kullanılan bir sorgu dizesi parametresi belirtmenize olanak tanır. Farklı sorgu dizesi parametre değerleriyle yapılan tüm istekler ayrı ayrı önbelleğe alınır. Örneğin, öğesine http://MyServer/MyHttpService/MyOperation?param=10ilk istek yapıldıktan sonra aynı URI ile yapılan sonraki tüm istekler önbelleğe alınmış yanıt döndürülür (önbellek süresi dolmadığı sürece). Aynı olan ancak parametre sorgu dizesi parametresi için farklı bir değere sahip benzer bir isteğin yanıtları ayrı olarak önbelleğe alınır. Bu ayrı önbelleğe alma davranışını istemiyorsanız "yok" olarak ayarlayın varyByParam .

SQL Önbelleği Bağımlılığı

Web HTTP hizmeti yanıtları bir SQL önbellek bağımlılığıyla da önbelleğe alınabilir. WCF Web HTTP hizmetiniz SQL veritabanında depolanan verilere bağımlıysa, SQL veritabanı tablosundaki veriler değiştiğinde hizmetin yanıtını önbelleğe almak ve önbelleğe alınan yanıtı geçersiz kılabilirsiniz. Bu davranış tamamen Web.config dosyasında yapılandırılır. İlk olarak öğesinde <connectionStrings> bir bağlantı dizesi tanımlayın.

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

Ardından, aşağıdaki yapılandırma örneğinde gösterildiği gibi öğenin içindeki><system.webbir <caching> öğe içinde SQL önbelleği bağımlılığını etkinleştirmeniz gerekir.

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

Burada SQL önbellek bağımlılığı etkinleştirilir ve 1000 milisaniyelik bir yoklama süresi ayarlanır. Yoklama süresi her geçtiğinde veritabanı tablosu güncelleştirmeler için denetlenir. Değişiklikler algılanırsa, önbelleğin içeriği kaldırılır ve hizmet işlemi bir sonraki çağrılışında yeni bir yanıt önbelleğe alınır. öğesinin <sqlCacheDependency> içine veritabanlarını ekleyin ve aşağıdaki örnekte gösterildiği gibi öğesinin <databases> içindeki bağlantı dizesi başvurun.

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

Ardından, aşağıdaki örnekte gösterildiği gibi öğesi içindeki <caching> çıktı önbelleği ayarlarını yapılandırmanız gerekir.

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

Burada önbellek süresi 60 saniyeye ayarlanır, varyByParam yok olarak ayarlanır ve sqlDependency iki nokta üst üste ile ayrılmış veritabanı adı/tablo çiftlerinin noktalı virgülle ayrılmış listesi olarak ayarlanır. içindeki MyTable veriler değiştirildiğinde, hizmet işlemi için önbelleğe alınmış yanıt kaldırılır ve işlem çağrıldığında yeni bir yanıt oluşturulur (hizmet işlemi çağrılarak), önbelleğe alınır ve istemciye döndürülür.

Önemli

ASP.NET bir SQL veritabanına erişmek için ASP.NET SQL Server Kayıt Aracı'nı kullanmanız gerekir. Ayrıca, veritabanı ve tablo için uygun kullanıcı hesabı erişimine izin vermelisiniz. Daha fazla bilgi için bkz . Web Uygulamasından SQL Server'a Erişme.

Koşullu HTTP GET Tabanlı Önbelleğe Alma

Web HTTP senaryolarında koşullu HTTP GET genellikle http belirtiminde açıklandığı gibi akıllı HTTP önbelleğe alma uygulamak için hizmetler tarafından kullanılır. Bunu yapmak için hizmetin HTTP yanıtında ETag üst bilgisinin değerini ayarlaması gerekir. Belirtilen ETag'lerden herhangi birinin geçerli ETag ile eşleşip eşleşmediğini görmek için HTTP isteğindeki If-None-Match üst bilgisini de denetlemesi gerekir.

GET ve HEAD istekleri için bir CheckConditionalRetrieve ETag değeri alır ve isteğin If-None-Match üst bilgisinde denetler. Üst bilgi varsa ve bir eşleşme varsa, WebFaultException HTTP durum kodu 304 (Değiştirilmedi) olan bir oluşturulur ve yanıta eşleşen ETag ile bir ETag üst bilgisi eklenir.

Yöntemin CheckConditionalRetrieve bir aşırı yüklemesi son değiştirme tarihini alır ve isteğin If-Modified-Since üst bilgisine göre denetler. Üst bilgi varsa ve kaynak o zamandan beri değiştirilmediyse, WebFaultException HTTP durum kodu 304 (Değiştirilmedi) olan bir oluşturulur.

PUT, POST ve DELETE istekleri için kaynağın CheckConditionalUpdate geçerli ETag değerini alır. Geçerli ETag değeri null ise, yöntem If-None- Match üst bilgisinin "*" değerine sahip olup olmadığını denetler. Geçerli ETag değeri varsayılan bir değer değilse, yöntem geçerli ETag değerini isteğin If- Match üst bilgisinde denetler. Her iki durumda da, beklenen üst bilgi istekte yoksa veya değeri koşullu denetimi karşılamıyorsa ve yanıtın ETag üst bilgisini geçerli ETag değerine ayarlarsa, yöntem WebFaultException http durum kodu 412 (Önkoşul Başarısız) ile oluşturur.

CheckConditional Hem yöntemler hem SetETag de yöntem, yanıt üst bilgisinde ayarlanan ETag değerinin HTTP belirtimine göre geçerli bir ETag olmasını sağlar. ETag değerinin çift tırnak içinde çevrelenmesi, henüz mevcut değilse ve herhangi bir iç çift tırnak karakterinden doğru şekilde kaçılması da buna dahildir. Zayıf ETag karşılaştırması desteklenmez.

Aşağıdaki örnekte bu yöntemlerin nasıl kullanılacağı gösterilmektedir.

[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;
    }
}

Güvenlikle İlgili Dikkat Edilmesi Gerekenler

Yanıt önbellekten sunulduğunda yetkilendirme gerçekleştirilmediğinden, yetkilendirme gerektiren isteklerin yanıtları önbelleğe alınmamalıdır. Önbelleğe Alma bu tür yanıtlar ciddi bir güvenlik açığına neden olabilir. Genellikle, yetkilendirme gerektiren istekler kullanıcıya özgü veriler sağlar ve bu nedenle sunucu tarafı önbelleğe alma bile yararlı olmaz. Böyle durumlarda istemci tarafı önbelleğe alma veya hiç önbelleğe almama daha uygun olacaktır.