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
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.