complus.

Transkript

complus.
Nedir Bu COM
Geçtiğimiz uzun yıllar boyunca programcılık tek parça uygulama geliştirmekten ibaretti.
Monolithic (tek parça) uygulamalarda bir veya birden fazla fonksiyonalite bir arada
bulunuyordu. Böyle bir ortamda ise uygulamaların çalışabilmesi için IBM tarafından
geliştirilmiş server teknolojisi olan mainframe sunucular kullanılmaktaydı. Ancak geniş
monolithic uygulamalarda tek sorun sunuculara yapılan yatırımlar değildi. Yazılım geliştirici
tarafındada bir çok problemle karşılaşılıyordu. Bu problemlerin belli başlılarını arasında
monolithic uygulamaların geliştirilmesinin uzun bir süre alması, bakım ve uygulamada
yapılacak düzeltme, yeni özellik ekleme gibi işlemlerinin zor olması ve çok efor gerektirmesi
ve günümüzde hakim olan yazılım geliştirme mimarisi ve mantığına aykırı olarak monolithic
uygulamalarda yazılmış olan bir işlevsellik veya bir özellik taşıyan bileşen aynı programlama
dilinde yazılmış olsa bile başka bir uygulamada kullanılamaması ve yazılım geliştiricilerin
yeni uygulama için aynı kodu tekrar yazmak zorunda kalması veya uygulamanın bir kısmını
değiştirilmesinin,kaldırılmasının istenmesi durumunda bile tüm uygulamanın kodu üzerinde
değişiklik yapılması gerekmesi bulunmaktadır.
Zamanla yazılım dünyasındaki bu probleme karşı çözümler geliştirilmiştir. Bu çözümlerden
ilki uygulamaları server (sunucu) ve client (istemci) tarafına bölmektir. Client/Server Model
adı verilen bu çözümde arayüzün ve bazı işlemlerin clientta, data erişimi ve diğer işlemlerin
serverda bulunacak şekilde paylaştırılması sonucu monolithic uygulamaların kompleksliğine
kısmen çözüm bulunabilmesine karşın bileşenlerin tekrar kullanılamaması sorununa çözüm
geliştirememiştir. Yani Visual Basic’te yazılmış bir bileşeni C temelli diller desteklemiyor,
kullanamıyordu yada C temelli bir dille yazılmış bir bileşen Visual Basic de kullanılamıyordu.
Diğer bir çözüm yöntemi olarak geliştirilen Component Model (Bileşen Modeli) hem
monolithic hemde Client/Server uygulamaların problemlerine çözüm bulmuştur. Artık yazılım
geliştiriciler geliştirdikleri uygulamaları bileşenler ile yazarak bu bileşenleri ileride başka
projelerde tekrar kullanabiliyorlardı.
COM (Component Object Model) uzun zamandır yazılım dünyasının karşılaştığı birçok
probleme çözüm olan ve sürekli yenilenerek zamana ayak uyduran bir teknolojidir. Bu
teknolojinin yaratılmasının arkasında bulunan temel düşünce yazılım bileşenlerinin en az
işgücü ile en verimli biçimde yeniden kullanılabilmesidir. Bu tanım bir yazılım geliştirici için
daha önceden yazılmış olan bir kodun tekrar yazılmaması, bir IT yöneticisi için ise bu kodun
tekrar yazılmasından kaynaklanan maliyet ve zamandan tasarruf demektir.
Nesne tabanlı bir programlama modeli olan COM uygulamaların birlikte kullanılabilirliğini
sağlamıştır. Yani iki veya daha fazla uygulama veya bu uygulamalara ait bileşenler
birbirleriyle iletişim sağlayabilmektedirler. Burada esas can alıcı nokta bu uygulamaların
farklı dillerde yazılmış olduklarında ve hatta farklı bilgisayarlar üzerinde bulunan farklı
işletim sistemleri üzerinde çalışıyor olmaları durumunda bile bu iletişimin başarıyla
sağlanmasıdır.
COM ve .NET
COM ile server tabanlı uygulama geliştirmenin faydaları arasında yazılım geliştiricilerin
COM uygulamalarını farklı diller ile farklı platformlar (Unix vs.) için geliştirilmiş olsalar bile
uygulamaların birbirleri ile çalışabilir bir yapıda olmaları, COM nesneleri başka makinelerde
olsalar bile client programın bir parçasıymış gibi çalışabilmeleri,COM bileşeni geliştirmek
Tamer Öz
www.tameroz.com
için gerekli olan standartlar Interface ler ile sağlandı, böylece bir programın COM nesnesini
kullanırken Interface leri kullanarak COM nesnesine erişebilmesi, Versiyon özelliği yani her
bir class a yeni interfaceler ekleyerek ek işlevselliklerin katılması ve bu işlevsellik katılırken
uygulamayı halihazırda kullanan kullanıcıların herhangi bir kesinti yaşamaması,bir COM
nesnesinin, COM arayüzlerini oluşturmayı destekleyen bir programlama dili ile çok hızlı bir
şekilde gerliştirilebilmesi, örneğin VB 6.0, C++ gibi diller varsayılan olarak COM
standartlarına uyum sağlaması bulunur.
COM Server tabanlı program geliştirmede birçok soruna çözüm olmasına rağmen zamanla
ortaya bazı diğer sorunlar çıkmıştır. Ortaya çıkan bu sorunlara COM’un çözüm
sağlayamamasına karşın .NET Framework bu sorunla çözüm olmuştur.
.NET Framework’un çözüm getirdiği konular;Bir COM uygulamasının belirli bir platform
için geliştirilmesi sonucu sadece o platformda çalışabilir olmasıdır. Ancak .NET
teknolojisinde geliştirilen çözüm .Net dillerinden herhangi biri kullanılarak yazılmış
bileşenlerin MSIL (Microsot Intermediate Language) ‘e derlenmesi ve kullanılacak
platformda CLR(Common Language Runtime) yüklü olması sonucu her platformda çalışabilir
olmasısır. Bunun yanı sıra COM’un cevap veremediği diğer bir sorun ise .NET’te geliştirilmiş
uygulamaların sadece kendi yetkileri olan memory alanlarına erişebilmesidir. Yani çalışan bir
uygulama diğer bir uygulamaya özel değişkenlere erişemez ve diğer uygulamanın
kilitlenmesine sebep olamaz. .NET’i ön plana çıkaran bir diğer özellik ise daha gelişmiş bir
versiyon kontrol mekanizmasını barındırmasıdır. COM’da bulunan ve biraz önce
incelediğimiz versiyonlama özelliğine ek olarak .NET’te uygulamanın eski sürümünün eski
istemcilere hizmet vermeye devam etmesinin garanti altına alınması vede yeni halinin ise yeni
istemcilerde kullanılabiliyor olması sağlanmıştır.
Birçok kişi tarafından COM+ programcılığının eskidiği düşünülse bile COM+ sundugu
enterprise-level (genis çaplı) uygulamalar halen gelistiriciler tarafından .NET e
uygulanmaktadır ve .NET su an COM+ servislerine tam erişim hakkı vermektedir. Bunun
yanı sıra bunu bildiğiniz veya sevdiğiniz programlama dilini kullanarak geliştirme şansı
sunmaktadır. Eğer enterprise-level uygulamalar yazacaksanız COM+ servislerinin
avantajlarından yararlanmak bazı noktalarda kaçınılmaz olacaktır.
COM+ Servisleri
Geliştirilmiş başarılı bir uygulamanın altyapısının aynı anda birden çok kullanıcı tarafından
kullanılabileceğinin düşünülmesi, bu kullanıcıların herbirinin aynı yetkilere sahip
olmayacağından dolayı yetkilendirme ve güvenlik, aynı anda bazı datalarda işlem
yapılmasından dolayı kaynaklanacak problemler, veri tutarlılığı problemlerine ait çözüm
geliştirilmesi çok uzun zamanlar alabilecek bir geliştirme süreci içermektedir. Ancak
COM+’da bu problemlere ait çözümler geliştirilmiş olarak hazırda bulunmaktadır. COM+
servislerinin bu avantajı sayesinde uygulama geliştirme süreleri kısalmakta ve yazılım
geliştiriciler daha verimli çalışabilmektedir. Bu servisler transaction, kaynak yönetimi,
senkronizasyon ve güvenlik gereksinimlerini karşılayabilmektedir. Şimdi bu temel servislerin
neler olduğunu basitçe inceleyelim.
Transactionlar
Transactionların veri tutarlılığı ve uygulama stabilitesi bakımından kullanılması
kaçınılmazdır. Çok kullanıcılı bir Distributed Application (Dağıtık Uygulama) da
Tamer Öz
www.tameroz.com
değişikliklerin veritabanında bulunan tablolara ve hatta bazen diğer nesnelere(örn message
queue) yansıması gerekebilir. Böyle bir durumda uygulamada birbirine bağlı birden fazla iş
yapılmaktadır ve bu işlerden sadece birinin bile başarısız olma durumunda uygulamanın bunu
yakalayıp aksiyonda bulunması gerekmektedir. Yapılan iş tutarsız(kararsız) bir şekilde yani
bir kısmı yapılmış bir kısmı yapılmamış bir şekilde bırakılamaz. Burada transaction devreye
girer. Transaction yapılan işlerin toplu olarak başka bir iş gurubunda bulunması gibi
düşünülürse alt iş guruplarından herhangi birinde bir hata oluştuğunda kapsayan gurubun
işleminin yapılamayacağı anlamına gelir. Transactionlar ya hep ya hiç prensibine göre çalışır.
İşlemlerin ya tamamı gerçekleştirileceğinden yada hiçbiri gerçekleştirilmeyeceğinden veri
tutarsız bir şekilde kalmayacaktır.
Database işlemlerinde ve diğer işlemlerde transactionların birlikte kullanılmasının bir
uygulamaya adapte edilmesi çok zordur. Ancak COM+ bu transaction yönetim sistemini
altyapısının bir parçası olarak sunar. COM+ bileşenler aktive olduğu anda otomatik olarak
transactionlarınıda yaratır. Bu sayede bileşenlere transactional herhangi bir kod yazmak
zorunda kalmayız.
Compensating Resource Managers(Telafi Edici Kaynak Yöneticileri)
COM+ transaction yapısı içermeyen bileşenlerin transaction içinde yeralabilmeleri için
Compensating Resource Managers (CRM) denilen bir yapı sunar. Bu yapı sayesinde bu
bileşenleri bir transaction içinde kullanarak gerekli durumlarda yapılmış değişiklikleri geri
alabiliriz.
Resource Management (Kaynak Yönetimi)
Bir uygulama çok client tarafından kullaılıyorsa uygulamadaki nesneler kaynak paylaşımında
bulunmalıdır. Bu paylaşım çoğu zaman veri tabanı, diski hafıza, bant genişliği şeklinde
olabilir. Bu kaynaklar sadece gerektiği zamanlarda ve en verimli şekilde kullanmalıdır.
COM+ faydası tartışılmayan bu hizmetleri Just In Time (JIT) Activation ve Object Pooling
adı verilen iki servis ile sunmaktadır.
Just In Time (JIT) Activation (Tam Zamanında Aktivasyon)
COM+ de yer alan kaynak yönetimi ile ilgili bu servis bir nesnenin sadece çağrıldığı zaman
aktive olması ve işi bittiği zaman hafızadan silinmesi temeline dayalıdır. Bu şekilde hafızadan
kazanç sağlanmış olur. Server bu sayede daha fazla client yükünü kaldırabilecekdir. Bu
servisin adı yaptığı işle benzer olarak tam zamanında aktivasyon olarak belirlenmiştir. Bir
nesnenin bir metoduna client tarafından istekte bulunulduğunda COM+ nesneyi yaratır ve
aktive eder. Nesneye yapılan istek bittiğinde yani metod cevabı döndürdüğünde COM+
nesneyi hafızadan kaldırmak suretiyle deaktive eder. Daha sonraki işlemlerde bu nesne her
çağrıldığında aktive edilip tekrar deaktive edilecektir.
Object Pooling (Nesne Havuzları)
COM+ tarafından sağlanan bu otomatik servis sayesinde uygulamada bulunan bileşenlerin
belirtilen sayıda birer instanceleri (örnek) hafızada bulunan havuzda kullanıma hazır olarak
saklanır. Bu sayede Object Creation Time dan (Nesne Yaratım Zamanı)kazanç elde edilmiş
olur. Pool Size (hafızada hazır bulunacak nesne sayısı) ve time out (zaman aşımı) süresi
Tamer Öz
www.tameroz.com
bileşen özelliklerinden ayarlanabilir. Örneğin bir bileşen hafızada 10 örnek yaratılmışsa yani
pool size’ı 10 olarak belirlenmişse 11. istek geldiği zaman timeout süresi kadar hafızadaki bir
nesnenin işinin bitmesi beklenir, biterse o nesnenin yerini 11. istek alır bitmezse geriye hata
döner. Bir uygulama tarafından çok sık kullanılan bileşenlerde yaratma zamanının sebep
olduğu gecikmeler ve yavaşlamaların önüne geçilebilmesi için gerekli ve çok kullanılan bir
servistir.
Synchronization (Senkronizasyon)
Distributed Applicationlar (dağıtık uygulamalar) aynı anda birden fazla client tarafından
kullanılabilmeli ve client lardan gelen bu istekleri eşzamanlı olarak karşılayabilmektedirler.
Aynı zamanda bu uygulamalardaki iş kuralları birçok farklı bilgisayarda aynı anda thread ler
kullanarak işlem yapabilmelidir. Çoklu bilgisayarlarda çoklu thread yönetimi yazılım
geliştirici bakımından geliştirilmesi oldukça zordur. COM+ basit bir eş zamanlı çalışma
modeli sunarak bu ağır kodlama gerektiren senkronizasyon işlemi ile vakit kaybedilmemesi
için büyük bir avantaj sunmaktadır.
COM+’ın sunduğu bu servis aktiviteler sayesinde sağlanır. Aktivite bir nesnenin client
tarafından istenip yaratılmasından sonra çalışma süreci boyunca ilerleyip serbest bırakılması
sürecine kadar geçen ve client’ın nesneye eriştiği zaman aralığını kapsar. Nesnein bu isteklere
cevap verebilmesi için aynı aktiviteye ait ek COM+ nesneleri yaratması gerekmektedir.
Aktivite sayesinde yazılım geliştiriciler tek kullanıcı gibi düşünerek çoklu kullanıcıya hizmet
edebilen programları gayet kolaylıkla yazabilmektedir.
Security (Güvenlik)
Uygulamanın birden fazla client tarafından kullanılabilirliğinden dolayı kuşkusuz olarak
authentication (doğrulama) ve authorization (izin verme) mekanizmalarının COM+ tarafından
içerilmesi kaçılnılmazdır. Bu sayede sadece uygulamada işlem yapabilecek kullanıcıların
uygulamaya erişebilmesi dolayısıyla uygulamanın güvenliği sağlanmış olmaktadır.
COM+’ın güvenlik mekanizmasının temelinde roller tanımlanması ve bu rollerin
yetkilendirilmesi yatmaktadır. Roller Windows NT tabanlı kullanıcılar ve guruplardan
yaratılır ve rollere belirli classlardaki (sınıf) belirli interfaceler atanır. Daha sonra bu rollere
Sistemde bulunan (Windows NT tabanlı kullanıcılar ve guruplar) kullanıcılar atanarak sadece
izin verilen nesnelere erişmeleri COM+ tarafından yazılım geliştircinin ekstra hiçbir kod
yazmasına gerek duyulmaksızın denetlenir.
Loosely Coupled Events (İnce Bağlı Olaylar)
Birçok event handling (olay tutucu) sistemde olay kaynağı ve olay yatırıcısı çalışma
zamanında birbirilerini refere etmelidir. Bu tür bir ilişki sıkı bir çift oluşturmaktadır. Birçok
senaryoda sıkı ilişkili olay çiftlerini yönetmek kolay olmayacaktır. COM+ bu sorunların
aşılması için ince bağlı olaylar adı verilen bir servis sunmaktadır.
Queued Components (Sıralanmış Bileşenler)
Dağıtık uygulamalar her zaman senkron çalışma prensibine dayalı olarak çalışmamakta bazen
asenkron çalışmaları gerekmektedir. Windows XP bize Message Queuing adı verilen bir
Tamer Öz
www.tameroz.com
asenkron servis sunmaktadır. Bu servis sayesinde kaynak makina işlemleri mesajlar olarak
sıralı durabilecekleri bir şekilde oluşturur ve istemciler bu mesajları sıra ile alarak işlerler. Bu
servisin asenkron çalışması sayesinde veri iletişiminin kolaylıkla sağlanabilmesine karşın
uygulamaların bir bileşen üzerindeki metoda asenkron isteklerde bulunmasını
desteklememektedir. COM+ servislerinden Queued Components Message Queuing i
kullanarak bu desteği sunmaktadır.
COM+ Runtime Architecture (COM+ Çalışma Zamanı Mimarisi)
COM+ çalışma zamanı servisleri uygulamanın kodunu surrogate (Com objeler için çalışan
host process) ortamda barındırır. COM+ çalışma zamanı kodun doğru servisleri kullandığını
içinde bileşen genel durumu ve durdurucu metodların çağrılmasını sağlan bir metodun dahil
olduğu birçok mekanizma kullanarak garanti altına alır. Bu mekanizmaların nasıl çalıştığının
iyi anlanması daha verimli COM+ uygulamaları yazabilmek anlamına gelmektedir.
COM+ ve .NET Terminolojisi
COM+ uygulamalarında iki çeşit bileşen vardır. Bunlat configured componenet ve serviced
component dır.
Configured component aslında COM+ ortamında çalışan, uygulamasına dahil olan COM
uygulamalarıdır. Bu uygulamayı yükledikten sonra COM+ servislerini kullanabilmesi için
COM+ kataloğunda bazı ayarlar yapmak gerekmektedir. Bir COM bileşeni DLL(Dynamic
Link Library) veya EXE dosyası olabilirken COM+ bileşenleri sadece DLL dosyalardan
oluşmaktadır. COM bileşenleri oluşturmak için Microsoft Visual Basic 6.0 veya Microsoft
Visual C++ 6.0 kullanılabileceği gibi diğer araçlardanda faydalanılabilir. Yaratılan bu
bileşenler .NET Framework tarafından unmanaged code olarak algılanacaklardır.
Serviced Component ise .NET Framework mantığına göre Common Language Specification
(CLS)’e uygun bir biçimde yazılmış ve System.EnterpriseServices.ServicedComponent
Classından türemiş bir classtan başka bir şey değildir. Bu şekilde oluşturulmuş class lar
COM+ uygulaması içinde yer alabilirler ve tüm servisleri kullanabilirler. Aynı zamanda
serviced componenet bir configured component tır. Tüm .NET Framwork classları COM ile
iletşim sağlayabilecek şekilde olduğundan Serviced components ile unamanged components
arasındaki iletişimde aynı mantıkta olacaktır.
Bileşen
Visual C++ 6.0 Bileşenleri
Visual Basic 6.0 Bileşenleri
Diğer COM Bileşenleri
Serviced Components
Configured Component
Evet
Evet
Evet
Evet
Managed/Unmanaged
Unamanged
Unamanged
Unmanaged
Managed
COM+ Uygulamaları
COM+ uygulamaları configured bileşenlerin bir araya gelmesinden oluşmaktadır. COM+
uygulamaları aynı zamanda bir güvenlik sınırını yapısı olarak koyar. COM+ uygulamaları
Server Uygulaması ve Library uygulaması olmak üzere iki çeşitte olabilir.
Tamer Öz
www.tameroz.com
Surrogate çalıştırılabilir bir görevdir ve DLL olarak oluşturulmuş bir COM bileşenini
barındırabilir. Surrogate Exe uygulamasını çalıştırmak suretiyle uzaktaki bir bilgisayardaki
DLL sunucusunu çalıştırılabilir.
Bir server uygulaması kendisine özel tahsis edilmiş işlemde çalışır. COM+ server
uygulamalarını barındırmak için Dllhost.exe’yi kullanır. Her bir server uygulaması kendi
Dllhost.exe örneğinde çalışmaktadır.
Dllhost.exe surrogate’i COM+ çalışma zamanının çekirdeğini oluşturur. Bileşenlere servisleri
kullanabilmek için gerekli olan thread yönetimi, eş zamanlı bağlantı yönetimi gibi hizmetlerin
altyapısını sunar. Server uygulaması COM+ servislerinin tamamını desteklemektedir.
Library uygulamaları client in işleminde aktive olurlar.Client işlemi unmanaged bir işlem
olabilir. Örneğin IIS üzerinde çalışan bir asp uygulamasının configured bileşeni çağırabilir.
Çoğu durumda bu işlem DllHost.exe nin bir örneği olmasına karşın üzerlerindeki
sınırlamalardan dolayı COM+ ‘ın bazı özelliklerini kullanamazlar.
Kitaplık uygulamalarının sunucu uygulamalarına göre daha iyi performans sağlamalarının
sebebi kitaplık uygulamasında bulunan bir nesneye erişim süresinin işlemler ve bilgisayarlar
arasında dolaşarak erişebilecek bir nesneye erişme süresinden çok daha kısa olmasıdır. Ancak
kitaplık uygulamalarındada connection pooling, queued bileşen yüklenememe, bazı güvenlik
ayarlarının çağırıcıdan yani classımızdan türetilmesinden dolayı bir kısım güvenlik ayarlarını
kullanamama gibi bazı sınırlandırmaları vardır.Ayrıca bir işlemde hata oluşması durumunda
sunucu uygulama sadece dllhost.exe yi sonlandıracak ve diğer çalışmakta olan işlemlere bir
zarar gelmeyecektir. Ancak kitaplık uygulamasındaki hata istemci tarafındaki işlemlerin
tamamen durmasına sebep olacaktır. Bu sebepten dolayı server uygualamaları çoğunlukla
tercih edilmektedir.
Her iki tip uygualamanında birbirine üstünlüklerini inceleyecek olursak Sunucu uygulamalar,
hata oluşturabilecek bir koda karşı izolasyon geliştirilmiştir, queued bileşenleri ve object
poolingi destekler ancak işlemler arası metod çağırmalar çok maliyetlidir. Kitaplık
uygulamalarında ise metod çağırımları daha hızlı olmasına ve istemciye özel bazı kaynaklara
erişilebilmesine rağmen, sunucu uygulamalarındaki avantajları sağlamamaktadır.
COM+ ın yeni versiyonu olan 1.5 numaralı versiyonu geliştirilmiş bir sunucu uygulamayı
windows servis olarak kullanabilme olanağı sunar. Bu ise bilgisayar yeniden başladığında
belirtilen kullanıcı veya sistem hesabının o işlemi yeniden başlatacağı böylece uygulamamızın
sürekli çalışır halde olacağı anlamına gelmektedir. Bileşenleri Windows Service olarak
çalıştırabilmek için My Application Properties penceresinden ve Activation tabından Server
Application’ a tıklandıktan sonra Run Application As NT Service işaretlenmelidir.
COM+ Uygulamalarının İzlenmesi Ve Yönetilmesi
Bilgisayarda yüklü olan COM+ uygulamalarının görülmesi ve yönetilmesi için Component
Services Yönetim Aracı adı verilen araç kullanılır. Bu araç sayesinde bileşen veya uygulama
bazında değişiklik yapılabilir veya bazı uygulamalar durdulup yeniden başlatılabilir. Bu araç
Control Panel’den Administrative Tools altından Component Services tıklanarak
açılabilir..
Tamer Öz
www.tameroz.com
Bu pencerede bilgisayarda yüklü olan COM+ uygulamalarını görmek için sol tarafta bulunan
Component Services klasörü geneişletildikten sonra sırası ile Computers, My Computer,
COM+ Applications klasörleride genişletilir. Sol tarafta gördüğümüz uygulamaların hangi
bileşenlerden oluştuğunu ve bu bileşenleri görmek için sol taraftan uygulamayı seçtikten
sonra Components klasörü çift tıklanır.
Bu bileşenin interfacelerini görmek için interfacelerini görmek istediğimiz bileşen seçildikten
sonra Interfaces klasörü çift tıklanır.
Tamer Öz
www.tameroz.com
Uygulama tipinin server uygulamamı yoksa kitaplık uygulamasımı olacağının belirlenmesi
için aynı pencerede tipini değiştirmek istediğimiz uygulamaya sağ tıklanır ve Properties
menüsü seçilir. Açılan pencerede Activation tabı seçilir ve Library Application veya Server
Application seçeneklerden biri seçildikten sonra OK basılarak pencere kapatılır.
Tamer Öz
www.tameroz.com
Server uygulaması kendisine tahsis edilmiş işlemde çalıştığından bu işlemin durdurup
başlatma gibi opsiyonların olduğu çok açıktır. Ancak COM+ 1.5 ile birlikte artık server
uygulamalarını duraklatıp yeniden başlatmak mümkün hale gelmiştir. Ayrıca herbir kitaplık
veya sunucu uygulamasını veya herbir bileşeni tek tek disable veya enable etme yeteneğinide
beraberinde getirmiştir. Duraklarma ve disable etme opsiyonları kullanımında yeni bir bileşen
aktive olmayacaktır ama halihazırda kullanılmakta olan bileşenler çalışmalarına devam
edeceklerdir. Bir uygulamayı disable ederek o andaki mevcut işlemleri etkilemeden yeni bir
versiyon yüklemek veya bazı düzenlemeler yapmak mümkündür ve bu işlemleri yaparken
hata alma olasılığı düşük olacaktır. Uygulamayı disable ettiğinizde sunucuyu yeniden
başlatsanız bile yeni aktivasyonlar kabul edilmeyecektir, yani sunucu bir önceki durumunu
hatırladığından uygulamayı yeniden enable etmek gerekmektedir.
Uygulamaları durdurmak, başlatmak, enable, disable etmek Component Services Yönetim
aracı sayesinde yapılmaktadır. Bu işlemlerin yapılması istenilen bileşen seçilir ve sağ
tıklanarak açılan menüden ilgili işlem seçilir.
Çalışan uygulamaları bazı hata oluşan durumlarda sadece hata oluşturan işlemi incelemek
istediğinizde uygulamayı duraklatıp o bileşen üzerinden debug işlemi gerçekleştirmek
isteyebilirsiniz. Bu durumda yeni Component Services Yönetim Aracı’nda Running
Processes seçilir ve o an çalışmakta olan işlemlerin arasından duraklatılmak istenen işlem sağ
tıklanır ve açılan menüden pause seçilir.
Applications, Assemblies And Classes (Uygulamalar, Assemblyler ve
Sınıflar)
Bir uygulama birçok assembly’den birçok class barındırıyor olabilir. Bir bileşen bir COM+
uygulamasında kullanılmaya ayarlandıktan sonra başka bir COM+ uygulamasında
kullanılmamalıdır. Bir assembly birden fazla uygulamaya class sağlıyor olabilir. Bunu bir
örnek şekil üzerinden inceleyecek olursak.
COM+ Catalog (COM+ Kataloğu)
COM+ çalışma zamanı mimarisinin çok önemli bir elemanıda COM+ kataloğudur. COM+
kataloğu uygulamalarla ilgili tüm bilgileri tutar. Mesela ismi IlkUygulamam olan ve
IlkBilesenim bileşenini içeren bir server uygulamasına ait tüm veriler burada saklanmaktadır.
En basit anlamda COM+ kataloğu serverda bulunan uygulama adını,türünü ve uygulamada
Tamer Öz
www.tameroz.com
kullanılan bileşenlerin tutulduğu bir veritabanıdır. Aynı zamanda çalışma zamanı
gereksinimleride bu katalogdan sağlanr, yani bir bileşen transaction içinde yer alacaksa bu
bileşen yaratıldığı zaman transactiona girmesi gerektiğini COM+ kataloğu bilir. Component
Services Yönetim Aracında yapılmış olan her tür değişiklik bu katalogda saklanır. Ayrıca bu
ayarları uygun API’leri kullanarakta yönetmek mümkündür.
COM+’da Uygulama Yaratalım
Yeni bir uygulama yaratmak için öncelikle Component Services Yönetim Aracı açılıp
Component Services ve My Computer klasörlerini genişletilmelidir. COM+ Applications
klasörüne sağ tıklanır ve açılan menüden New ve Application seçilir. Karşımıza COM+
Uygulama Yükleme Sihirbazı gelir, ilk pencrede next’e basarak ilerlenir. Karşımıza çıkan
pencereden eğer yeni bir uygulama yaratacaksak Create An Empty Application, daha
önceden Application Export Wizard kullanılarak export edilmiş bir uygulamayı eklemek için
Install Pre-Built Applications seçilir.
Yaratacağımız uygulama yeni bir uygulama olduğundan Create An Empty Application ı
seçtikten sonra uygulamamızın ismini ve tipini belirleyeyip next’e basarız.
Tamer Öz
www.tameroz.com
Bir sonraki adımda ise uygulamamızın sistemde hangi kullanıcı ile çalışacağını seçilir ve
next’e basılır.
Kitabın son kısımlarında inceleyeceğimiz roller yaratılır ve daha sonra.Son ekranda Finish’e
basarak uygulamamızın kurma işlemini biter.
Tamer Öz
www.tameroz.com
Mevcut uygulamamıza bir bileşen eklemek için Component Services Yönetim ekranında
bileşen eklemek istediğimiz uygulamanın altındaki Components klasörüne sağ tıklanır ve
New ve Component seçilir. Shirbazın ilk sayfası next e basılarak geçildikten sonra açılan
pencerede bileşen eklemek için üç seçenek vardır bunlar; Install New Component, Import
Components That Are Already Registered, Install New Event Class dır.Anlamlarını
inceleyecek olursak Install New Component yeni bir bileşen yüklemek için kullanılır,
Import Components That Are Already Registered ise daha önceden Regsvr32.exe ile
sistemin registy kayıtlarına kaydedilmiş bileşenleri uygulamaya katmak içindir, Install New
Event Class ise COM+ Event Service içinde kullanılmış COM+ olaylarını eklemek içindir.
Bu adımdan sonra çıkan pencereden bileşenimizi seçerek Add’e basarız ve next, finish ile
sihirbazdan çıkarız.
Yarattığımız uygulamalardaki bileşenlerin aktivitelerini görmek için Component Services
Yönetim Aracında Distributed Transaction Cordinator seçilir ve daha sonra Transaction
Statistics seçilir. Bu pencereden Transaction istatistikleri izlenebilir.
Context ve Interception
Contextler aynı çalışma zamanı gereksinimlerini barındıran nesneleri guruplamak için
kullanılırlar. Bir COM+ uygulamasında çalışması için yaratılmış bileşenler configured
bileşenlerdir ve bu bileşenlerin çalışma zamanı gereksinimleri COM+ kataloğunda belirli
özelliklerin bir bileşimidir. Çalışma zamanı gereksinimlerinin özellikleri o nesnelerin hangi
COM+ servislerini kullanacaklarını ve bu servisleri nasıl çalıştıracaklarını belirler. Bir
class’ın örneği yaratıldığı zaman COM+ bu örneği çalışabileceği bir ortam olan ve classın
istediği özellikleri taşıyan Context’e koyar. Contextlerin özellikleri tanımlarını daha önce
yaptığımız Senkronizasyon, Transaction, Threading, JIT, Object pooling, Securit
olabilmektedir. Her COM+ nesnesi bir Context gurubu içinde bulunmalıdır. Context’ler ise
Tamer Öz
www.tameroz.com
en az bir COM+ nesnesi içermelidirler. Her class’ın çalışma zamanı gereksinimleri farklı
olabileceğinden class’lar farklı contextlerde yer alabilirler. Dolayısıyla çoğunlukla olduğu
gibi bir işlem birden fazla context kaplıyor olabilir.
İki çeşit context vardır. Bunlar object context ve call context tir. Object context yaşam süreci
boyunca hafızada ve uygulamada kalırken call context sadece çağrıldığı metodun işi bitinceye
kadar aktif kalacaktır. Bu sebepten dolayı call context genelde güvenlik için kullanılır.
Bir istemci serviced bileşen yaratmaya çalıştığı zaman COM+ servisleri yeni bileşenin
özelliklerini COM+ kataloğundan okuyarak belirler ve eğer çalışma zamanı gereksinimleri
aynı ise aynı context içinde, farklı ise farklı bir context içine nesne yaratılır. Aynı context
içindeki nesnelerin iletişiminde bir problem yoktur ancak farklı context’lerde bulunan
nesneler için .NER Enterprise Services bize yönetilebilir bir proxy sunar. Bu proxy bize
sadece gerekli gerekli güvenlik koşullarının sağlandığı zaman diğer context gurubundaki
metodları çağırabilem avantajını getirir.
Ancak Contextlerin bazı özellikleri her context için tekrar yaratılırlar. Bunlar;
Transaction Id : Nesnenin içinde bulunduğu Distributed (dağıtılmış) Tansaction’a ait Id
numarasıdır. Bu numara bir transactionda hangi nesnelerin bulunduğunun anlaşılmasını sağlar
ve transaction ayarlarına göre üretilebilir.
Activity Id : Çalışmakta olan aktivitiye ait Id numarasıdır. Bu numara senkronizasyon için
kullanılmaktadır ve senkronizasyon ayarlarına göre üretilebilir.
Consistent Flag : İşin nesne tarafından tutarlı bir şekilde yapıldığını ve transaction’ın commit
edilebileceğini bildirir. True veya False değerlerini alabilir.
Done Flag : Nesnenin işini yapıp bitirdiğini ve metod içinde deaktive edilebileceğini belirtir.
True veya False Değerlerini alabilir.
COM+ contexti aktivasyonu ve çalışma zamanı özelliklerini belirleyip servislerin bileşenlerde
nasıl etkili olacağına karar verir. Ancak COM+ context ile tamamen farklı bir yapı olan ve
hiçbirzaman iletişim içinde olmayan .NET context sadece çoklu threadler için
senkronizasyonu belirler.
Yukarıda incelediğimiz gibi farklı context’ler arasında metod çağırımları söz konusu olduğu
zaman bir proxy yaratılıyordu. Bu işleme Interception adı verilmektedir. İki çeşit
Interception vardır bunlardan ilki Activation Interception diğeri ise Method-Call
Interception’dur.
Activation Interception bir nesnenin aktive edilmesi veya client trarafından gelen yaratılma
isteğinin COM+ tarafından alınmasından sonra method düzeyinde interception oluşturması
için gereklidir. Bunun yanısıra Object Pooling ve Object Constructor Stringlerinin
Servislerinin COM+ tarafından sunulmasını sağlar. Farklı context’lerde bulunan objeler
arasındaki iletişim sağlanırken bir context ten diğer context e giderken çağrı arada
Interception katmanından geçer ve asıl nesneye erişir, geri dönüştede izlenen yol aynıdır.
Tamer Öz
www.tameroz.com
Method düzeyinde inteception bileşenin çalışabilmesi için gerekli tüm koşulların sağlanmış
olduğu bitr ortamda çalışmasını sağlar vede JIT Activation ve transaction gibi bazı
hizmetlerin nesneye erişimlmesinden önce devreye girmesinde rol oynar.
Interceptionun gerekli olduğu zamanları inceleyecek olursak,
Objeden objeye olan isteklerde : bir objeden bir objeye olan istek hiçbir sınır geçmez. Her iki
nesneninde aynı bilgisayarda ve aynı çalışma zamanı gereksinimlerinde oldukları zaman
gerçekleşir ve çok hızlıdır.
Cross context istekler : farklı contextlerde bulunan yani aynı çalışma zamanı gereksinimleri
bulunmayan bileşenler arasında olan istektir ve nispeten hızlı bir yöntemdir. Bu yönteme
örnek olarak iki bileşen ele alacak olursak ve bu bileşenlerden birinde transaction servisi
gerekli ise ve diğerinde desteklenmiyorsa farklı çalışma zamanı gereksinimlerinden dolayı
farklı contextlerde bulunacaklardır ve metod çağırımları interception üzerinden yapılacaktır.
Cross application calls : iki nesnenin farklı COM+ uygulamalarında bulundukları zaman
gerçekleşir ve her metod çağrılışında bileşenler farklı uygulamalarda olduklarından farklı
güvenlik sınırlandırmalarına tabi olduklarından interception gereklidir.
Cross appdomain calls : bu call eğer iki nesneninde farklı .Net frameworkleri uygulama
domaini üzerinde yeralması durumunda gerçekleşir. Uygulamalar birbirinden tamamen
bağımsızdır. Böyle bir uygulamada remoting ve interception kullanılması şarttır.
Tamer Öz
www.tameroz.com
.NET Enterprise Servisleri için Asseblyleri Ayarlamak
Sınıflar ve asseblylerin .Net Enterprise servislerine erişimleri özellikler(attributes) sayesinde
ayarlanabilir. Özellikler çalışma zamanı veya kayıt zamanında belirlenerek bir sınıfın hangi
servisleri alabileceği ve servisleri nasıl kullanacağı hakkındaki yapılandırmaların yapılmasını
sağlar.
System.EnterpriseServices namespacini projemize referans olarak ekledikten sonra
bileşenimizin alabileceği herhangi bir servise ait özellikleri rahatlıkla yönetip ayarlamk
mümkün olacaktır. Örneğin kullanabileceğimiz iki özellik ApplicationName ve
ApplicationActivationdur. Bunlardan ApplicationName uygulamamaızın ismini belirlerken,
ApplicationActivation uygulamamızın servermı yoksa library uygulamasımı olacağını
belirler.
Bu özellikler program tarafından kodla yapılabileceği gibi Component Service yönetim
ekranındanda yapılabilmektedir. Bileşenimize ait bazı özellikler kayıt sırasında belirlenmeli
ve daha sonra değiştirilmemelidir. Bunalara örnek gösterecek olursak bileşenimizin
transaction kullanması gerekiyorsa transaction özelliği Required olarak ayarlanmalı ve öyle
kayıt edilmelidir ve kayıt sonrasında bu özelliğe ait bir değişiklik yapılmamalıdır. Bir
değişiklik yapılmamasının sebebi bileşenimizin transaction içinde yer alabilecek şekilde
şekilde yapılandırılması ve buna göre derlenmesidir. Bu yüzden uygulamanın gereksinimleri
geliştirici tarafından uygulama yaratılmadan önce çok iyi analiz edilmelidir. Özellikleri
yönetim ekranından ayarlayabileceğimiz gibi projemize EnterpriseServices i eklediğimiz ve
özellikleri kodda belirlediğimiz anda COM+ kataloğunda yer alan bütün özellikler
uygulamamızı derlerken kodda belirttiğimiz şekilde ayarlanacak ve özellikler COM+
kataloğuna transfer edilecektir.
Servis Verilen Bir Bileşen Yaratımı
.Net Enterprise Servislerini kullanamak için bir class mutlaka ServicedComponent classını
inherit etmelidir. ServicedComponent class’ı System.EnterpriseServices namespace’i altında
yer alamaktadır. Bu class bize gerekli activation ve interception işlemlerinin doğru bir şekilde
çalışmasını sunar ve aynı zamanda bu sınıfta overide edebileceğimiz ve
kişiselleştirebileceğimiz Activate ve Deactivate gibi bazı methodlar vardır .
ServicedComponent class’ını inherit edebilmemiz için mutlaka System.EnterpriseServices
namespace’ini projemize referans olarak eklemiş olmamız gerekmektedir. Daha sonra bu
namespace’i import ederek ServicesComponent class’ına ulaşabiliriz.
Imports System.EnterpriseServices
Public Class IlkBilesenim
Inherits ServicedComponent
Public Sub New()
'İlk Com+ Bileşenimizi yarattık
End Sub
End Class
Tamer Öz
www.tameroz.com
Servis Verilen Bileşenden Context’e Erişmek
Daha öncede basitçe değindiğimiz gibi her obje context adı verilen ve transaction, activity, ve
security bilgilerini içeren bir ortam içinde çalışmaktadır. Bağlam içindeki bazı özelliklere
erişmemizi ContextUtil sınıfı aracılığı ile sağlarız ve bu sınıfın bazı metodları ile bazı
servisleri kontrol edebiliriz. Herbir bağlamın kendine ait GUID formunda benzersiz bir
tanımlayıcı numarası vardır. Bu numaraya ContextUtil sınıfındaki GetContextId metodu ile
erişebiliriz.
Imports System.EnterpriseServices
Public Class GuidiAlinacakBilesenim
Inherits ServicedComponent
Public Function BaglamGUIDi() As System.Guid
Return ContextUtil.ContextId
End Function
End Class
JIT Aktivasyonu Neden Gereklidir?
Database bağlantıları ve hafıza gibi sunucu kaynakları çok istemci tarafından paylaşılması
gereken sınırlı kaynaklardır. Çok istemciye hizmet sunabilecek uygulamalar geliştirmek
istiyorsak JIT kullanmamız kaçınılmazdır. JIT Aktivasyonu genellikle transaction ve
senkronizasyon için kullanılmaktadır.
Geleneksel uygulamalarda istemci bir sunucu kaynağına talepte bulunur ve bunu belirsiz bir
süre boyunca kullanır. Dolayısıyla her istemci bir sunucu kaynagını belirsiz bir süre boyunca
kullanacağı için çok kullanıcı uygulamalardaki performans nedeniyle bu yöntem
kullanılmamaktadır.
Ancak artık istemciler sunucu kaynaklarını sadece ihtiyaçları olduğu süre boyunca kullanakta
ve böylece performanstaki düşüklük sorunu aşılacağından uygulama çoklu istemcilere yanıt
verebilir hale gelmektedir. JIT sayesinde bu sunucu kaynaklarını serbest bırakacak kodunda
yazılım geliştirici tarafından yazılmasına gerek kalmaz.
JIT ‘i tanımlarken bahsettiğimiz gibi transaction kullanılıyorsa JIT kullanılmalıdır çünkü
transaction içinde yer alan bir nesne bir sonraki transactionda tekrardan yaratılmalı ve bir
önceki nesnenin özelliklerini taşımamalıdır. JIT aynı zamanda senkronizasyon içinde
kullanılmaktadır çünkü her bir çağırım için bir nesnenin birbirinden bağımsız örneklerini
yaratmalıdır ve işi bittiği zaman bu örneklerin kullanımdan kaldırılması gerekemektedir.
Transaction ve senkronizasyonda nesneler işleri bittiği zaman otomatik olarak yok
edilmezlerse kaynak kullanımında aşırı bir artış gözlenmesi kaçınlmazdır.
Şimdide JIT’in nasıl çalıştığını inceleyelim. Bir nesneye bir istek gittiği zaman kesme eğer bu
nesnede JIT aktive edilmişse nesnenin bir örneğini yaratır ve Activate metodunu çağırır.
Nesne gerekli kaynakları kullanmaya hazır duruma gelir. Daha sonrasında ise nesnedeki bir
method çağırıldığında bu metod işlemi gerçekleştiri ve işlem bittiği zaman Done Bit’inin
değerini true olarak atar ve metodun sonucunu geriye döndürür. Daha sonrasında ise metodun
Done Bit değeri true ise nesnenin Deactivate metodu çalıştırılark nesnenin rezerve ettiği
kaynakları geriye bırakılır ve nesne erişemez duruma gelir. Daha sonrasında ise bu nesneleri
garbace collectiondan garbage collector alarak temizler.
Tamer Öz
www.tameroz.com
Şimdide JIT aktivasyonunu yazdığımız bir bileşene nasıl uygulayacağımızı inceleyelim.
<JustInTimeActivation(True)> _
Public Class JIT
Inherits System.EnterpriseServices.ServicedComponent
Public Sub Metodum()
End Sub
Protected Overrides Sub Activate()
'Activate metodunda yapılacak iş
End Sub
Protected Overrides Sub Deactivate()
'Deactivate metodunda yapılacak iş
End Sub
End Class
JIT konusunda bahsigeçen Done Bit’inin ne işe yaradığını inceleyelim. Objede çağırılan
metodun çalışma işlemi bittikten sonra true değerini alan bu bit artık nesnenin deaktive
edilebileceğini belirtir. Eğer done bit’inin değeri false ise nesne hafızadan kalkmaz ve
birdahaki çalışma sonucu true değerini alıncaya kadar hafızada kalır. Done Bit’inin
programatik olarak yönetmek mümkündür. Bunu yönetmek için bileşenimizin özelliklerine
müdahele etmemize izin verdiğini belirttiğimiz ContextUtil sınıfının DeactivateOnReturn
özelliğini kullanabiliriz. Ancak DoneBit’inin varsayılan olarak gelen false değerinin
varsayılan değerini true yapmak için Autocomplete özelliğini kullanmamız gerekmektedir. Bu
iki kullanıma ait bir örneği aşağıda inceleyeceğiz.
Public Sub Metodum()
'Burada metodumuz işini yapar
ContextUtil.DeactivateOnReturn = True
End Sub
Veya
<AutoComplete(True)> _
Public Sub Metodum()
'Burada metodumuz işini yapar
End Sub
Aktivasyon ve Deaktivasyon
Yönetilebilir veya yönetilemez kodda aktivasyon ve deaktivasyonolayları birbirinden farklı
olmasına rağmen yaptıkları iş tüketimin bittiği anda kaynakları serbest bırakacak bir yapı
sunmaktır. Objemizi her zaman Activate metodunda başlatmalıyız. Activate metodunun
çalışması ise JIT özelliğinin aktive edilip edilmemesine bağlıdır.
Alışılagelmiş deaktive yönteminde Deactivate metodu çağrıldığı zaman database bağlantısı
gibi bazı kaynaklar serbest bırakılır ve Release metodu çağırılır. Bu metod ise objenin
hafızadaki referansını dıfırlar. Bu sıfırlama işlemi sonrasında artık hiçbir istemci o nesneyi
referans olarak kullanamayacağından bileşinimiz silinmiş demektir.Ancak .Net te ilk adım
ortak olmasına karşın kesme katmanı artık o objeyi referans olarak göstermeyeceğinden
dolayı nesne erişilemez duruma gelir ve artık hafızadan kaldırılabilir. .Net’te yaratılmış
nesneler silinme işlemini DeActivate metodunda yaparlar ve bundan dolayı tekrardan bir
Dispose metodu yazmaya gerek kalmaz. Ancak yazılması kaçınılmaz ise Deacctivate metodu
ile aynı işlevselliği sağlayabilecek bir metod yazılmalıdır.
Tamer Öz
www.tameroz.com
Senkronizasyon
Eşzamanlı Çalışma Sorunları
Burada bahsi geçen eşzamanlı aynı anda birden fazla programın uyumlu çalışabilmesinin
sorunsuzca tamamlanabilmesidir.tek işlemcili bir sistemde uyumlu çalışma başarısına zaman
paylaşımı tekniği kullanarak erişilmesine karşın çok işlemcili sistemlerde ise bu başarıya her
bir programın veya görevin farklı işlemcilerde aynı anda çalışmasıyla erişilir. Windows
XP’de bu uyumluluk thread adı verilen yapılar ile sağlanmaktadır.
Ölçeklenebilir uygulamalar yazarken uyumluluk kullanılması kaçınılmazdır. Online bilet
satışının yapıldığı ve çok talep gören bir konserin biletlerinin satışa çoktığı anı
senaryolaştıracak olursak bu durumda sunucuya belki saniyede 10 tane istek gelecektir.
Sunucunun bu istekleri serileştirerek sıraya koyup yapması yerine aynı anda gelen tüm
isteklere cevap vererek paralel bir şekilde işlemleri yürütmesi doğru olan yöntemdir. Ancak
bu istekleri aynı anda karşılayabilmel çoklu thread desteği olan bir altyapı ile sağlanmalıdır.
Ancak bu şekilde çalışacak bir altyapı inşa etmek ve bunun üzerine kod yazmak oldukça zor
ve maliyetli bir işlem olduğundan dolayı iş yapma yeteneği olan thread ler bir havuz
oluşturularak saklanır. Bu havuzun maksimum ve minimum boyutu sunucumuzun donanımı
ve kaynaklarına göre yapılandırılabilir. Sunucuya bir istek geldiği zaman bu havuzdan bir
thread bu işlemi üzerine alır ve yerine getirir. Bu thread bu işlemle uğraşırken diğer treadler
başka isteklere açık bir şekilde hazır beklerler. Öultitasking desteği bulunan işletim
sistemlerinde ise threadler komplex bir algoritma ile işletim sistemi tarafından yönetilirler. Ve
biz yazılım geliştiriciler tarafından kodun bu şekilde yazılması gerkemektedir. Kodun
threading2e uygun şekilde yazılmaması durumunda karşımıza çıkabilecek bazı problemlere
gözatacak olursak;
a)Yarış durumları
Bu genellikle farklı thread ler altında çalışacak kodların birinin diğerinin sonucuna bağımlı
olması durumunda karşımıza çıkar ve eğer ilk çalışması gereken thread yarışı kazanamazsa
diğer thread hata verecektir. Bunun çözmek için ilk threadin kodunda belirli bir noktasına
erişildiği anda ikinci threadi başalatabiliriz. Buda senkronizasyon konusu ile alakalıdır.
b)Deadlock
Bu durumda ise bir threadin kaynakladığı bir kaynaga diğer thread tarafından erişilmeye
çalışılmaktadır ve beklemede olduğundan dolayı onunda kilitlediği kaynaklar serbest
bırakılmamılştır. İşte burumda ilk thread ikinci threadin kilitlediği kaynağa erişmeye kalkarsa
bu iki thread birbirlerini kilitlemiş ve deadlock a girmiş demektir. Bu durum genellikle
transacrionlarda görülebilmektedir.
c)Livelock
bu durumda ise iki kaynağın kilitledikleri kaynakları değişmesi sırasında meydana gelebilecek
bir durum söz konusudur. Bu durumda kaynaklar arasında dar bir tünel oldugunu düşünecek
ve iş yapan kişilerin bu tünelde karşılaşıp kararsızlıkta kalarak birbirlerini geçmek için sağa
sola haraket etmesi ancak karşısındakininde aynı kararsızlıkta sağa sola hareket etmesi sonucu
bir geçiş yolu bulamaması sonucu meydana gelir.
Tamer Öz
www.tameroz.com
Senkronizasyon Mekanizmaları
Çok işlem yapılan ve çoklu thread içeren uygulamalarda thread ler kaynaklara erişirken başka
bir thread’ın bu kaynağa erişememesi tutarlılık bakımından gereklidir. Bu basit
senkronizasyon uygulamasındanda anlaşılabileceği gibi bir threadın kaynakla işi bitmeden
başka bir thread o kaynağa erişmemelidir. Buda kilitleme mekanizması ile sağlanır. Bir
threadd bir kaynağa erişirken o kaynağa bir kilit koyarken başka uygulamaların veya
threadlerin erişimine kapar işi bittiği zaman ise koymuş olduğu kilidi açar.
.Net ile yazılmış olan bütün kodlar multithread dir ve bunlar arasındaki senkronizasyonu
sağlayabilmek için .Net Framework yapısında System.Threading uzay ismi vardır. Ancak
COM+ ile .NET senkronizasyonubirbirinden tamamen farklıdır. .Net senkronizasyonu proje
düzeyindedir aynı bağlamda bulunan diğer uygulamlar veya baska bilgisayarlarda bulunan
uygulamalar için geçerli değildir. Böyle br uygulamaya COM+ yapısında bulunan
senkronizasyon izin vermektedir.
COM bileşenlerinde single thread apartment(STA) modeli varken bu geliştirilip multithread
apartment (MTA) modeli geliştirilmiştir bunun sebebi ise
Tamer Öz
www.tameroz.com
Transactionlar
Transactionlar veri bütünlüğünün ve işlemin kesinliğinin garanti altına alındığı önemli
yapılardır. Bir kaynak veya birden fazla kaynak üzerinden birbirinden bağımsız birçok işlem
yapıldığı durumda bu işlemlerin herhangi birinde bir hata oluşması veya o işlemin
yapılamama durumunun ortaya çıkması halinde tüm işlemlerin geri alınarak verilerin işlem
başlanmadan önceki haline dönmesi hayati önem taşımaktadır. Transactionlara birçok
programda ihtiyaç duyulmaktadır. Transactionlar konusunda konuyu pekiştirmek amacıyla en
sık verilen örnek banka hesapları arasındaki para transferlerinin yönetilmesidir. Burada bir
hesaptan para çekildiği zaman diğer hesaba başarı ile yatması garanti edilmelidir, işte bu
noktada transaction devreye girer ve çekilen paranın hesaba yatamaması durumunda tüm
işlemi geri alarak bakiyeyi ilk durumuna geri getirecektir.
Transaction’lar ACID adı verilen temel özellikleri taşımalılardır. ACID’in açılımını
inceleyecek olursak;
Atomicity : Bu özellik transactionda bulunan tüm işlemlerin başarılı bir şekilde yapılmasını
veya hehangi bir hata oluştuğu zaman tüm işlemlerin geri alınması temelinin barındığı
özelliktir. Bu tarz bir kodun yazılım geliştirici tarafından yazılmasının çok zamana malolacağı
ve yazılım maliyetlerini arttıracağı transactionların bizim için ne kadar önemli oldğunu ortaya
koymaktadır.
Consistency : Bu özellik ise veri tutarlılığının ve bütünlüğünün garanti altına alınmasını
sağlamaktadır. Bu konun başında verdiğimiz banka örneğindeki işlemlerin transactionlarla
yönetildiğini düşünürsek yeni para yatırılmadığı ve sadece hesaplar arası para transferi
yapıldığı bir sistemde tüm hesaplardaki toplam tutar hiçbir zaman değişmeyecektir.
Isolation : Aynı kaynak üzerinde eşzamanlı yapılabilecek işlemlerden oluşabilecek hataların
engellemesini temel alan özelliktir. İki tane transactional işlemimiz olduğunu yine banka
örneği üzerinde inceleyelim. Aynı anda başlayan işlemlerden ilki bir hesaptan parayı çekti
ancak diğer hesaba parayı yatıramadı, tam bu sırada ikinci işlem devreye girerek hesapta
kalan parayı okudu. İlk işlem işlemi geri aldıktan sonar ikinci işlemde görülen hesap bakiyesi
yanlıştır. Çünkü bu değişiklik birinci işlemin yeraldığı transaction içinde rollback edilmiştir.
İşte bu gibi durumların önüne geçmek amacıyla isolation kullanılır ve bir lock level
belirlenerek ikinci transactionun devreye bile girmemesini sağlamak elimizdedir.
Durability : Üzerinde işlem yapılan serverda herhangi bir yazılım veya donanım problemi
olması durumunda transactionlar kendisini ilk başladığı duruma getirebilecek özelliktedirler.
Bir Resource Manager(Kaynak Yöneticisi) veriyi saklamaktan sorumlu olan ve transaction
destekleyen yapılardır. Desteklenen transactionlar local veya distributed olabilirler. En çok
kullanılan resource manager Microsoft SQL Server 7.0’dır. .NET te bulunan transactionlar
sadece resource manager’lar ile çalışmayı desteklemektedir. Eğer verilerinizi bir file system
üzerinde tutuyorsanız bu durumda verileriniz distributed bir transaction içinde yeralmasını
sağlamak için Compensanting Resource Manager gibi teknolojileri kullanabilirsiniz. Biraz
once değindiğimiz local ve distributed transaction kavramlarını inceleyelim.
Local Transactions : Bu tür transactionlar client server uygulamalarında ve değişikliklerin bir
connection üzerinden bir kaynağa yapıldığı durumlarda gerçekleşir. ADO.Net bu transaction
Tamer Öz
www.tameroz.com
sistemini desteklerdekn distributed transactionlara .Net Enterprise Services destek
vermektedir.
Local transactionların çalışması için ilk once transactionu yaratmalısınız ve işlemleri
gerçekleştirmeye başladıktan sonar oluşan herhangi bir hatada transaction üzerinde rollback
komutunu yollamak suretiyle işlemleri geri alabilir veya işlemleriniz hatasız tamamlanmışsa
commit komutunu yollamak suretiyle onay bekliyen değişikliklerin hepsini onaylayarak
transactionun başarılı bir şekikde sonlanmasını sağlayabilirsiniz.Bu noktadan sonar kaynağa
bağlanan diğer kullanıcılar değişiklikleri görebililecektir. Local transactionlari yaratmak için
iki yol mevcuttur bunlardan biri T-Sql ile yaratılan stored procedure lerin içine transaction
yazarak, bir diğeri ise ADO.Net veya OLEDB ile transactionları yönetmektir.
Distributed Transactions : Local transactionlar bir resource üzerine bir connection ile
erişildiğinde gerçekleşmesine karşın Distributed transactionlar ise birden fazla kaynağa
erişebilirler ve bunların herbirinin kendine ait transactionları merkezi bir yerden basit bir
mantıkla işleyen transaction tarafından yönetilmelidir. İşte bu yönetim işleminden COM+
uygulamalarında Distributed Transaction Coordinator (DTC) bulunmaktadır. DTC windows
xp ile beraber gelen bir yapıdır.
DTC nin transactionları yönetebilmesinin mantığı her kaynağın bulunduğu makinada çalışan
DTC’lerin birbirleriyle haberşleşebilmesidir. Bu durumda distributed transactionların farklı
sistemler üzerinde çalışacağından bir şekilde herbirinin identify edilmesi gerekmektedir, DTC
ise bu konuda her transactiona unique Unit Of Work Id adı verilen bir GUID atar. Bir
transactionun GUID’ini almak için ContextUtil objesinin Transaction propertysini
kullanabilirsiniz.
DTC distributed bir transaction yarattıktan ve Unit Of Work Id atadıktan sonra resource
manager lara yapılacak connectionlar transaction içinde yer almalıdır ve DTC bunu bize
otomatik olarak sağlar. Ancak Açık connectionlarıyla beraber Nesne havuzuna alınmış objeler
için transactionlar elle yazılmak zorundadır, bunun sebebi ise connection açıldığı sırada
herhangi bir transaction belirtilemiyor olmasıdır.
DTC’nin mantığında Coordinator’un diğer kaynaklardaki DTC lerle haberleşerek
transactionlar yaratmak olduğundan bahsetmiştik Şimdi ise .Net Enterprise Services’in bize
sunduğu transactionları inceleyelim.
.NET Enterprise Services Transactions
.Net Enterprise Services’in bize sunduğu özelliklerden en güzeli belkide bir nesneyi
transaction içinde yer almasını sağlamak için extradan birçok kod yazmamıza gerek
bırakmamasıdır. Siz sadece yazmış olduğunuz bileşenin transaction içinde nasıl yer alacağına
karar verirsiniz, eğer bileşeniniz transactiona gerek duyuyorsa .Net Enterprise Services
DTC’yi ve COM+’ı kullanarak otomatik olarak bir distributed transaction yaratacaktır.
Yarattığımız bileşenlein transaction özelliğini transaction özelliğini kullanarak sadece bileşen
düzeyinde belirleyebiliriz. Bu özellik bize TransactionAttribute classı ile beraber gelen bir
özelliktir. Bir transaction için beş farklı özellik belirlenebilir. Şimdi ise bunları inceleyelim.
Disabled : Transaction desteklenemez. Bu özelliğin atandığı nesneler çağırılırken transaction
talebinde bulunulursa COM+ bunu reddedecektir.
Tamer Öz
www.tameroz.com
Not Supported : Transactionlar desteklenemez. Herhangi bir özellik belirtilmediğinde bu
özellik default olarak kullanılacaktır. COM+ bileşenin transaction içinde yer alamaycağını
garantiler. Yani eğer transaction isteği varsa yeni bir context açılır ve bileşen bu context
içinde çalışır.
Supported : Transactionlar desteklenir. Eğer istemcinin context’inde transaction varsa nesne
transaction içinde yer alır ancak transaction yoksa nesne transaction içinde yer alamacan
çalışabilir.
Required : Bu özellikte ise transactionlar desteklenmektedir ve nesnenin çalışması için
gereklidir. Eğer istemcinin context’inde transaction varsa bileşen aynı transaction içinde
çalışır ancak yoksa bileşen kendisi için bir gtransaction yaratacaktır.
Requires New : Transactionlar desteklenmektedir. COM+ nesne her yaratıldığında yeni bir
transaction yaratacaktır.
Şimdi bu özellikleri bileşenimize kodla ve Component Services Administrative Tool’u
kullanarak nasıl atayacağımızı inceleyelim.
<Transaction(TransactionOption.Required)> _
Public Class Bilesenim
Inherits ServicedComponent
Public Sub Methodum()
'''''''''''''''
End Sub
End Class
Ayrıca Services Administrative Tool’da bulunan bileşenin üzerine sağ tuşla tıklanıp
Properties penceresi açıldıktan sonra transaction tab’ı seçilir ve buradan gerekli ayarlar
yapılabilir. Ancak unutulmaması gerekn uygulamanın durdurulup tekrar başlatılması
gerekmesidir.
Transaction içinde yeralan bir nesnenin bir sonraki transactiona başlanmadan önce yok
edilmesi gerekliliğini isolation konusunda incelemiştik. Şimdi bunu nasıl yapacağımızı
inceleyelim. Bu konuda endişelenmeye gerek yoktur bunu bizim için JIT Activation
yapacaktır. Ancak burada dikkat etmemiz gerek kural transactionumuzun özelliğinin
Supported, Required veya Requires New Şekilde ayarlanmış olması halinde Just In Tıme
Activation özelliğini true olarak ayarlanması gerekliliğidir.
Transaction Streams
Aynı transactionu paylaşan COM+ bileşenlerine transaction stream adı verilir ve bu yapı
transactionların bir context ten diğerine geçişini sağlar. Şimdi COM+’ın bir ileşeni aktive
etmesi durumunda transaction ile ilgili yaptığı işleri inceleyeleim. Bu işlem sırasında COM+
kataloğu kontrol edilir ve transaction desteği bileşen tarafından gereksiniyorsa çağıran context
te aktif transaction olup olmamasına ve yaratılacak olan bileşenin transaction özelliğine
bakılarak aşağıdaki işlemlerden biri yapılır.
Eğer bileşen transaction içinde yer alamayacak şekilde ayarlanmışsa yeni objenin context’ine
transaction yaratılmaz.
Çağıran context içinde bulunan transaction ile bilgiler alınır.
Tamer Öz
www.tameroz.com
DTC ile iletişim kurulur ve yeni bir transaction yaratılarak yeni bileşenin context’ine bir
transaction yaratılır.
Bir bileşen COM+ ortamı dışında çalışan bir client tarafından veya mevcut context içinde
çalışan bir COM+ bileşeni tarafından aktive edilebilmektedir.
Transaction içinde yeralan ilk bileşene transaction root bileşeni adı verilir. Bu bileşeni yaratan
client’a ise root client ismi verilir. Root Client trafından yaratılan istek root client a geri
dödüğü anda işlem transaction stream dışına çıkmış olacaktır.
Transactionlar Nasıl Çalışır
Distributed transactionlarda commit veya rollback komutlarını desteklemelidirler. Bu
durumda distribted transactionların commit veya rollback olmasını COM+ yönetir. Bu
yönetim işlemini her bileşen için bir dizi bit değişken kullanarak ve bu değişkenlerin
değerlerini analiz ederek yönetmektedir. Kullanılan bu bit değişkenler aşağıda açıklanmıştır.
Done Bit : Her Context’te bulunmaktadır. COM+ transaction özelliği required olarak
ayarlanmış tüm bileşenlerde JIT Activation için ayarlanmış olmalı ve farklı Contextlerde
çalışabilmelidir. Bileşen aktive olduğunda Done Bit’inin değeri false olurken bileşenin işi
bittiğinde ve deaktive olduğunda bu bit değişkenin değeri true olmalıdır.
Consistent Bit : Her bir bileşende bulunan bu değişken o bileşende yapılan işlemlemlerin bir
bütünlük sağlayıp sağlamadığı tutulur. Yani bir transaction içinde yeralmış tüm consistent
bitlerin değeri true olduğunda transaction commit edilirken aksi durumda transaction rollback
edilecektir.Bir bileşen aktive edildiğinde bu bileşen varsayılan olarak true gelmektedir.
Abort Bit : Consistent Bit’in zıtti gibi düşünebileceğimiz bu bit değişken transaction
bazındadır. True olduğunda transaction rollback edilmelidir. Yeni bir transaction başladığı
anda oluşturulur ve varsayılan değeri varsayılan olarak false gelmektedir. Bit’in değeri True
olduktan sonra değiştirilemeyecek şekilde oluşturulmuştur.
Client Yönetimli Transactionlar
.Net Enterprise Services’in bileşenlere otomatik olarak transaction servisi sağlamasına
rağmen bazı durumlarda root client’in transactionları manual olarak yönetmesi gerekebilir.
Örneğin ServicedComponent classından türememiş managed bir bileşenin diğer servis verilen
bileşenleri yönetmesinin istendiği durumlarda bu bileşenin transaction yaratabilir ve
yönetebilir şekilde oluşturulmuş olması gerekemktedir. Bunun gibi extrem durumlar için
COM+ içinde TransactionContext COM classını barındıran bir COM kütüphanesi sunar. Bize
sunulan bu class’ı kullanarak COM+ distributed transactionları yaratabilir ve yönetebiliriz.
Ancak bu classı kullanabilmek için projemize referans olarak COM+ Services Type Library’i
eklemiş olmamız ve transaction başlatabilmek için TransactionContext classının bir
instance’sini almak gerekmektedir. Ancak önemli bir nokta transactionun başlangıçını, bitişini
veya abortunu sağlayan metod çağırımlarını COM+ yönetemdiğinden manual olarak koda
yazılması gerekliliğidir.
TransactionContext classında kullanılabilir 3 metod vardır. Bunlar CreateInstance, Abort ve
Commit’tir. CreateInstance metodu ile transaction içinde yeralacak servis verilen bileşenleri
yaratabilirsiniz. İşiniz bittiği zaman commit metodunu, herhangi bir hata durumunda veya
Tamer Öz
www.tameroz.com
transactionu iptal etmeniz gereken durumlarda ise Abort metodunu kullanabilirisiniz. Şimdi
bu kullanıma ait bir örneği inceleyelim.
Imports COMSVCSLib
Public Class ClientYonetimliTransaction
Public Sub Methodum()
Dim tran As New TransactionContext
Dim transactionalBilesen1 As Classim1()
Dim transactionalBilesen2 As Classim2()
Try
transactionalBilesen1 = tran.CreateInstance("COMPlus.Classim1")
transactionalBilesen2 = tran.CreateInstance("COMPlus.Classim2")
transactionalBilesen1.Calis()
transactionalBilesen2.Calis()
tran.Commit()
Catch ex As Exception
tran.Abort()
End Try
End Sub
End Class
Transactionlar kullandıkları kaynakları (örn. Database kayıtları) kullandıkları süre boyunca
kilitli tutarlar. Bu kilit transaction Abort veya Commit oluncaya kadar kalacaktır. Bu noktada
bir transactionun bekleme süresinin çok uzaması veya farklı transactionların birbirlerini
deadlock’a sokmaları durumunda transactionlar sonsuz bir süre zarfınca bekleyecekler ve bu
kaynakların hiçbir uygulamaya cevap vermez hale gelmesine sebep olacaklardır. Bunu
engellemek için transactionlara belirli bir timeout süresi konulabilir. Bu timeout süresini DTC
yönetebilmektedir. Bu ayarlama Component Services Administrative Tool aracılığıyla
yapılabilmekte veya bileşenimize kod ile ekleyebileceğimiz bir özellik olabilmektedir. İki
traftanda ayarlama yapılmış ise kodda yazdığımız değerler daha baskın olacaktır..
Tamer Öz
www.tameroz.com
Component Services Administrative Tool kullanarak transaction timout süresini ayarlamak
için Component Services nodu genişletildikten sonra Computers klsörünün altındaki
MyComputer’e sağ tıklanır ve Properties penceresi açıldıktan sonra Options sekmesi seçilerek
Transaction Timeout ayarlaması rahatlıkla yapılabilir
Şimdi ise bu ayar bileşenimize kod ile nasıl ekleyeceğimize bakalım.
Imports System.EnterpriseServices
<Transaction(TransactionOption.Required, Timeout:=120)> _
Public Class TransactionTimeOut
Inherits ServicedComponent
Public Sub Methodum()
'''''''''
End Sub
End Class
Bunun yanısıra Component Services Administrative Tool aracılığıyla herbir bileşen için
timeout süresi ayarlamak mümkündür. Bunu yapmak için bileşene sağ tıklayarak açılan
properties penceresinde Transactions sekmesinde bulunan Override Global Transaction
Timeout Value checkboxı işaretlenmeli ve Transaction Timeout süresi girilmelidir.
Transactionları Takip Etmek
Component Services Administrative Tool bize transactionlari izleyebileceğimiz veya DTC’yi
başlatıp, durdurabileceğimiz bir kullanıcı arayüzü sunmaktadır.
Transaction istatistiklerini takip edebilemek için Component Services Administrative Tool’da
component services nodunu genişlettikten sonra Computers nodunu genişletip vede daha
sonra transactionlarını izlemek istediğimiz bilgisayarı seşim bunun altındaki Distributed
Transaction Coordinator klasörünü seçtiğimizde karşımıza Transaction List ve Transaction
Statistics gibi iki item gelecektir. Bunlardan Transaction List bize işlemde olan distributed
transactionları gösterirken, Transaction Statistics ise bize DTC nin en son başlatıldığı tarihten
itibaren olan transaction istatistiğini gösterecektir. Şimdi bu iki item için açılan pencereleri
inceleyelim.
Transaction List penceresinde birazöncede bahsedildiği gibi o anda aktif olan transactionlar
ve bu transactionlara ait Unit Of Work Id ve transactionun durumunu gösteren bir icon
gözükmektedir. Eğer transactionlarla ilgili daha fazla bilgi almak istersek transactionun
üzerine sağ tıklayarak View menusunden properties’i seçebiliriz. Donanımsal bazı sorunlar
gibi bazı durumlarda transactionlar sona erdirilmeden kalbilirler böyle bir durumla
karşılaşıldığında ise aynı pencerede bulunan Resolve menüsünden transactiona ait
sonlandırma durumu seçilebilmektedir.
Transaction Statistics penceresinde ise karşımıza çıkan grafiksel barlara sahip ekrandaki
barların ne anlamlara geldiğini zçıklamak yeterli olacaktır.
Tamer Öz
www.tameroz.com
Active : Şu anda aktif olan transactionların sayısı.
Max Active : Aktif transactionların ulaştığı maximum değer.
In Doubt : Durumu transaction manager tarafından belirlenemeyen transactionlar.
Committed : DTC en son başladığından beri commit edilmiş transactionlar(elle commit edilen
transactionlar bu listede yer almaz).
Aborted : DTC en son başladığından beri abort edilmiş transactionlar(elle abort edilen
transactionlar bu listede yer almaz).
Forced Commit : DTC en son başladığından beri elle commit edilmiş transactionlar.
Forced Abort : DTC en son başladığından beri elle abort edilmiş transactionlar.
Total : DTC en son başladığından beri toplam transaction sayısı.
Minimum : Başarılı bir şekilde commit edilmiş transactionlardan minimum response süresine
ait olanın response süresi.
Maximum : Başarılı bir şekilde commit edilmiş transactionlardan maximum response süresine
ait olanın response süresi.
Average : Başarılı bir şekilde commit edilmiş transactionların ortalama response süresi.
Transaction Metodları
ContextUtil classı bize transactionlarla çalışabilmemiz için gerekli metodları sunmaktadır. Bu
metodlar sayesinde transaction bilgisini alabilir ve done ve consistent bit değerlerini
ayarlayabiliriz. Transaction durumunu kontrol etmek için bu clastaki IsInTransaction
metodunu kullanabiliriz. Bu metod bize bileşenin transaction içinde yer alıp almadığını
gösterecektir.
Bileşen transaction içindeyken done veya consistent bitlere müdahele edebilmek için bazı
metodlar vardır. Şimdi bu metodları ve bit değşkenlerin değerlerinin nasıl değiştirdiklerini
inceleyelim.
Tamer Öz
www.tameroz.com
EnableCommit : Bu metodu çalıştırdığımız zaman nesnemizin işinin henüz bitmediğini ancak
consistent bir state ifade ettiğini belirtiriz. Dolayısıyla bu metodun çalışması bittikten sonra
nesne deaktive olmaz. Bu metodda bit değişkenlerin değerleri ise Done Bit false olurken,
Consistent Bit true olacaktır.
DisableCommit : Bu metod çalıştığı zaman ise nesnemizin işinin henüz bitmediği ve henüz
kararlı yapya ulaşmadığını belirtebiliriz. Bu metodun sonunda ise Done Bit ve Consistent Bit
false değerlerini alacaktır.Nesne deaktive edilmeden nesne bir daha çağrılırsa nesne deaktive
edilecek ve transaction Abort edilecektir.
SetComplete : Bu metodu çalıştırdığımız zaman nesnenin işinin bittiğini ve kararlı yapıda
olduğunu belirtebiliriz. Bu belirtme işlemi Done ve Consistent Bit’lerin true yapılmasıyla
sağlanır.Transaction başarıyla commit edilebilir.
SetAbort : Bu metodu çalıştıdığımız zaman nesnenin işinin bittiğini ancak henüz kararlı
yapıya ulaşamadığını belirtmiş oluruz. Obje deaktive edilir ve Abort Bit true değerini alır
dolayısıyla transaction Abort edilecektir.Done Bit true değerini alırken Consistent Bit false
değerini alacaktır.
Aşağıda bu metodların nasıl kullanılacağına dair ufak bir örnek yer almaktadır.
Imports System.EnterpriseServices
<Transaction(TransactionOption.Required)> _
Public Class TransactionMethods
Inherits ServicedComponent
Public Sub Methodum()
Try
'''''''''
ContextUtil.SetComplete()
Catch ex As Exception
ContextUtil.SetAbort()
End Try
End Sub
End Class
Transaction Propertyleri Ve Attributeleri
ContextUtil classı bize bir önceki başlık altında bahsettiğimiz özellikler dışında başka
özelliklerde sunmaktadır. DeactivateOnReturn propertysi tek başına done bit değerini kontrol
edebilmek için kullanılan bir metoddur. Bu propertynin değerini true veya false yaparak Done
Bit’inin değerini true veya false yapmış oluruz. MyTransactionVote propertysini ise
Consistent Bit değerini kontrol etmek için kullanırız. Yine bu propertynin değerini true veya
false yaparak Consistent Bit değerini true veya false yapmış oluruz. Şimdi bu iki propertynin
nasıl kullanıldığına dair bir örnek yapalım.
Tamer Öz
www.tameroz.com
Imports System.EnterpriseServices
<Transaction(TransactionOption.Required)> _
Public Class TransactionProperties
Inherits ServicedComponent
Public Sub Methodum()
Try
ContextUtil.DeactivateOnReturn = True
'''''''''
ContextUtil.MyTransactionVote = TransactionVote.Commit
Catch ex As Exception
ContextUtil.MyTransactionVote = TransactionVote.Abort
End Try
End Sub
End Class
Ayrıca AutoComplete attribute kullanarak SetComplete veya SetAbort metodunun otomatik
olarak çağrılmasını sağlayabiliriz. Eğer metodda hata oluşmamışsa SetComplete metodu
otomatik olarak çağrılacaktır. Ancak bir exception fırlaması durumunda ise SetAbort metodu
çalıştırılacaktır. Şimdi bu attribute’ın nasıl kullanılacağına dair bir örnek yapalım.
Imports System.EnterpriseServices
<Transaction(TransactionOption.Required)> _
Public Class TransactionProperties
Inherits ServicedComponent
<AutoComplete(True)> _
Public Sub Methodum()
Try
'''''''''
Catch ex As Exception
'Exception Firladiginda Calismasini Istedigimiz Kod
(Transaction Abort Yazmaya Gerek Yok Otomatik Calisacaktir.)
End Try
End Sub
End Class
Tamer Öz
www.tameroz.com
Uygulama Güvenliği
COM+’ın sunduğu güvenlik seçeneklerini iyi anlamak uygulamak için atılacak iyi bir adım
olduğundan bu kısımda bu konu üzerinde duracağız. Bu kısımda verilen authorization
authentication ve role bilgileri eşliğinde uygulamalarınızı esnek bir yapı olan Role-Based
Security metodu ile güvenli kılabileceksiniz.
Authentication ve Authorization Nedir?
Bir uygulamayı güvenli kılabilmek için ilk önce authorization ve authentication kelimeleri
arasındaki anlam kargaşasını çözüp bu kelimelerin anlamlarını iyice oturmak gerekmektedir.
Authentication bir kullancının kimliğinin doğrulanıp o kullanıcın tanınması işlemidir. Yani bir
kullanıcın bazı bilgilerinin yetkili bir authority tarafından kontrol edilip o kullanıcının sistem
tarafından tanınmasıdır. En bilinen örnekleri işletim sistemi açılışında kullanıcının sistem
tarafından tanınması için sorulan kullanıcı adı ve şifredir. Bunun dışında örnek olarak
Internette geniş bir yer kaplayan Microsoft Passport güvenlik doğrulamasını ve geliştirilmiş
birçok uygulamada kullanıcılara sorulan kullanıcı adı ve şifre gibi bilgileri örnek
gösterebiliriz.
Authorization ise bir kullanıcının gerçekleştirmek için istekte bulunduğu işlemi
gerçekleştirmek için gerekli minimum yetkiye sahip olup olmadığının kontrolüdür.
Authorization kontrolünün gerçekleşebilmesi için ilk önce kullanıcının authentication ile
tanınmış ve erişebileceğ kaynakların Role-Based Security ile belirlenmiş olması
gerekmektedir.
Güvenlik Tipleri
Windows işletim sistemi, DCOM, IIS, Asp.NET, ve .NET Framework bir kullanıcıyı
tanıyabileceğimiz authentication ve çeşitli kaynaklara erişimini sınırlandırabileceğimiz
authorization metodlarını bize sunmaktadır. Bu güvenlik metodlarını ve birbirleriyle nasıl
çalıştıklarını ve haberleştiklerini bilmek uygulamalarınızda izleyeceğiniz güvenlik
prosedürleri için son derece önemlidir.
Şimdi bu güvenlik metodlarından Windows güvenliğini inceleyelim. Windows işletim
sistemlerinde tanımlı güvenlik kullanıcılarla ve kullanıcın ait olduğu guruplarla
sağlanmaktadır. Bunun sağlanması kullanıcı tanınması ve obje tabanlı erişim kontrolü ile
sağlanır. Kullanıcılar ve Gruplar sistem kaynaklarına erişebilmek için bir authorization
mekanizmasından geçer ve kullanıcının işletim sistemi aracılığıyla yapmak için istekte
bulunduğu işlemlere yetkisi olup olmadığı kontrol edilir. Windows işletim sistemlerinden
administrator kullanıcı grubuna ait kullanıcılar başka bir deyişle yöneticiler Sistem üzerinde
bulunan kaynaklara erişimleri kısıtlayabilmek için bu kaynaklara güvenlik kısıtlamaları
getirebilir ve o kaynağa erişme isteği kabul edilen veya rededilen kullanıcıları görebilirler.
Software Restriction Policy (Yazılım Sınırlama Poliçesi) Bu özellik Windows XP ile beraber
gelen bir özelliktir ve sistemleri bilinmeyen ve tehlikeli kodlardan uzak tutması
hedeflenmiştir. Bu sistemin temelinde authenticate olmuş kullanıcın haklarına göre güvenilen
kodların belirlenmesi ve bunun dışındakilerin çalışmasının yasaklanmasıdır. Bilinmeyen Kod
virüs olabiliritesi yüksek olan veya kurulu programlardan herhangi biri ile çakışma
yaratabilecek kod anlamına gelmektedir. Ve bu kod izole edilmiş doğal olmayan bir ortamda
Tamer Öz
www.tameroz.com
çalıştırılır ve kullanıcın güvenlik yetkilerine bağlı kaynaklara erişmesine izin verilmez. Bu
sistemin temelinde iki çeşit güven düzeyi vardır. Unrestricted(Sınırlamasız ) ve Disallowed
(Reddedilmiş) . Burada unutulmaması gereken unrestricted kodun kullanıcın tüm güvenlik
erişim haklarına sahip olacağıdır. Bu yüzden bunu güvenliğinden 100% emin olmadığınız
kodlara uygulamamanız gerektiğidir. Disallowed kod ise kullanıcın güvenlik haklarına
erişemeyeceği veya unrestricted ortamda çalışan kodlara erişemeyeceği yapay bir ortamda
çalıştırılır.
Bir sistem için bu güvenlik ayarlarını Administrative Tools (Yönetimesel Araçlar) menüsü
altında bulunan Local Security Policy (Yerel Güvenlik İlkesi) aracından ayarlayabilirsiniz.
Ayrıca COM+ uygulamalarına ait güvenlik kısıtlamalarını programatik olarak veya
Component Services (Bileşen Hizmetleri) yönetimsel aracını kullanarak her bir uygulama için
bağımsız ayarlayabilirsiniz. Eğer bir COM+ uygulaması için herhangi bir güvenlik ayarı
yapılmamışsa sistem genelinde geçerli olan güvenlik ayarları kullanılır. Ancak burada dikkat
edilmesi gerekli olan bir nokta Unrestricted Trust Level’i olan bir Com+ uygulamasının
sadece Unrestricted Trust Level’e sahip bileşenleri yükleyebilmesidir. Buna karşın
Disallowed Trust Level’e sahip bir COM+ uygulaması her tür bileşeni yükleyebilir ancak
kullanıcı yetkilerinin hepsine erişemez.
DCOM Security (DCOM Güvenliği) : COM+ ile birlikte gelen güvenlik ayarlarının birçoğu
DCOM ile gelen güvenlik özellikleri temel alınarak geliştirilmiştir. DCOM’un bize sunduğu
güvenlik özelliklerden bazıları Access Permission (Erişim İzni), Launch Permission
(Uygulama Başlatma İzni),Configuration Settings(Registry Ayarlama İzni),Authentication
Level(Uygulamanın Data veya Kullanıcı Bazında Gereksinim Duyduğu Authentication),
Impersonation Level(Kullanılan Bileşenlerin Uygulamanın Kullanıcı Doğrulamasına
Ulaşması).
IIS Security (IIS Güvenliği) : IIS bize 3 temel güvenlik metodu sunmaktadır bunlar; Basic
Authentication, Digest Authentication, Integrated Windows Authentication’dır.
IIS Basic Authentication : Kullanıcı bilgilerine erişmek için en çok kullanılan metodlardan
biridir. Bu ayarın yapılmış olduğu bir web sunucusuna kullanıcı bağlandığı zaman karşısına
kullanıcı adı ve şifresi soran bir pencere açılır, kullanıcının bu pencereye girmiş olduğu bilgi
base-64 yapısında sunucuya network üzerinden yollanır ve sunucu bilgileri onaylarsa bağlantı
kurulur, bilgilerin doğrulanmadığı durumda ise kullanıcıya tekrardan giriş penceresi gösterilir.
Bu yöntemin en büyük avantajı Hypertext Transfer Protocol(HTTP)’nin bir özelliği
olduğundan dolayı birçok Web Browser tarafından desteklenmesidir. Ancak bir dezavantajı
ise kullanıcı şifrelerinin cryptolanmadan gönderilmesidir.Bu sebepten dolayı networkünüzü
dinleyen programlar aracılığıyla şifreleriniz çok rahat bir biçimde ele geçirilebilir. Bundan
dolayı SSL kullanmıyorsanız veya server ve clientlar arasında güvenli bir ağ kurulu değilse bu
yöntemi kullanmanız tavsiye edilmez.
IIS Digest Authentication : Basic Authentication’un güvenlik açıklarını kapatmak için W3C
(World Wide Web Consortium) tarafından geliştirilmiş kerberos kadar güvenli olmayan bir
geçici çözümdür. Bu yöntemde kullanıcı adının, şifrenin, istekte bulunulan kaynak, http
metodu ve random üretilmiş bir değerin kombinasyonu bir hashing algoritması sayesinde
hexadecimal bir karakter kümesine çevrilir ve sunucudan geri döner. Hashing
authenticationun tek taraflı geçmesini sağlar ve geri çözülemez.
Tamer Öz
www.tameroz.com
IIS Integrated Windows Authentication : Eskiden NTLM olarak bilinen bu yöntem gayet
güvenlidir çünkü kullanıcı adı ve şifre network üzerinden gönderilmez istekte bulunulan
browser hashlenmiş bir şekilde mevcut credential’larını sunucuya yollar. Integrated Wındows
Authentication kendi authentication protokolünü kullanabileceği gibi Kerbos v5
authentication protokolünü de kullanabilir.
ASP.NET Security (ASP.NET Güvenliği) : Asp tarafından sunulan Windows authentication
metodu dışında Asp.Net iki yeni metod sunmaktadır. Bunlar; Forms Authentication ve
Passport Authentication’dur.
Forms Authentication : Authenticate’ine izin verilmeyen isteklerin otomatik bir sayfaya
yönlendirilip burada alınan bilgilerin uygulama tarafında kontrol edildikten sonra kullanıcının
o sayfaya girişine izin veren bir yöntemdir. Şu an birçok yazılım geliştirici tarafından
kullanılan bu yöntem gayet başarılıdır.
Passport Authentication : Microsoft tarafından sunulan merkezi bir authorization servisi olan
bu yöntemle kullanıcıların sitenize girmesini sağlayabilirsiniz.
COM+ Security : COM+ güvenliğinde Role Based Security bir dönüm noktası olmuştur. Bu
sistem DCOM güvenlik modelinin ve RPC(Remote Procedure Call) güvenlik metodlarının bir
bileşimidir. Bu yöntem sayesinde güvenliği sağlamak için çok kod yazmaktan kurtulursunuz.
Bu yöntemde kullanıcın kendine özel kimliği değil kullanıcın erişebileceği mantıksal kurallar
önemlidir. Role Based Securty ‘e ek olarak COM+ 1.5’de özel bileşen yaratma imkanı vardır.
Özel bileşen yaratarak bir bileşeni sadece bir uygulamadaki diğer bir bileşen için kullanılabilir
kılma imkanı vardır.
.Net Framework Security : .Net Frameworkte 2 çeşit güvenlik vardır bunlardan birincisi Role
Based Security diğeri ise Code Access Security’dir. Role based Security Temeli COM+ da
kullanılan role based security ile aynıdır. Code Access Security’i inceleyecek olursak bu
güvenlik sisteminde ise kodun sadece gerekli kaynaklara erişimine izin veren bir mekanizma
söz konusudur.
SQL Server Security : SQL Server bize iki çeşit güvenlik sistemi sunmaktadır. Bunlardan biri
Windows Authentication iken diğeri ise Sql Authentication’dur. Windows Authenticationda
Windows Kullanıcı guruplarına database veya objeler üzerinde yetkiler vermek mümkündür.
Bunun yanısıra Sql Server bazında tanımlı kullanıcılar yaratarak bu kullanıcılara çeşitli
objeler üzerinde yetki verebilirsiniz.
Role Based Security Nedir
COM+’ın güvenlik sistemininde dayandığı bu yöntemin temelli roller yaratarak bu rollere ait
kullanıcılara çeşitli bileşenler, kaynaklar veya diğer işlevsellikler üzerinde yetki vermektir.
Rol kavramını daha ayrıntılı inceleyelim. Rol bir uygulamada aynı yetkilere sahip birden fazla
kullanıcıları guruplayabileceğimiz yapılardır. Böylece biz ayarlarımızı ve
sınırlandırmalarımızı roller üzerinde yaparız ve bu role ait olan tüm kullanıcılar için geçerli
olmuş olur. Başka bir avantaj ise bir kullanıcıyı daha yetkili kılmak istediğimizde sadece
gurubunu değiştirmemiz gerekmesidir.
Tamer Öz
www.tameroz.com
Erişim Kontrollerinin Yapılması
Erişim kontrolleri bir server uygulaması çalıştırılmasını gereken aktivasyon yapıldığında
COM Service Control Manager (SCM) tarafından, Çalışmakta olan process’e bir istekte
bulunulduğu zaman veya bir isteğin bir kitaplığa veya uygulamaya erişmesi durumunda
yapılır. Ancak COM SCM uygulama bir server uygulaması ile istek geldiği zaman
çalışabilmektedir. Bunun sebebi ise sadece sunucu uygulamalarının kendi processlerinde
çalışmasıdır.
Güvenlik kontrolleri sadece application sınırları dışına taşan isteklerde kontrol edilmektedir.
Yani bir uygulama içinde çalışan iki bileşenden biri diğerini çağırdığı zaman bu kontrol
gerçekleşmez. Ancak bir uygulamadaki bileşenin diğer bir uygulamadaki bileşene erişmesi
durumunda bu güvenlik kontrolleri yapılacaktır.Bundan dolayı iki bileşeniniz varsa ve ikisinin
birbirlerini çağırması durumunda güvenlik kontrolü yapılmasını istiyorsanız bu bileşenleri
farklı COM+ uygulamalarının içine koymalısınız.
Bir client bileşene istekte bulunduktan ve bileşenin erişme yetkisi onaylandıktan sonra COM+
Interceptıon katmanı COM+ kataloğuna erişir ve istekte bulunan client’in rol yetkilerini
kontrol eder. Bu sayede sadece çeşitli roller ve bu rollerin bileşenler veya metodlar üzerindeki
yetkilerini tanımlayarak kod yazmaya gerek kalmaksızın uygulamanın güvenlik ayarlarını
yapabiliyor durumda olabiliriz. Şimdi ise Role Based Security ise ne gibi güvenlik
kısıtlamaları koyabiliriz bunu inceleyelim.
Role Based Security Düzeyleri
Role based security kullanarak bir uygulama içindeki rolleri belirleyebilir ve bunları
bileşenlere, Interface’lere veya metodlara atayabiliriz. Burada önemli bir nokta bir rolün
belirlenmesi ancak herhangi bir bileşene, interface’e veya metoda atanmaması durumunda o
rolün tüm uygulamaya erişiminin sınırlanması anlamına gelmesidir. Bunun çözümlerden biri
ise yazacağınız uygulamanın analizi ve dizaynı sırasında kullanmanız gereken tüm rol
gereksinimlerini belirlemektir. Bu sayede role based security de kullanıcıları ve yetkilerini
çıkarmakta sizin için çok büyük kolaylıklar sağlanacaktır.
Bir diğer önemli nokta ise atanan yetkilerin alt katmanlarda aynen geçerli olmasındır. Örneğin
bir bileşene bir rol için yetki atadığınız zaman o rol metodlardada aynı yetkilere sahip
olacaktır. Burada tavsiye edilen diğer bir uygulama ise rollerin sadece işlerine yarayacak
metodlara veya interface’lere erişebilir durumda olmalarını sağlayacak şekilde bir
yetkilendirme yapılmasıdır.
Özel Bileşenler
Bazı özel durumlarda bileşenlerin sadece aynı uygulama içindeki bileşenlerden çağrılabilir
durumda olamasını istersiniz bu durumda rol oluşturmak gibi gereksiz bir maliyete
girmektense COM+ 1.5 ile birlikte gelen IsPrivateComponent metodunu kullanmak bize
büyük kolaylık sağlayacaktır. Daha önceki COM+ sürümlerinde böyle bir yetenek bize
sunulmamaktaydı. Her ayar gibi bu ayarıda yapmak için iki yöntem vardır bunlardan birincisi
kod ile diğeri ise Component Services Administrative Tool’u kullanaraktır. İlk önce bu ayarı
kodla nasıl yapabileceğimizi inceleyeceğiz.
Tamer Öz
www.tameroz.com
<PrivateComponent()> _
Public Class PrivateComponentBileseni
Inherits ServicedComponent
End Class
Şimdi ise Component Services Administrative Tool’u kullanarak nasıl yapacağımızı
inceleyecek olursak bunu bileşenin özelliklerindeki Aktivaysyon(Activation) sekmesindeki
Mark Component Private To Application kutucuğunu işaretleyerek yapabilirsiniz.
COM+’da Role Based Security
COM+ uygulamalarındaki rol tabanlı güvenlik sistemi aynı zamanda
System.EnterpriseServices namespace’i kullanarakda ayarlanabilmektedir. Şimdi ise role
based security ile ilgili güvenlik ayarlarının metod bazında kodla nasıl yapılabileceğini veya
yönetim aracını kullanarak nasıl yapabileceğimizi inceleyeceğiz.
COM+ bize iki seviyede güvenlik ayarı yapma olasılığı sunmaktadır bunlar uygulama bazında
veya class bazında yapılabilecek güvenlik ayarlarıdır. Uygulama bazında güvenlik ayarlarını
yapmak için ApplicationAccessControl attribute’ini kullanabileceğiniz gibi Class bazında
güvenlik ayarları için ise ComponentAccessControl attribute’ini kullanabilirsiniz. Şimdi ise
bu ayarların yapıldıklarına uygulama için ne anlam ifade edeceklerini inceleyelim.
Tamer Öz
www.tameroz.com
Applıcation Security
Enabled
Class Security
Disabled
Enabled
Enabled
Disabled
Enabled / Disabled
Result
Uygulama bazında güvenlik
etkin kılınır ancak client
uygulamaya her eriştiğinde
yetkileri kontrol edilir.
Uygulama bazında güvenlik
etkin kılınır. Client herhangi
bir class’a eriştiğinde
yetkileri kontrol edilir.
Uygulamadi tüm classlar için
güvenlik devre dışı bırakılır.
Application Bazında Güvenliğin Etkinleştirilmesi
Rol tabanlı güvenlik sistemini uygulamanızda kullanabilmek için ilk önce uygulama bazında
güvenliğin etkinleştirilmiş olması gerekmektedir. Bir uygulama için güvenliği COM+
Kataloğunda bulunan ApplicationAccessControl attribute’ini kullanarak etkin kulabilirsiniz.
Bunu yapabilmek için ilk önce AssemblyInfo.vb dosyasına aşağıdaki kodları eklemeniz
gerekmektedir.
<Assembly:
ApplicationAccessControl(AccessChecksLevel:=AccessChecksLevelOption.Applica
tionComponent)>
ApplicationAccessControl attribute’ini kullanırken kullanabileceğiniz bir kaç özellik
bulunmaktadır bunlar; AccessChecksLevel, Authentication, ImpersonationLevel, Value dir.
Bunların arasında en önemli özellik AccessChecksLevel’dir vede uygulamanın kullanacağı
erişim izni kontrol mekanizmasını belirlemekte kullanılır. İki çeşir değeri vardır. Bunlar;
AccessChecksLevelOption.Application : Erişim kontrollerini sadece uygulama düzeyinde
etkin kılar. Bileşen, metod veya interface düzeyinde herhangi bir güvenlik kontrolü
yapılmamaktadır.
AccessChecksLevelOption.ApplicationComponent : Her düzey için erişim izni kontrolünü
etkin kılar. Bu yöntemi kullanmanız daha faydalı olacaktır. Bu yöntemin artısı bileşen, metod
veya interface’lerde de güvenlik kontrolünün yapılmasıdır.
Bu özellik için herhangi bir değer belirtilmediği durumda varsayılan değeri
AccessChecksLevelOption.ApplicationComponent’dır.Bu ayarları yönetim aracının Security
sekmesindeki Properties penceresinden yapmanızda mümkündür.
Tamer Öz
www.tameroz.com
Bileşen Bazında Güvenliğin Etkinleştirilmesi
ComponentAccessControl attribute’i bize bileşen, metod veya interface bazından güvenliği
kullanabilmemizi sağlar. Unutulmaması gereken bir nokta bir bileşen için güvenliğin
etkinleştirilmesinden önce o bileşeni barındıran uygulama için güvenliğin etkinleştirilmesinin
gerekliliğidir. Bileşen bazında kontroller sadece AssemblyInfo.vb dosyasında
ApplicationAccessControl attribute’nde ki AccessChecksLevel property’sinin değerinin
AccessChecksLevelOption.ApplicationComponent olarak atanmış olması veya Bileşenin
property penceresinde Enforce Component Level Access Checks kutucuğunun işaretlenmiş
olması gereklidir.
Tamer Öz
www.tameroz.com
Securityrole Ve Securemethod Attrıbute’larını Kullanarak Roller
Yaratmak
Uygulamanız için güvenliği etkinleştirdikten sonra uygulamanız iin roller yaratmalısınız ve
windows kullanıcılarını ve kullanıcı guruplarını bu rollere atamalısınız. Bundan sonraki adım
ise belirlenen bu rollerin hangi kaynaklar üzerinde yetki sahibi olacaklarıdır. Bu noktada
SecurityRoler attribute’i size role yaratma ve bu rolleri çeşitli kaynaklarda yetkili kılma
yeteneği sunar. SecureMethod ise güvenlik kontrollerinin yapılmasını zorlamaya ve belirlenen
metodların sadece bunlarla ilişkili interface’ler üzerinden kullanıldığından emin olmamıza
yarar. Peki bu attribute’ları nasıl kullanacağız.
<SecurityRole("Calisan", Description:="Sirketimizde Calisan Kullanici")> _
Public Class SecurityOrnegi
Inherits ServicedComponent
Public Interface IMaas
Function MaasOgren(ByVal CalisanId As Integer) As Integer
End Interface
End Class
Public Class Maaslar
Inherits ServicedComponent
Implements SecurityOrnegi.IMaas
<SecurityRole("Calisan"), SecurityRole("Stajyer", True)> _
Public Function MaasOgren(ByVal CalisanId As Integer) As Integer
Implements SecurityOrnegi.IMaas.MaasOgren
'Kodumuz
End Function
End Class
Bu yazılı kodu yapmak aynı zmanda yönetimsel araç içinde bulunan uygulama, bileşen,
interface veya metod özelliklerinde güvenlik sekmesinde bulunan rollerin seçilmesi ilede
kolaylıkla yapılabilmektedir.
Component Services Aracını Kullanarak Roller Yaratma Ve Yönetme
Component Services Yönetimsel Aracını kullanarak rol yaratmak için rol atamak istediğiniz
uygulamanın nodunu genişlettikten sonra roles klasörüne sağ tıklayın ve açılan menüden New
Role seçeneğini seçiniz. Karşınıza çıkan penceredeye yaratmak istediğiniz rolün adını yazın
ve OK tuşuna basınız.
Rolleri yarattıktan sonra ve uygulamayı hayata geçirdikten sonra bu rollere windows kullanıcı
guruplarını veya kullanıcılarını atamak zorundasınız. Bununn için tecrübelere dayanılarak
tavsiye edilen en genel yol COM+ uygulamanızdaki her bir rol için bir Windows kullanıcı
gurubu yaratmak ve yarattığınız b guruplara uygulayı o rolle kullanacak Windows
kullanıcılarını atamaktır. Şimdi yaratmış olduğumuz bu gurupları kendi COM+
uygulamamızdaki roller ile nasıl ilişkilendireceğimizi inceleyelim.
Bu işlemi yatabilmek için yönetimsel araç’ta bulunan windows kullanıcı gurubunu atamak
istediğiniz rolü barındıran uygulamaya ait nodu ve onun altında bulunan Roles klasörünü
genişleterek windows gurubunu atamak istediğiniz rolü seçiniz. Role ait Users klasörüne sağ
tıklayarak açılan menüden New user’ı seçerek karşınıza açılacak olan pencereden istediğiniz
Windows kullanıcı guruplarını veya kullanıcılarını seçebilirsiniz.
Tamer Öz
www.tameroz.com
Ancak bazı durumlarda aynı metoda erişim izni olan kullanıcılara göre farklı işlemler
yapılmak isteniyorsa, örneğin bazı kullanıcıların belirli bir meblağ üzerinde işlem yapmasının
engellenmesi gibi. Bu durumda role based security nin yanısıra program bazında security
algoritmasının hard code olarak yazılması gerekmektedir. Ancak COM+ bize bu konusa
IsCallerInRole veya IsSecurityEnabled gibi iki tane metod sunar.
IsCallerInRole metodu bize o an istekte bulunan kullanıcının hangi role dahil olduğu bilgisini
verir, ancak nesne üzerinde erişim kontrolü yapılmıyorsa bu metod bize her zaman true
değerini döndürecektir.
IsSecurityEnabled ise bize nesne için güvenlik kontrolünün etkinleştirilip etkinleştirilmediğini
bize geri döndürür.
Şimdi bunu bir örnek kodla inceleyelim.
Public Class Securtiy
Inherits ServicedComponent
Public Function OgrenciSil(ByVal OgrenciId) As Boolean
If Not ContextUtil.IsSecurityEnabled Then
Return False
End If
If Not ContextUtil.IsCallerInRole("Mudur") Then
Return False
End If
OgrenciSil(OgrenciId)
End Function
End Class
Bir başka önemli konu ise metodlarımızı veya bileşenlerimizi çağıran programları ident
edebilmektir. ContextUtil classı mevcut context ile ilgili bilgiler taşırken bileşenimize erişen
programlar ile ilgili bilgileri SecurityCallContext class’ından alabiliriz. Bu metodu
kullanabilmek için ilk önce mevcut istek bilgilerini SecurityCallContext nesnesinin içine
doldurmanız gerekmektedir. Bu class’ta yer alan propertylere ve işlevlerine göz atacak
olursak.
CurrentCall : Mevcut isteğin bir örneğini alarak yeni bir nesne oluşturmak için kullanılır.
Callers : İstemcilerin bilgilerini tutan SecurityCallers nesnesini alır.
DirectCaller : Su an nesneyi çağıran.
NumCallers : Mevcut çağrılarda bulunan çağrıcı sayısı.
OrginalCaller : Çağrı zincirinin ilk halkasında bulunan çağrıcı.
Çağrıcıların bilgilerini taşıyan class SecurityIdentity classıdır. Bu classın Collectionu ise
Callers Collectionudur ve bu collectiona ait her nesne AccountName, AuthenticationService,
AuthenticationLevel, ImpersonationLevel propertylerini taşımaktadır.
Dcom Guvenlik Modeli Nedir
COM+ güvenlik modeli DCOM güvenlik modeli ve RPC temel alınarak geliştirilmiştir. Bu
nedenle DCOM güvenlik modelini anlamak bize COM+ güvenlik modelini anlamakta
Tamer Öz
www.tameroz.com
yardımcı olacağından DCOM güvenlik modelini inceleyelim. Bu güvenlik modeli 4 temel
öğeden oluşur. Bu 4 temel öğe;
Başlatma Kontrolü : Bu sayede DCOM server’ini başlatmaya kimlerin yetkili olduğunu
belirlemek mümkündür. Client’ tan bir istek gelmesi durumunda COM SCM bu isteği kontrol
ederek istekte bulunan client’in yetkilerini Windows Registry’sini kontrol ederek onaylar
veya onaylamaz. Bu ayarlara ait değişiklikler yönetimsel araçtan yapılabilmektedir.
Tanımlama Kontrolü : Bir client server tarafından başlatma kontrolünü geçerse hangi
Windows Hesabıyla ilişkili olup olmadığının kontrolü sayesinde kullanıcıyı ident edebilmek
olacaktır.
Authentication : Kontrol için kullanılan kullanıcının ilişkilendirildiği windows hesabıdır.
Ancak opsiyonel olarak kerberos güvenlik sistemide kullanılabilmektedir.
Erişim Kontrolü : Server’da bulunan farklı nesnelere erişimlerin kontrolleri için kullanılan bu
metod genellikle bir authorization policy tarafından sarılmış durumdadır.
Varsayılan Yetkiler
COM+ bize başlatma kontrolü ve erişim kontrolü için bazı varsayılan değerler atayabilmenize
olanak verir. Ve bir dcom uygulaması yapmış olduğumuz bu ayarları direkt kullanabilir. Bu
ayarları yapabilmek için Component Services Administrative Tool kullanarak bu ayarları
yapmak istediğiniz bilgisayara sağ tuşla tıkladıktan sonra açılan menüden Properties
menüsünü seçmelisiniz. Açılan bu pencereden Default COM Security seçmesini seçer ve Edit
default butonuna tıkladıktan sonra açılan bir başka pencereden kullanıcıları veya gurupları
seçebilirsiniz.
Authentication Levelları
Bu kısmın başında bahsettiğimiz gibi authentication temelde bir kullanıcınn kimliğinin
belirlenmesi olayıdır. ApplicationAccessControl attribute’inin Authentication property’sini
kullanarak bazı authentication level ayarlarının yapılması mümkündür.
<Assembly:
ApplicationAccessControl(Authentication:=AuthenticationOption.Call)>
Peki Bu Propertye atayabileceğimiz değerler nelerdir ve ne anlama gelmektedirler. Şimdi
bunları inceleyelim.
AuthenticationOption.Default : Bilgisayar bazında konfigure edilmiş varsayılan
authentication ayarlarını kullanır.
AuthenticationOption.None : Authentication kullanmaz.
AuthenticationOption.Connect : Sadece yeni bir bağlantı açıldığı zaman authentication
mekanizması devreye girer.
AuthenticationOption.Call : Herbir çağrı yapılmadan yani istekte bulunulmadan önce
authentication kontrolü yapılır.
AuthenticationOption.Packet : Her istek için gelen paketler tek tek authentication
mekanizmasının kontrolünden geçirilir.
Tamer Öz
www.tameroz.com
AuthenticationOption.Integrity : Alınan datanın bütünlüğünün kontrol edildiği bir
authentication mekanizmasıdır.
AuthenticationOption.Privacy : Gönderici ve alıcı bilgilerinin kullanarak paketlerin
şifrelendiği bir yöntemdir. Bu en tercih edilen authentication güvenlik mekanizmasıdır.
Bu yöntemi Component Services Administrative Tool kullanarak her bir uygulama için
Properties menüsünün altındaki Security sekmesindende bulunan Authentication Level For
Calls açılır kutusundan yapabilirsiniz.
Identity Ve Impersonation Levelları
Identity bir servera login olmanız durumunda belirttiğiniz kendinizi tanımlayan session bilgisi
iken impersonation ise uygulamanızda kullandığınız bileşenlerin uygulamanıza aitidentity i
nasıl kullanacağının belirlenmesidir.
Uygulamanızın identity’sini belirlemek için yönetim aracından seçmiş olduğunuz
uygulamanın Properties penceresindeki Identity sekmesinde bulunan bir windows hesabını
seçebilirsiniz.
Impersonation Level’ini düzenlemek içinse ApplicationAccessControl attrbiute’inin
ImpersonationLevel property’sini kullanmanız gereklidir.
<Assembly:
ApplicationAccessControl(ImpersonationLevel:=ImpersonationLevelOption.Deleg
ate)>
Tamer Öz
www.tameroz.com
Stateler
State bir uygulamanın işlevini yerine getirebilmesi için ihtiyaç duyduğu verilerdir. Bu veriler
program tarafından her istenildiğinde erişilebilir durumda olmalıdır. State’e örnek vermek
veya tiplerini belirlemek istersek karşımıza birçok tip çıkacaktır. Ancak biz burada en genel
tiplerinden bahsedeceğiz.
User State : Kişiye özel bilgilerin tutulduğu statedir. Örneğin bir alışveriş sitesindeki
kullanıcının alışveriş sepeti içinde bulunan ürünler.
Application State : Uygulama bazında bazı bilgilerin tutulduğu state’dir. Örneğin bir alışveriş
sitesindeki ürün bilgilerinin tutulduğu state.
System State : Uygulama bazındaki statelerin bir adım önünde olan bu state tipi server
bazında olabilmektedir.
Object State : Metod parametreleri veya local değişkenler gibi bazı state’ler bu statü içinde
yer almaktadırlar.
State tiplerini inceledikten sonra şimdi bir state’de ne gibi temel özellikler olması gerektiğini
inceleyelim.
Durability (Uzun Ömürlülük) : Birçok durumda state system çökmelerinden etkilenmemli ve
uzun ömürlü olmalıdır, bunun için tercih eilen yöntem ise genellikle verileri bir dosyada veya
database’de tutmaktır.
Volatility (Değişkenlik) : State de saklanan veriler update edilebilir. Bundan dolayı statelier
bu özelliği desteklemektedirler.
Speed (Hız) : Bazı statelier çok hızlı işlemelidir, bu tarz gereksinimler barındıran state’ler
genellikle memoryde tutulurlar.
Lifetime (Yaşam Süresi) : Tüm state’lerin bir başlangıç ve bitiş süreleri vardır. Nesneler bu
sure boyunca state2de tutulmalıdır. Buna örnek olarak ASP.Net te bulunan caching özelliğini
verebiliriz.
Affinity (İlişki) : Bir uygulama içinde state’ler her zaman bir identity ile tanımlanırlar ve bu
sayede tanımlandıkları kullanıcıya özel olurlar vede bu kullanıcı sistemden çıkıp tekrar
girdiğinde state’leri aynen korunur.
Size (Boyut) : Network üzerinden transfer edilecek bir state senaryosunda çok büyük boyutlu
state’ler tutmak mümkün olmayacaktır.
Statelerin taşıması gereken özellikleri inceledikten sonra şimdi ise state’lerin
deplolanabilecekleri yapıları inceleyelim.
Memory : Hızlı olan bu yöntemin kalıcı olmama gibi bazı dezavantajlarıda mevcuttur.
File System : Sistem kapatıldığında sistemin state bilgilerini kaybetmemesi gerekliliği
gerektiren durumlarda state XML gibi yapılarda saklanabilir.
Tamer Öz
www.tameroz.com
Database : Sistem kapatıldığında satate bilgilerini kaybetmeyen bir başka yapı ise database’dir
ve diğer artıları arasında transactionlarla veri bütünlüğünün sağlanması ve performans
bulunur.
Tavsiye edilen yöntem ise state’lerin database üzerinde saklanması ve uygulama
çalıştırıldığında memory’e yüklenerek kullanılmasıdır. Bunun yanı sıra server-client
uygulamalarında state’ler kimi zaman client makinaların hafızasındada saklanabilir.
State Yönetimi Çözümleri
State’leri saklamak için birçok teknoloji vardır. Bunların herbirininin diğerlerine karşı bazı
üstünlükleri mevcuttur. Şimdi bu çözümleri sunan teknolojileri inceleyelim.
Shared Property Manager : Hafızadaki state’lerin yönetimini sağlayan bu teknoloji COM+’ın
bir parçasıdır ve .Net Enterprise Services tarafından erişilerek kullanılabilir. Bu teknoloji
sayesinde property guruplarını key value bazında ilişki ile tanımlayabilirsiniz.
ASP.NET : Direkt bu işe spesifik bir teknoloji olmamasına karşın bazı uygulamalarda
Asp.Net çok başarılı bir memory state manager olarak görev yapabilmektedir. ASP.NET ‘de
application düzeyinde veya session düzeyinde vede en önemlisi cache’lenmiş bazda state
saklayabilir ve bunların hafızada kalacakları süreleri belirleyebilirsiniz. Bu yintem genellikle
ASP.NET sayfalarıyla veya Web Servisleri ile çalışan servis verilen bileşenler dahilinde
kullanılır.
Database : State yönetiminde çok başarılı ve kullanılması tavsiye edilen Microsoft SQL
Server’i kullanarak statelerinizi database üzerinde yönetebilirsiniz ve çok sorgulanan datalar
içinse memoryde bir cacheleme çözümü üretebilirsiniz.
Shared Property Manager Yapısı
SPM (Shared Property Manager) ‘ın bir örneği her zaman Dllhost.exe içinde çalışır
durumdadır. Aynı işlem içinde SPM’I kullabab tüm bileşenler bu kaynaktan faydalanırlar.
Ayrıca SPM Shared Property guruplarını yönetir ve bu sayede sizde kendi gurubunuzu
yaratabilir veya mevcut bir guruba erişim sağlayabilirsiniz. Tüm gurupların benzersiz isimleri
olması gerekliliği unutulmamalıdır. Her bir gurup sınırsız sayıda property taşıyabilir.
Guruplara aynı anda erişimi engellemek amacıyla SPM aynı zamanda bize bir lock
mekanizması sunar. Bu lock mekanizması gurup veya property düzeyinde olabilir ve lock
düzeyi belirlenebilir.
Biz uygulamamıza SPM’I implemente ederken kullanacağımız classlar elbetteki
System.EnterpriseServices namespace’i altındadır. SPM ise SharedPropertyGroupmanager in
bir örneğinin alınması ile aktif olacaktır. Şimdi ise nasıl bir Shared Property
yaratabileceğimizi inceleyelim.
Shared Property Yaratılması
İlk once mutlaka SharedPropertyGroupManager nesnesinden yaratmalıyız ve bu nesnenin
CreatePropertyGroup metodunu kullanarak istediğimiz shared property’i yaratabiliriz. Bu
Tamer Öz
www.tameroz.com
metodun parametrelerini inceleyelim ;name parametresi bu gurubu tanımlayan ismi alır, diğer
parametreler ise metodun isolation düzeyini ve ne zaman yok edileceğine dair bilgileri alırken
out parameter olan fExist ise gurubun zaten mevcut olup olmadığı bilgisini bize verir.
SharedPropertyGroup nesnesinin CreateProperty nesnesini kullanarak yeni bir property
tanımlayabilir ve buna değer atayabiliriz.
Bir property metod yaratırken isolation modunun nasıl ayarlanacağını inceleyelim. Bunun için
CreatepropertyGroup metodunun dwIsoMode parametresini kullanarak bu ayarı yapabiliriz.
Bu parametreye yollayacağımız PropertyLockMode enumaration’unda iki adet değer
mevcuttur. Bu değerler;
PropertyLockMode.SetGet : Bu özellik property’i okunurken veya modifiye edilirken kilitler.
Buda property okunurken modifiye edilemeyeceği vede modifiye edilirken okunamayacağı
anlamına gelmektedir.
PropertyLockMode.Method : Mevcut metod çalıştırıldığı sürece property gurubunu kilitler, bu
metod genellikle birlikte update edilmesi gereken property’ler için kullanılır.
Bunun dışında bir diğer önemli nokta ise Release modunun nasıl ayarlanacağıdır buda
isolation mode gibi CreatePropertyGroup metoduna yollanacak dwRelMode parametresi ile
ayarlanabilir. Bu parametreye yollanabilecek değerler ise PropertyReleaseMode
enumeration’u içinde bulunur. Şimdi bu enumeration içindeki değerleri ve ne anlama
geldiklerini inceleyelim.
PropertyReleaseMode.Standard : Bu ayar yapıldığı takdirde property gurubu kendisine
referans eden bir interface bulunduğu sürece hafızada kalır. Ancak son referee den objede
hafızadan silindikten sonra SheredPropertyGroup nesnesi yokedilir ve daha sonra garbage
Collectorun devreye girmesiyle tamamen hafızadan kaldırılır.
PropertyReleaseMode.Process : Bu ayar yapılırsa process çalıştığı sürece property gurubu
hafızada kalacaktır ve hiçbir koşulda yokedilmeyecektir. Ancak dikkat edilmesi gereken bu
özelliği taşıyan property guruplarında çok büyük data bulunması durumunda hafıza
kullanımının çok artacağıdır.
Şimdi ise yeni bir property’nin nasıl yaratılabileceğini inceleyelim, bu işlemi yapabilmek için
SharedPropertyGroup nesnesinin CreateProperty metodunu veya CreatePropertyByPosition
metodunu kullanabilirsiniz. Bu metodlardan CreateProperty property’i ismiyle birlikte
tanımlayarak yaratmamızı sağlarken CreatePropertyByPosition ise propertyi numeric indexini
tanımlayarak yaratmamızı sağlar. Ve bu metodların ikiside geriye SharedProperty nesnesini
döndürürken aut parametrelerden fExists ise o property nin zaten mevcut olup olmadığı
bilgisini bize geri döndürür.Bir property’I yaratırken o property’e aynı anda hem isim hemde
index atamak mümkün değildir, yani property yaratılırken ya ismine yada index numarasına
gore yaratılır. Fakat unutulmamalıdırki isme gore yapılan işlemler index’e gore yapılan
işlemlere gore her zaman daha yavaştır.
Şimdi ise bu metodun nasıl kullanıldığını ve bir property’nin nasıl yaratıldığını örnek bir kod
üzerinde inceleyelim;
Tamer Öz
www.tameroz.com
Dim fExists As Boolean
Dim spgm As New SharedPropertyGroupManager()
Dim spgrp As SharedPropertyGroup = spgm.CreatePropertyGroup("GurupAdi",
PropertyLockMode.SetGet, PropertyReleaseMode.Standard, fExists)
Dim prp As SharedProperty = spgrp.CreateProperty("PropertyAdi",
fExists)
Shared Propertydeki Degerlerin Geri Okunması
Öncelikle SharedProperty’ler SharedPropertyGroup’larının içinde yaratıldıkları için
SharedPropertyGroupManager nesnesi yaratılmalı, daha sonrasında bu nesnenin group
metodu kullanılarak property gurubuna erişilmeli ve dahasa sonrasında Property veya
PropertyByPosition metodları sayesinde propertylere erişilir vedeğerleri okunabilir. Şimdi bu
işlemin nasıl yapılacağını örnek bir kodla inceleyelim.
Dim fExists As Boolean
Dim spgm As New SharedPropertyGroupManager()
Dim spgrp As SharedPropertyGroup =
spgm.CreatePropertyGroup("GurupAdi", PropertyLockMode.SetGet,
PropertyReleaseMode.Standard, fExists)
Dim prp As SharedProperty = spgrp.CreateProperty("PropertyAdi",
fExists)
'prp.Value ile propertylerin degerlerini okuyabiliyoruz.
'Bir diger yontem ise
spgm.Group("GurupAdi").Property("PropertyAdi").Value seklinde okumaktir.
Tamer Öz
www.tameroz.com

Benzer belgeler

Transaction ve Ortak Zamanlılık

Transaction ve Ortak Zamanlılık ifade bir transaction olarak algılanır. ∗ Yeni bir transaction başlamadıkça önceki SQL komutlarının tamamı bir transaction olarak işlem görür.

Detaylı