Sharepoint 2007 Problemleri

Microsoft Sharepoint 2007 bir büyüğün dediği gibi “immature” bir yazılımdır. Sharepoint ile yazılım geliştirmelerimizde akla hayale sığmayan hatalarla karşılaştık ve gördükki, microsoft bu şekilde dizayn etmiş yazılımı. Ne mi bu hatalar? hemen en önemli hataları listeliyeyim.

 

1. İş akışlarında sonsuz döngü (Infinite Loop in Workflows)

Bir döküman listesi için iş akışı oluşturdunuz ve döküman eklendiğinde ve değiştirildiğinde iş akışının çalışmasını istediniz. Bunun için de out-of-box, yani ürün ile beraber gelen iş akışını kullandınız. Ayrıca, haklı olarak içerik onayı özelliğini de aktfi ettiniz, yani eğer bir döküman admin tarafından onaylanmamışsa, publish edilmesin istiyorsunuz.

adım adım neler olduğunu görelim:

a. Döküman yüklendi, ve iş akışı başladı. 

İçerik onayı: Beklemede.

İş akışı: Sürüyor.

 

b. Admin dökümanı gördü ve onayladı.

İçerik onayı: Onaylandı.

İş akışı: Tamalandı.

 

c. Öğe değiştiğinde iş akışını başlat seçeceğini işaretlediğinizden iş akışı tekrar başladı.

 

İçerik onayı: Beklemede.

İş akışı: Sürüyor.

….

ve yukarıdaki durum A noktasına geri dönüp sonsuza dek sürer. Çünkü Öğe onaylandığında, öğe değiştiği için iş akışı tekrar başlar. Ve iş akışı hiç bitmez. 

Peki öğe neden değişiyor?

Öğeye ait olan İçerik Onayı sütunu, iş akışı tamalandığın değiştiğinde, Sharepoint bunu belgenin değiştiği olarak algılıyor. 

Peki bu sorununu çözümü yok mu? Cevap : Elbette var.

İlk önce out-of-box iş akışı kullanmaktan vazgeçin. Sharepoint Designer kullanın. 

Veya daha sağlam ama uzun yol olan Workflow Foundation kullanın ve Visual Studio ile iş akışı geliştirin.

Service Pack 2′de düzeltileceği söyleniyor Microsoft tarafında ama bakıp göreceğiz.

2. Yeni Klasör’de iş akışı başlamıyor.

Diyelim, bir döküman kütüphanesinde hem içerik onayı kullanıyorsunuz hem de onay iş akışı. Bir belge yüklendiğinde, iş akışının çalıştırılmasını istiyorsunuz.

Fakat, eğer bu kütüphanede bir klasör yaratırsanız ne olacak ? Klasör bir öğe olarak algılanmadığı için iş akışı başlamayacak. Fakat, içerik onayı isteyecek. Haydaa, oldu mu şimdi?

Madem yeni klasörü öğe olarak algılamıyorsun neden içerik onayı istiyorsun?  Yönetici ne yapacak peki? tüm listelere girip acaba onaylanmayan klasör var mı diye araştıracak ?

İşte bu notkada yine iş başa düşüyor ve yeni bir EventHandler yazmanız gerekiyor. Bu eventHandler’i custom content type olarak yarattığını Yeni Klasöre attach edeceksiniz ve klasör oluşturlduğunda iş akışını başlatmış oalcaksınız. Bu eventhandler’i da Visual Studio ile geliştirmek zorundasınız. Ama burda yapılmışı var : CodeProject sağolsun :)

 

3.Web Part düzeyinde izinler.

Örneğin sharepoint ile oluşturduğunuz siteninizde, birden çok webpart kullanılıyor.  Bu webpartlardan biri yüklenirken bir yerden (DB, file,  SPList’ten öğe) bir veri okuması gerekiyor.

Fakat bu noktada,  bu webpart için bir kullanıcının bu veriyi okuma yetkisi olmasın. İşte burada tam veriyi okuma esnasında erişim reddedildi hatası alıyor ve tüm site bu hataya yönleniyor.

Exception handling’te yapılamıyor burada.

Biz ne beklerdik?

Eğer bu webpart’ta erişim sorunu var ise, sadece bu webpart bir hata mesajı ile gelsin. Tüm sitenin kapanmasına gerek yok.

Ayrıca,  sharepointte izinler liste ve site düzeyinde verilebiliyor. Peki ya webpart düzeyinde?

benim iki webpartım var ve birincisi için A grubuna EDİT izni veririken,  diğer webpart için A grubuna yalnızca görüntüle hakkı vermek istiyor olabilirim ,ve bu çok mantıklı bir istektir.

Malesef, Sharepoint’te web-part düzeyinde izin bulunmamaktadır.

 

 

——

aklıma geldikçe bu tür problemlerden bahsedeceğim. takip edin…

WF Yazıları | Developing Custom Activities

WF yazılarımıza devam ediyoruz. Bu yazıda , windows workflow foundation’da nasıl özgün aktivite

(custom activity) oluşturulur ?, unit test’i nasıl yapılır ? ve nasıl validation ayarlamaları yapılır? gibi konulardan bahsedeceğiz.

Öncelikle; neden bir custom aktiviteye ihtiyacımız oluyor, bundan bahsetmek gerekir. 

Neden Custom Activity

Custom activity aslında CodeActivity’e benzeyen kod blokları içerir. İçinde kendi business logic’i kendi değişkenlerini barındırır. CodeActivity ise workflow’un değişkenlerini kullanır.

Ayrıca, CustomActivity’i bir component gibi düşünebiliriz, dış dünyadan bağımsız, sadece kendi değişkenlerini kullanarak kendi işlemleri yerine getirir. Bir custom activity’i istediğimiz workflowlarda, business logic’i ile beraber kullanabiliriz.

Örneğin; öyle bir custom activity tasarladık ki, bu aktivitenin görevi kullanıcının hesap numarasını getirmek olsun. İşte bu custom aktiviteyi  hesap numarası getirme işlemine ihtiyacımız durumlarda workflowda kullanabiliriz.

Diğer avantajları ise, kendi başına test edilebilir ve  toolbox’a koyarak drag-drop işlemi ile workflow’a entegre edelebilir.

Elbetteki bazı dezavantajları da var: Normalde custom activity,  CodeActivity re-usable olmadığından kullanılır. Ama siz öyle bir işlem yapmak istersiniz ki, bir daha aynı işlem karşınıza çıkmayacak. O halde custom activity’e bulaşmaya hiç gerek yok. CodeActivity işimizi görür. Custom aktivite adı üstünde custom olduğundan daha çok efor ve daha çok kod gerektirir.

Custom Activity Oluşturuyoruz: 

– will be updated–

 

WF Yazıları | Exploring Standart Activities

İlk başta WinFX ile anılmaya başlanan windows foundation serileri Windows Communication Foundation,Windows Presentation Foundation , Windows Workflow Foundation ve Windows Cardspace olarak piyasaya sunulmuştur.

Forum ve sitelerde bu teknolojiler ile yeterince makale bulunmaktadır. Ben ise bu blog’ta ilk önce Workflow ile başlayıp, bir yazılım geliştiricinin ihtiyaç duyabileceği özellikleri yazmaya çalışacağım.

Öncelikle workflow foundation nedir, ne için kullanılır diyen arkadaşların YazGelistir.com‘da Çağdaş Davulcu‘nun kaleme aldığı bu makaleyi okumalarını tavsiye ederim.

Bu ilk Workflow yazımda ise standart aktivitlerin üzerinden hızlıca bir geçiş yapacağız, aslına bakılırsa bu yazı geliştiriciler için aktivite türleri hakkında bir referans olarak algılanabilir.

Herhangi bir worfklow projesi açtığımızda visual studio toolbox’ta aşağıdaki öğeler görünecektir. Bu öğeler workflow standart aktiviteleridir ve “out-of-box” adıyla anılmaktadır.

Şimdi bu aktiviteleri hızlı referans olması amacıyla kısa kısa açıklayalım:

workflow-activities

 

Yukarıdaki aktiviteler aslında fonksiyonalite olarak gruplara ayrılırlar. Bu gruplar:

  • Custom Workflow Logic
  • Flow Control
  • State Management
  • Event Handling
  • Local Service Management
  • Rules
  • Web Services
  • Transactions,Compensation,Synchronization
  • Exceptions and Error Handling.

Custom Workflow Logic

Code Activityİş akışına kod eklemenin kolay yoludur. İş akışı CodeActivity’e geldiğinde ExecuteCode eventi çalışır. Business Logic’i encapsulate etmesi açısından kullanışlıdır fakat re-usable değildir. Aynı CodeActivity’i başka bir workflow’da kullanamazsınız. Bunun yerine Custom Activity yazılmalıdır.

Flow Control

IfElseActivity ve IfElseBranchActivity 

– will be updated–

Görselleri BLOB olarak veritabanında saklama

Web projelerimizde bazen altyapı tercihleri veya kısıtlmaları sebebiyle upload edilen resim veya görselleri filse system üzerinde saklayamabiliriz. Bunun yerine bu görselleri veritabanına saklayarak, resimlerin gösterilmesi, eklenmesi ve bunun gibi işlemleri veritabanı kullanılarak gerçekleştirebilir. Burada söz konusu olan işlem imajı BLOB ( Binary Large Object ) olarak veritabanında saklama işlemidir.

Aşağıda bu işlemin nasıl yapılacağında dair bir örnek gösterilmektedir.

Görseli veritabanına upload etme işlemi  (VB.NET)

 

// Tanımlamalar
Dim fileName As String
Dim fileType As String
Dim namePosition As Int16
Dim stream As IO.Stream

//DB
Dim conn As New Data.SqlClient.SqlConnection
Dim connectionString As String = ConfigurationManager.AppSettings("MY_CONNECTION_STRING")
conn.ConnectionString = connectionString

//FileUpload kontrolü ile göreseli okumaya başlıyoruz.

stream = FileUploadObj.PostedFile.InputStream
Dim uploadedFile(stream.Length) As Byte  //
stream.Read(uploadedFile, 0, stream.Length)

conn.Open()

//Upload edilen dosyanın özellikleri alınıyor.
namePosition = FileUploadObj.PostedFile.FileName.LastIndexOf("\") + 1
fileName = FileUploadObj.PostedFile.FileName.Substring(namePosition)
fileType = FileUploadObj.PostedFile.ContentType

Dim description As String = TXT_Description.Text

Dim command As Data.SqlClient.SqlCommand =
              New Data.SqlClient.SqlCommand("INSERT INTO tblImage (Description,FileType, DFile,FileName,)
              Values(@Description, @DocumentFileType,@DocumentFile, @DocumentFileName)", conn)

command.Parameters.Add("@Description", SqlDbType.NVarChar, 100).Value = description
command.Parameters.Add("@DocumentFileType", SqlDbType.NVarChar, 50).Value = fileType
command.Parameters.Add("@DocumentFile", SqlDbType.Image, uploadedFile.Length).Value = uploadedFile
command.Parameters.Add("@DocumentFileName", SqlDbType.NVarChar, 50).Value = fileName

//upload edilen dosya, artık veritabanında BYTE olarak kayıt edildi.
command.ExecuteNonQuery()
conn.Close()
Görseli veritabanından okuma ve resimi gösterme işlemi

Görseli veritabanına kaydettikden sonraki işlem ise, byte şeklinde bu veriyi okuyup tekrar image haline çevirmek. Burada elbette en başta veritbanında ilgili tablonun ilgili column’ı byte tipinde olmalıdır.

// tblImage'den veri okuma.	

myConnection.Open()

Dim myDataReader As SqlDataReader

myDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)

 

Do While (myDataReader.Read())

   If Not IsDBNull(myDataReader.Item("DFile")) Then

   Response.ContentType = myDataReader.Item("FileType")

   //byte tipinde columu okuma biçimi ve binarywrite yöntemi	

   //BinaryWrite görseli ekranda direk gösterir.	

   Response.BinaryWrite(myDataReader.Item("DFile"))

  Else

     Exit Do

  End If

Loop

myConnection.Close()