Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Yaşam Süresi örneği, paylaşılan WCF hizmet örnekleri için özel yaşam süresi hizmetleri sağlamak üzere bir Windows Communication Foundation (WCF) uzantısının nasıl yazılmasını gösterir.
Uyarı
Bu örnek için kurulum yordamı ve derleme yönergeleri bu makalenin sonunda bulunur.
Paylaşılan örnekleme
WCF, hizmet örnekleriniz için çeşitli depolama modları sunar. Bu makalede ele alınan paylaşılan örnekleme modu, bir hizmet örneğinin birden çok kanal arasında paylaşılmasına olanak sağlar. İstemciler hizmetteki bir fabrika yöntemiyle iletişim kurabilir ve iletişimi başlatmak için yeni bir kanal oluşturabilir. Aşağıdaki kod parçacığı, bir istemci uygulamasının mevcut bir hizmet örneğine nasıl yeni kanal oluşturduğunu gösterir:
// Create a header for the shared instance id
MessageHeader shareableInstanceContextHeader = MessageHeader.CreateHeader(
CustomHeader.HeaderName,
CustomHeader.HeaderNamespace,
Guid.NewGuid().ToString());
// Create the channel factory
ChannelFactory<IEchoService> channelFactory =
new ChannelFactory<IEchoService>("echoservice");
// Create the first channel
IEchoService proxy = channelFactory.CreateChannel();
// Call an operation to create shared service instance
using (new OperationContextScope((IClientChannel)proxy))
{
OperationContext.Current.OutgoingMessageHeaders.Add(shareableInstanceContextHeader);
Console.WriteLine("Service returned: " + proxy.Echo("Apple"));
}
((IChannel)proxy).Close();
// Create the second channel
IEchoService proxy2 = channelFactory.CreateChannel();
// Call an operation using the same header that will reuse the shared service instance
using (new OperationContextScope((IClientChannel)proxy2))
{
OperationContext.Current.OutgoingMessageHeaders.Add(shareableInstanceContextHeader);
Console.WriteLine("Service returned: " + proxy2.Echo("Apple"));
}
Diğer örnekleme modlarından farklı olarak, paylaşılan örnekleme modu, hizmet örneklerinin serbest bırakılması için benzersiz bir yönteme sahiptir. Varsayılan olarak, tüm kanallar bir InstanceContext için kapatıldığında, WCF hizmet çalışma zamanı, hizmetin InstanceContextMode olarak mı yoksa PerCall olarak mı yapılandırıldığını kontrol eder; eğer yapılandırılmışsa, örneği serbest bırakır ve kaynakları geri kazanır. Bir özel IInstanceContextProvider kullanılıyorsa, WCF sağlayıcı uygulamasının IsIdle yöntemini, instance serbest bırakılmadan önce çağırır. Eğer IsIdletrue döndürülürse, örnek serbest bırakılır; aksi takdirde, IInstanceContextProvider implementasyonu bir geri çağırma yöntemi kullanarak Dispatcher'ü boşta durumundan haberdar etmekle sorumludur. Bu, sağlayıcının NotifyIdle yöntemi çağrılarak yapılır.
Bu örnek, 20 saniyelik boşta bekleme süresiyle InstanceContext salınımını nasıl geciktirebileceğinizi gösterir.
InstanceContext'i Genişletme
WCF'de, InstanceContext hizmet örneği ile Dispatcherarasındaki bağlantıdır. WCF, genişletilebilir nesne desenini kullanarak yeni durum veya davranış ekleyerek bu çalışma zamanı bileşenini genişletmenize olanak tanır. Genişletilebilir nesne deseni WCF'de mevcut çalışma zamanı sınıflarını yeni işlevsellikle genişletmek veya bir nesneye yeni durum özellikleri eklemek için kullanılır. Genişletilebilir nesne deseninde üç arabirim vardır: IExtensibleObject<T>, IExtension<T>ve IExtensionCollection<T>.
Arabirim IExtensibleObject<T> , işlevlerini özelleştiren uzantılara izin vermek için nesneler tarafından uygulanır.
IExtension<T> arabirimi, T türündeki sınıfın uzantısı olabilecek nesneler tarafından uygulanır.
Ve son olarak, IExtensionCollection<T> arabirimi, IExtension<T> uygulamalarının bir koleksiyonudur ve bunlar, IExtension<T> uygulamalarını türlerine göre almaya olanak tanır.
Bu nedenle, InstanceContext'yi genişletmek için IExtension<T> arayüzünü uygulamanız gerekir. Bu örnek projede CustomLeaseExtension sınıfı bu uygulamayı içerir.
class CustomLeaseExtension : IExtension<InstanceContext>
{
}
Bu IExtension<T> arabirim, Attach ve Detach olmak üzere iki yönteme sahiptir. Adlarının da belirttiği gibi, çalışma zamanı uzantıyı sınıfın bir örneğine ekleyip ayırdığında bu iki yöntem çağrılır InstanceContext . Bu örnekte, uzantının geçerli örneğine ait Attach nesnesini izlemek için InstanceContext yöntemi kullanılır.
InstanceContext owner;
public void Attach(InstanceContext owner)
{
this.owner = owner;
}
Ayrıca, genişletilmiş yaşam süresi desteği sağlamak için uzantıya gerekli uygulamayı eklemeniz gerekir. Bu nedenle, ICustomLease arabirimi istenen yöntemlerle bildirilir ve CustomLeaseExtension sınıfında gerçekleştirilir.
interface ICustomLease
{
bool IsIdle { get; }
InstanceContextIdleCallback Callback { get; set; }
}
class CustomLeaseExtension : IExtension<InstanceContext>, ICustomLease
{
}
WCF, IsIdle yöntemini IInstanceContextProvider uygulamasında çağırdığında, bu çağrı IsIdle'ın CustomLeaseExtension yöntemine yönlendirilir. Ardından, CustomLeaseExtension kendi özelleştirilmiş durumunu kontrol eder ve InstanceContext boşta mı değil mi diye bakar. Eğer boşta ise, true değerini döndürür. Aksi takdirde, belirlenen uzatılmış yaşam süresi için bir süreölçer başlatır.
public bool IsIdle
{
get
{
lock (thisLock)
{
if (isIdle)
{
return true;
}
else
{
StartTimer();
return false;
}
}
}
}
Zamanlayıcının Elapsed olayında, başka bir temizleme döngüsü başlatmak için Dispatcher'daki geri çağırma işlevi çağrılır.
void idleTimer_Elapsed(object sender, ElapsedEventArgs args)
{
lock (thisLock)
{
StopTimer();
isIdle = true;
Utility.WriteMessageToConsole(
ResourceHelper.GetString("MsgLeaseExpired"));
callback(owner);
}
}
Boşta durumuna taşınan örnek için yeni bir ileti geldiğinde çalışan zamanlayıcıyı yenilemenin bir yolu yoktur.
Örnek, IInstanceContextProvider kullanarak IsIdle metoduna yapılan çağrıları yakalar ve CustomLeaseExtension metoduna yönlendirir. Uygulama IInstanceContextProvider sınıfında yer alır CustomLifetimeLease .
IsIdle WCF hizmet örneğini serbest bırakmak üzere olduğunda yöntemi çağrılır. Ancak, ServiceBehavior ISharedSessionInstance koleksiyonunda belirli IInstanceContextProvider bir uygulamanın yalnızca bir örneği vardır. Bu, WCF InstanceContext yöntemini denetlediğinde IsIdle kapalı olup olmadığını bilmenin hiçbir yolu olmadığı anlamına gelir. Bu nedenle, bu örnek, IsIdle yöntemine yönelik istekleri sıralamak için iş parçacığı kilitleme mekanizmasını kullanır.
Önemli
Serileştirme uygulamanızın performansını ciddi şekilde etkileyebileceğinden iş parçacığı kilitlemeyi kullanmak önerilen bir yaklaşım değildir.
Özel bir üye alanı, sınıfın boşta olma durumunu izlemek için kullanılır ve CustomLifetimeLease yöntemiyle döndürülür. Her seferinde IsIdle yöntemi çağrıldığında, isIdle alanı döndürülür ve false olarak sıfırlanır. Dispatcher'ın false yöntemini çağırdığından emin olmak için, bu değeri NotifyIdle olarak ayarlamak önemlidir.
public bool IsIdle(InstanceContext instanceContext)
{
get
{
lock (thisLock)
{
//...
bool idleCopy = isIdle;
isIdle = false;
return idleCopy;
}
}
}
IInstanceContextProvider.IsIdle yöntemi false döndürürse, Dispatcher NotifyIdle yöntemini kullanarak bir geri çağırma işlevi kaydeder. Bu yöntem, serbest bırakılan InstanceContext için bir başvuru alır. Bu nedenle, örnek kod ICustomLease türü uzantısını sorgulayabilir ve genişletilmiş durumda ICustomLease.IsIdle özelliğini kontrol edebilir.
public void NotifyIdle(InstanceContextIdleCallback callback,
InstanceContext instanceContext)
{
lock (thisLock)
{
ICustomLease customLease =
instanceContext.Extensions.Find<ICustomLease>();
customLease.Callback = callback;
isIdle = customLease.IsIdle;
if (isIdle)
{
callback(instanceContext);
}
}
}
Özellik ICustomLease.IsIdle denetlenmeden önce, Callback özelliği ayarlanmalıdır çünkü bu, boşta kaldığında Dispatcher'a CustomLeaseExtension bildirimde bulunmak için gereklidir. Eğer ICustomLease.IsIdletrue döndürürse, isIdle özel üye CustomLifetimeLease içinde basitçe true olarak ayarlanır ve geri çağırma metodunu çağırır. Kod bir kilit içerdiğinden, diğer iş parçacıkları bu özel üyenin değerini değiştiremez. Bir sonraki çağrıda Dispatcher, IInstanceContextProvider.IsIdle öğesini çağırır, true öğesini döndürür ve Dispatcher'ın örneği serbest bırakmasına izin verir.
Artık özel uzantının temel çalışması tamamlandı, hizmet modeline bağlanmalıdır. Uygulama CustomLeaseExtension'yı InstanceContext ile entegre etmek için, WCF IInstanceContextInitializer'ün önyüklemesini gerçekleştiren InstanceContext arabirimini sağlar. Örnekte, CustomLeaseInitializer sınıfı bu arabirimi uygular ve yöntemin başlatılmasından CustomLeaseExtension örneğini Extensions koleksiyonuna ekler. Bu yöntem InstanceContext başlatılırken Dispatcher tarafından çağrılır.
public void InitializeInstanceContext(InstanceContext instanceContext,
System.ServiceModel.Channels.Message message, IContextChannel channel)
//...
IExtension<InstanceContext> customLeaseExtension =
new CustomLeaseExtension(timeout, headerId);
instanceContext.Extensions.Add(customLeaseExtension);
}
Sonuç olarak, IInstanceContextProvider uygulaması kullanılarak IServiceBehavior uygulaması hizmet modeline bağlanır. Bu uygulama sınıfına CustomLeaseTimeAttribute yerleştirilir ve ayrıca bu davranışı bir öznitelik olarak göstermek için temel sınıftan Attribute türetilir.
public void ApplyDispatchBehavior(ServiceDescription description,
ServiceHostBase serviceHostBase)
{
CustomLifetimeLease customLease = new CustomLifetimeLease(timeout);
foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers)
{
ChannelDispatcher cd = cdb as ChannelDispatcher;
if (cd != null)
{
foreach (EndpointDispatcher ed in cd.Endpoints)
{
ed.DispatchRuntime.InstanceContextProvider = customLease;
}
}
}
}
Bu davranış, CustomLeaseTime özniteliğiyle açıklama eklenerek örnek bir servis sınıfına eklenebilir.
[CustomLeaseTime(Timeout = 20000)]
public class EchoService : IEchoService
{
//…
}
Örneği çalıştırdığınızda, işlem istekleri ve yanıtları hem hizmet hem de istemci konsol pencerelerinde görüntülenir. Hizmeti ve istemciyi kapatmak için her konsol penceresinde ENTER tuşuna basın.
Örneği ayarlamak, derlemek ve çalıştırmak için
Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.
Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örneklerioluşturma başlığındaki yönergeleri izleyin.
Örneği tek bir makine veya makineler arası bir yapılandırmada çalıştırmak için, Windows Communication Foundation örneklerini çalıştırmayönergelerini izleyin.