CRM 4 ZORUNLU ALANLARI DOLDURMADAN KAYDI PASİF YAPMA VE WORKFLOW KULLANIMI

1-)Öncelikle crm de zorunlu alanlar doldurulmadan kayıt işlemleri tamamlanamaktadır.Aynı mantıkdan bir kaydı pasifleştirmek istediğimiz zamanda zorunlu alanları doldurmamız gerekir önce ancak zaten pasifleştirmek istediğimiz bir kayıt için bir daha alan doldurmak zaman kaybı olacaktır.(Özellikle sonradan eklenen zorunlu alanlar yeni kayıtlar için değilsede eski kayıtlar için sorun yaratacaktır)

Bu sıkıntıyı aşmak için önce şöyle bir yöntem denedim

Formun OnSave eventine

if(event.Mode==5) //formun etkinliğin kaldırılması olayıdır

crmForm.all.SetReqFieldLevel(“fieldname”,0);

bu kodda ancak zorunlu alanlar doldurulduktan sonra işleme geçmekte bu da bizim sorunumuzu çözmemektedir.

2-)Bu sorunu aşmak için yapmamız gereken ise isteğe bağlı çalışacak şekilde bir workflow oluşturmaktır.Aşağıdaki resimde ise iş akışını çalıştırmak istediğimiz varlığı seçiyoruz

3-) 2 olarak biz bunu sadece kaydı pasif yapmak istediğimiz zaman çalıştıracağımız için isteğe bağlı olarak işaretleriz ayrıca bütün kullanıcılarımızın kullanabilmesi içinde kapsamı organizasyon bazında seçiyoruz

4-)Daha sonra adım ekleden gelerek kaydın durum değerini etkin değil olarak vererek bir adım oluşturuyoruz.

5-)Burayı kaydedip kapattıktan sonra iş akışımızın etkin olabilmesi için yayında olması gerekir.Bunuda yayımla tıklayarak aktif ediyoruz.

Not:İş akışlarında değişiklik yapabilmek için tekrar taslak durumuna almanız gerekmektedir

6-)İş akışını yayınladıktan sonra iş akışını çalıştır öğesine tıklıyoruz

7-)Daha sonra oluşturduğumuz iş akışını seçip çalıştırıyoruz.Bi kaç dakika içinde kaydımız pasif hale geliyor.İlgili kaydı kapatıp tekrar açtığımızda artık bu kayıt pasif olmuş şekilde karşımıza geliyor.

CRM kategorisine gönderildi | Yorum bırakın

ENTITY FRAMEWORK – 1

1-)Entity Framework de,LLBLGEN,NHIBERNATE gibi bir ORM tooludur.Ancak Özelliği Microsoftun kendi orm toolu olduğu için Visual Studio 2008/2010 kurduğunuzda otomatik olarak gelmektedir.

İlk Önce Entity Frameworkdede nesneleri oluşturmamız gerekmektedir

2-)Bize ilk soracağı şey nesneleri databaseden modellemek istediğimiz,yoksa nesneleri kendimizin oluşturup sonradan mı database oluşturacağımıza karar vermemizdir.Empty model ise database vermeden kendimizin nesneleri oluşturması için kullanılır.Ancak daha sonra istersek tersine mühendislik yaparak databasemizi oluşturup connection bağlayabiliriz.Ancak bizim veritabanımız zaten mevcut olduğu için Generate from database seçeneğini seçiyoruz.

3-)Bir sonraki adımda Connectionımızı belirliyoruz

4-)Bu adımda modellemek istediğimiz database nesnelerimiz seçiyoruz.Tabi hepsini aynı ayda oluşturmak zorunda değiliz istersek bir kısım tablo ve viewleri oluşturmayabiliriz veya sonradan oluşturabiliriz

5-)Artık contextimiz oluşmuş durumdadır

6-)Contextimizi oluşturduktan sonra model browserdan Özelliklerimize bakabiliyoruz.

7-)Peki Veritabanımıza yeni bir tablo eklediğimiz zaman veya alan eklediğimizde bunları contexttimize nasıl yansıtırız.Örnek olarak Kisi Tablomuza yeni bir alan ekleyelim ve Kitap diyede yeni bir tablo ekleyelim.

Model Browserdan Model1.edmx in üstüne gelip sağ tuş dediğimizde

Update Model From Database diyoruz.Daha sonra açılan ekrandan veritabanımıza yeni eklenen tablo,view vs görüntüyebiliyoruz.Burada yeni eklenen kitap tablosunu seçiyorum.(Zaten mevcutta ekli tablolar üstünde değişiklikleri kendisi görüyor,ayrı birşey seçmeme gerek yok).Bu şekilde finishe bastığımızda artık yeni eklediğim TC kimlik numarası alanı ve yeni tablom benim modelimin içerisine gelmiş oldu.

8-)Lazy Load Kısaca verilerin bağlı oldukları verileride getirmesi işlemidir

Modelimiz(Contextimiz) in lazy load özelliğine bakmak istiyorsak isel Model Browserdan

Modelimizin Properties tıklayarak Lazy Load Enabled özelliğimizi True veya False

alabiliyoruz. Ben aşağıda lazy load açıkken ve kapalı iken Sql Profilerdan Sql giden sorguları trace ettim.

TelefonRehberiEntities tr = new TelefonRehberiEntities();

var kisi = tr.Kisi;

dataGridView1.DataSource = kisi;

Lazy Load Kapalı iken

Bu sorgu en temel sorgulardan biridir.

SELECT

[Extent1].[KisiID] AS [KisiID],

[Extent1].[Ad] AS [Ad],

[Extent1].[Soyad] AS [Soyad],

[Extent1].[Cinsiyet] AS [Cinsiyet],

[Extent1].[Yas] AS [Yas],

[Extent1].[TCKimlik] AS [TCKimlik]

FROM [dbo].[Kisi] AS [Extent1]

Lazy Load Açık iken

SELECT

[Extent1].[KisiID] AS [KisiID],

[Extent1].[Ad] AS [Ad],

[Extent1].[Soyad] AS [Soyad],

[Extent1].[Cinsiyet] AS [Cinsiyet],

[Extent1].[Yas] AS [Yas],

[Extent1].[TCKimlik] AS [TCKimlik]

FROM [dbo].[Kisi] AS [Extent1]

exec sp_executesql N’SELECT

[Extent1].[KisiID] AS [KisiID],

[Extent1].[DogumGünü] AS [DogumGünü],

[Extent1].[Meslek] AS [Meslek]

FROM [dbo].[KisiDetay] AS [Extent1]

WHERE [Extent1].[KisiID] = @EntityKeyValue1′,N’@EntityKeyValue1 int’,@EntityKeyValue1=1

Lazy load açıkken Görüldüğü gibi kayıtların ilişkili kayıtlarıda görmüş olur

.NET kategorisine gönderildi | Yorum bırakın

SSRS’DE BİR TABLO için ÇOKLU DATASET KULLANMA

Esasta pek çok okuduğunuz makalede bunun olanaksız olduğunu ve subreport kullanmanız gerektiği veya datasetleri birleştirmeniz gerektiğini okuyacaksınız

Ancak bunu yapmanın üçüncü bir yolu daha var subreport kullanmak(Tabi burda first(Fields!X.Value,’X dataset’) gibi bişeyden bahsetmiyorum çoklu kayıt taşıbilecek şekilde bir kullanımdan bahsediyorum.

Benim şöyle bir senaryom oldu.Ana bir raporum var ancak ben raporumda headerların başlıklarının gelen parametreye göre ingilizce veya Türkçe olmasını istiyorum.Ancak raporun bilgileri çektiği tabloların sorgusu ile verilen raporların başlıklarının tutulması sorgusu birbiriyle alakasız olacağı için farklı iki dataset kullanmam gerekiyor

Öncelikle aşağıdaki Kod bloğunu Raporumuzun custom code bölümüne ekliyoruz

Public  ColumnNamesList As String() = {}

Public  Function AddToColumnNamesList(txt as String) As string

dim L as integer = ColumnNamesList.Length

ReDim Preserve ColumnNamesList(L)

ColumnNamesList(L)=txt

return ColumnNamesList(L)

End Function

Public Function GetColumnName(i as integer) As string

return ColumnNamesList(i)

End Function

Yukarıdaki kod ne yapıyor

Birinci tablom ReportName diye bir DataSetten kolon başlıklarını okuyor

=Code.AddToColumnNamesList(Fields!displaytext.Value)

İkinci tablom ise Farklı bir datasetten kayıtlarımı okuyor

Ama ben aşağıdaki şekilde headerlarımın expressionına aşağıdaki kodu yazıyorum.Böylece verdiğim numaraya karşılık gelen Listeden başlığı okuyup ekranda gösteriyor

=Code.GetColumnName(4)

Ancak biz ilk kolon isimlerini taşıyan tablomuzun görünmesini istemiyoruz.Bunun için ssrs 2005 de tabloyu görünmez yapmamız yeterli ancak ssrs 2008 kullandığımızda bu işlem olmuyor maalesef

SSRS 2008 de ise bu mantığın çalışması için kolonun isimlerini taşıyan(ilk)tablonun hiddenın false olması gerekiyor.Böyle bir durumda ise tablonun width ve height 0 yapıyoruz ve Lokasyon olarakda ilk tablomuzdan yukarda olmayacak şekilde ikinci tabloyu yerleştiriyoruz.Eğer ikinci tablomuz birinciden daha yüksek olursa ikinci tablo birincide yazılanları algılamıyor ve hata veriyor(Saçma ama bu şekilde)

İyi Çalışmalar

SQL SERVER kategorisine gönderildi | Yorum bırakın

LLBLGEN GİRİŞ – 2

8 – ) LLBLGen Select * From Tablo kullanımı.GetMulti metodu içine farklı değerler alır ama direkt tabloyu getirmek istersek içine null basıyoruz.

KisiCollection kc = new KisiCollection();

kc.GetMulti(null);

dgvData.DataSource = kc;

9-)Inner join kullanımı,RelationCollection oluşturup getmulti metodu içinde belirtiyoruz.Join Hintteki duruma göre left join,right join,cross join vs yapılabilir

KisiCollection kc = new KisiCollection();

IRelationCollection Iliski = new RelationCollection();

Iliski.Add(KisiEntity.Relations.TelefonEntityUsingKisiId,JoinHint.Inner);// Join hint verilmez ise default innerdır

kc.GetMulti(null,0,null,Iliski);

10-)LLBLGen sorgu where kullanımı

KisiCollection kc = new KisiCollection();

IPredicateExpression wherekosul = new PredicateExpression();

wherekosul.Add(KisiFields.KisiId == 1); //Bu en temel manada where KisiID=1 olanı getir demek

wherekosul.AddWithOr(KisiFields.Cinsiyet == true); //AddWithOr ile where KisiID=1 or Cinsiyet=True demek

wherekosul.AddWithAnd(KisiFields.Ad % “%Bilge%”);// % like demek.ayrıca bunuda eklersek where KisiID=1 or Cinsiyet=True and Ad like ‘%Bilge%’

kc.GetMulti(wherekosul);

dgvData.DataSource = kc;

11-)Sort kullanımı

KisiCollection kc = new KisiCollection();

ISortExpression sort = new SortExpression();

//sort.Add(KisiFields.Ad | SortOperator.Descending);Alttakide kodda bu da sortta kullanılır

sort.Add(new SortClause(KisiFields.Ad,SortOperator.Descending));

kc.GetMulti(null, 0, sort);

dgvData.DataSource = kc;

12-)Kişiye ait telefonları getirme(Diğer yöntemde master-detail grid yapısıdır)

KisiCollection kc = new KisiCollection();

IRelationCollection Iliski = new RelationCollection();

Iliski.Add(KisiEntity.Relations.TelefonEntityUsingKisiId, JoinHint.Left);//Join hint verilmez ise default innerdır

ExcludeIncludeFieldsList gridgoster = new ExcludeIncludeFieldsList(true);

gridgoster.Add(KisiFields.KisiId);

gridgoster.Add(TelefonFields.TelefonId);

gridgoster.Add(TelefonFields.KisiId);

kc.GetMulti(null, 0, null, Iliski,null,gridgoster,0,0);

dgvData.DataSource = kc;

Not:Kisi Entitye telefonları çekebilmek için custom Özellik yazdık

Kırmızı commentli alanların içine custom kodu yazmak zorunludur.Aksi takdirde llblgen de değişiklik yapıp source kodu tekrar generate yaptığınızda kodunuzu uçurur.

#region Custom Entity code

// __LLBLGENPRO_USER_CODE_REGION_START CustomEntityCode

public string PhonesAsString

{

get

{

string phones = string.Empty;

foreach (TelefonEntity tel in this.Telefons)

{

phones += tel.Telefon+”,”;

}

return phones;

}

}

// __LLBLGENPRO_USER_CODE_REGION_END

13-)Tekli insert yapmak için entity nesneleri basıp Save demek yeterli

//Tek bir kayıt için Save

KisiEntity ke = new KisiEntity();

ke.Ad = txtAd.Text;

ke.Soyad = txtSoyad.Text;

if (rdbErkek.Checked)

{

ke.Cinsiyet = true;

}

else

{

ke.Cinsiyet=false;

}

ke.Save();

MessageBox.Show(“Kayıt Yapıldı”);

KisiCollection kc = new KisiCollection();

kc.GetMulti(null);

dgvData.DataSource = kc;

14-)Bir nesnenin detayını getirmek istersek,Tek bir entity oluşturup içerisine primary keysini vererek çekebiliriz

KisiEntity ke = new KisiEntity(KisiID);

txtAd.Text = ke.Ad;

txtSoyad.Text = ke.Soyad;

if (ke.Cinsiyet == false)

rdbKiz.Checked = true;

else

rdbErkek.Checked = true;

}

15-)Tek bir nesne update edilecekse sadece entity için değer verilip entity doldurulup save demek yeterli.Save içine true yazılırsa chield nesnelerde otomatikman update olur

int KisiID=Convert.ToInt32(dgvData.CurrentRow.Cells["KisiID"].Value.ToString());

KisiEntity ke = new KisiEntity(KisiID);

MessageBox.Show(ke.IsDirty.ToString());//Kayıtta değişiklik olup olmadığı flagi false

ke.Ad=txtAd.Text;

ke.Soyad = txtSoyad.Text;

if (ke.Cinsiyet == false)

ke.Cinsiyet=false;

else

ke.Cinsiyet=false;

MessageBox.Show(ke.IsDirty.ToString());//Burada eğer alan değişiklik yapılmış ise true

ke.Save();

MessageBox.Show(“Kayıt Update oldu”);

16-)Tek kayıt için silme entity bulup delete demek yeterli

int KisiID = Convert.ToInt32(dgvData.CurrentRow.Cells["KisiID"].Value.ToString());

KisiEntity ke = new KisiEntity(KisiID);

ke.Delete();

17-)LLBLGen de batch işlemler yapmak için dataworker nesnesini kullanıyoruz.

Toplu insert,update ve delete için.Bizden transaction ister aşağıda açıklamalar mevcut

UnitOfWork dataworker = new UnitOfWork();

KisiCollection kc = new KisiCollection();

kc.GetMulti(null);

foreach (KisiEntity ke in kc)

{

ke.Soyad = ke.Soyad + “1″;

dataworker.AddForSave(ke);

}

Transaction tr = new Transaction(IsolationLevel.ReadCommitted,”UOW”);//Readcommitted olursa işlem bitene kadar kimse kayıt değişikliği yapamaz

dataworker.Commit(tr,true);//Committe ikinci parametre olarak true verirsek commit işlemi otomatik olarak bitirilir.

//DataWorker committe false verirsek transaction işlemi otomatik olarak commit veya rollback olmaz.Biz elle commit edip,rollback etmeliyiz

//dataworker.Commit(tr, false);

//try

//{

//    tr.Commit();

//}

//catch

//{

//    tr.Rollback();

//}

18-) İlişkili Nesnelerin kullanımına örnek,kişiye ait telefonları yazdırma

KisiCollection kc = new KisiCollection();

kc.GetMulti(null);

foreach (KisiEntity ke in kc)

{

if (ke.Telefons.ToList().Count()>0)

{

foreach (TelefonEntity te in ke.Telefons)

{

listBox1.Items.Add(te.Telefon.ToString());

}

}

}

.NET kategorisine gönderildi | Yorum bırakın

LLBLGEN GİRİŞ – 1

Öncelikle LLBLGEN LINQ veya NHibernate gibi bir ORM aracıdır.Nesnelerinizi modelleyebilmeniz için llblgen sitesinden gerekli programı indirip bilgisayarınıza kurabilirsiniz.

1-)Relational Model Data dan

Add Relational Model Data from DataBase diyoruz

Daha sonra SQL Server 2000/2005 …. seçeneğini seçiyoruz

2- Daha sonra çalışcağımız DataBase seçiyoruz.

3-Project kısmından GenerateSource Code diyoruz

Template kısmı önemli burada Adapter veya Self ServicingAdapter:

Adapter: Ado.netteki DataAdapter gibi,Daha fazla kod ama adımlara daha fazla müdahale imkanı,çoklu database veya dağıtık mimari için daha ideal

OrderEntity myOrder = new OrderEntity(10254);
DataAccessAdapter adapter = new DataAccessAdapter();
adapter.FetchEntity(myOrder);
myOrder.EmployeeID = 6;

adapter.Save(myOrder);

SelfServicing:Tek database var ise,dağıtık yapı kullanılmayacak ise kullanışlı

OrderEntity myOrder = new OrderEntity(10254);
myOrder.EmployeeID = 6;

myOrder.Save();

Destination folderdan kodumuz nereye generate olcak diyoruz

Start Generate Denilince kodu üretiyor zaten

4-) Daha sonra kodu oluşturduğumuz yerden solutiona ekleme yapıyoruz.(Adım 6 daki gibi entityleri generate etmez isek entity classes bişey gelmez.Doğrusu adım 6 daki işlemden sonra code generate  yapmak)

5-)Tablomuza alan eklediysek Şekildeki Refresh etmemiz gerekir

Eğer yeni tablo eklediysek gene Refresh Relational diyoruz ancak bu sefer eklediğimiz tabloyuda seçiyoruz

6-)Tablolardan sonra reverse-engineer to Entity Definitions diyerek de entityleri oluştuyoruz

Daha Generate Source kod diyoruz.

7-Daha sonra Projemize bir Windows Form Ekliyoruz

Ve Proje Referansı olarak llblgenin otomatik oluşturduğu class library ayrıca

SD.LLBLGen.Pro.ORMSupportClasses.NET20.dll

SD.LLBLGen.Pro.DQE.SqlServer.NET20.dll Yeni eklediğimiz projemize referans olarak ekliyoruz.

Ayrıca projemizdeki app config  deki bağlantı cümlemiz llblgenin create ettiğimizdeki aynı olmalı

<add key=”Main.ConnectionString” value=”data source=.;initial catalog=TelefonRehberi;integrated security=true”/>

.NET kategorisine gönderildi | Yorum bırakın

TELNET KULLANARAK HTML SAYFA GÖRÜNTÜLEME

 

1-Öncelikle Bilgisayarda telnet olmayabilir.program Ekle kaldırdan Windows bileşenlerinden telnet bileşenlerini yüklemek lazım

2-Başlat dan cmd yazarak command prompta girilir.ve aşağıdaki komut yazılır en sondaki 80 port numarasıdır entera basılır.

3-)Entera basıldığında aşağıdaki gibi ekran açılır.Yazdıklarınız görünmez ama aşağıdaki

GET /index.html kodu bu açılan ekrana yazıp enter demeniz gerekir

4-)Görünmeyecek şekilde adım 3 teki kodu yazıp entera basarsanız aşağıdaki gibi bir html çıktısı elde ederseniz.Uyarı eğer bağlantı bulunduğunuz yerde firewall veya isa server varsa ben şirkette denedim burdanda bu komut dönebilir.

Genel kategorisine gönderildi | Yorum bırakın

WINDOWS COMMUNACTION FOUNDATION -1

WINDOWS COMMUNICATION FOUNDATION (WCF)

WCF, temel olarak COM+, .Net Remoting, XML Web Servisleri, MSMQ gibi

Servislerin yeteneklerini bünyesinde barındıran ve tam SOA (Service Oriented Architecture – Servis Yönelimli Mimari) desteği sağlayan güçlü bir Framework API’ si olarak tanımlanabilir

WCF ABC si

Address:Servisimiz internet/intranet vs… hangi adreste bulunmakta

  • Bilgisayarın adı,
  • Site adı,
  • Network adı,
  • İletişim portu adı,
  • Pipe adı,
  • Queue adı,
  • Belirli bir path bilgisi,
  • URI adı

Binding:Protokoller(Servisimizle hangi protokolle veri işlemleri yapılacak)

  • HTTP,
  • TCP,
  • P2P (Peer To Peer),
  • IPC (Inter-Process Communication),
  • MSMQ (Microsoft Message Queuing),
Binding Tipi Konfigurasyon
Elementi
Taşıma Çeşidi
(Transport Type)
Veri Çözümlemesi
(Data Encoding)
Platform
Desteği
(Inter
operability)
BasicHttpBinding <basicHttpBinding> HTTP / HTTPS Text Var
NetTcpBinding <netTcpBinding> TCP Binary Yok
NetPeerTcpBinding <netPeerTcpBinding> P2P Binary Yok
NetNamedPipeBinding <netNamedPipeBinding> IPC Binary Yok
WSHttpBinding <wsHttpBinding> HTTP/HTTPS Text/MTOM Var
WSFederationBinding <wsFederationHttpBinding> HTTP/HTTPS Text/MTOM Var
NetMsmqBinding <netMsmqBinding> MSMQ Binary Yok
MsmqIntegrationBinding <msmqIntegrationBinding> MSMQ Binary Var
WSDualHttpBinding <wsDualHttpBinding> HTTP Text/MTOM Var

MTOM: (Message Transimision Optimization Mechanism)

istemci(Client) ve servisler(Service) arasında resim, ses, video gibi yüksek boyutlu içeriklere sahip olabilecek verilerin taşınması amacıyla çoğunlukla MTOM(Message Transimision Optimization Mechanism) standardını kullanırlar. WC3 tarafından kabul edilmiş bu standarda göre ikili(binary) formattaki verilerin aktarılması daha performanslıdır

Detaylı kullanımı: http://www.buraksenyurt.com/2007/11/default.asp

BasicHttpBinding:http protokolunu kullanır.SOAP 1.1

Örnek adresi: http://localhost:8000/DMSServices/FaturaService

http://msdn.microsoft.com/en-us/library/ms731361.aspx

NetTcpBinding:Genelde intranet kullanımları için uygun mesajlar tcp protokolü üstünden gidiyor

Örnek adresi:net.tcp://localhost:8080/DMSServices/FaturaService

http://msdn.microsoft.com/en-us/library/ms731343.aspx

WSHttpBinding:BasicHttpBinding benzer ama transaction,WS-Addressing,Güvenli mesajlaşma gibi özellikleride var.Http protokolünü kullanır.SOAP 1.2 desteği.BasicHttpBinding daha hızlı ama daha az güvenli

BasicHttpBinding transport sevisiyesinde sadece ssl güvenliği

WSHttpBinding:SSL ve WS Security

WS –Addressing ve WS-Security belli standartlar ve specifikasyonlar(end pointler arası mesajların güvenlik vs için)

Contract:Servisin ne iş yaptığını belirtir(Kısaca neyi nasıl vereceksin neyi nasıl alacaksın)

  • Service Contract:Servis Üzerinden hangi işlemler yapılabilir
  • Data Contract: Servislerden istemcilere giden ve istemcilerden servise gelen veri tiplerini tanımlayan sözleşme çeşididir
  • Fault Contract: Servis tarafından hangi hataların fırlatılabileceğini ve bunların istemciye nasıl aktarılacağını tanımlayan sözleşme çeşididir

 

WCF İçin Hosting Şekilleri

IIS Hosting:WCF Servisleri web üzerinden hizmet verebilir

Self Hosting

  • Windows Activation Service:Vistadan itibaren var,http desteği olmayan host uygulamaları için iis benzeri yapı
  • Windows Application
  • Console Application
  • Windows Service

 

WCF için Projemizi Create Edelim

1-)Öncelikle Hangi Verilerimizi vereceğimizi ve ve bu verilerimizin modellemesini yapalım

Bunun için projemize Yeni bir ClassLibrary ekleyerek ,referanslardan system.runtime.serialization namespaceini ekliyoruz(DataContract attribute kullanabilmek için).Bu Library aşağıdaki gibi bir class ekleyelim

DataContract:Service ile Client arasında gidip gelecek dataların tanımlanmasıdır

DataContract Attribute hangi veri modelimiz  serviste kullanılacaksa bu model classın üstüne eklenmeli

DataMember ise o veri model classında bulunan propertilerimizden hangileri servise açık olacak bunu belirtiyoruz.Data Member Attribute unu field ve propertlerin üstlerine eklememiz gerekiyor

namespace EntityClasses

{

   [DataContract]

   public class PersonEntity

    {

       [DataMember]

       public int PersonID { get; set;}

       [DataMember]

       public string Name { get; set; }

       [DataMember]

       public int Age { get; set; }

    }

}

Not:

Bu tarz nesne modellemesi yaparken POCO mantığında yapmak faydalı olabilir.POCO (Plain Old CLR Object):Yani kısaca bu mantıktaki nesneler herhangi bir sınıftan türemeyen,herhangi bir interface implemente etmeden verileri olabildiğince en sade halde tutmaktır.Yani orm vs… oluşturulan classlardan ziyade daha basit bir model oluşturmak amaçtır.Tabi internette poco modeli kullanmakla ilgili farklı görüşler var,extra bu şekil kod yazmak vs… gibi

2-)Data Sonra Servisimizde hangi metodlar dışarıya açılacak bunu belirtiyoruz

Bunun içinde projemize bir class library daha ekleyerek ismine BusinessService diyelim

1 maddedeki entity modellerimizi kullanmak için EntityClasses Library referanslardan proje referansı olarak ekliyoruz.Ayrıca ServiceContract Attribute kullanabilmek içinde System.ServiceModel dll projeye referans olarak eklenmesi gerekiyor.

Service Contract sınıfımız servis sözleşmesinde olacağı

Operation Contract ile de hangi metodlarımızın servis sözleşmesinde kullanılabileceğini belirtiyoruz.GetPersonByID metodu OperationContract ile tanımlanmadığı için Clientlar bu metodu kullanamayacaklardır.

  [ServiceContract]

    interface IPersonService

    {

        [OperationContract]

        List<PersonEntity> GetAllPerson();

        [OperationContract]

        List<PersonEntity> GetPersonByAge(int Age);

        List<PersonEntity> GetPersonByID(int ID);

    }

Ben database bağlantısı yapmayacağım için kodda PersonPool diye bir class atıp aşağıdaki gibi bir liste oluşturdum

        public List<PersonEntity> Persons()

        {

        PersonEntity Person1 = new PersonEntity { PersonID = 1, Name = “Bilgehan Yıldız”, Age = 24 };

        PersonEntity Person2 = new PersonEntity { PersonID = 2, Name = “Tahir Çakmak”, Age = 24 };

        PersonEntity Person3 = new PersonEntity { PersonID = 3, Name = “Tayfun Taşkın”, Age = 25 };

        PersonEntity Person4 = new PersonEntity { PersonID = 4, Name = “Yasin Türk”, Age = 21 };

        List<PersonEntity> PersonList = new List<PersonEntity>();

        PersonList.Add(Person1);

        PersonList.Add(Person2);

        PersonList.Add(Person3);

        PersonList.Add(Person4);

        return PersonList;

        }

Yukarıda yazılan interfacemizi kullanacak bir tane PersonService oluşturuyoruz.

public class PersonService:IPersonService

    {

        #region IPersonService Members

        PersonPool plist = new PersonPool();

        public List<EntityClasses.PersonEntity> GetAllPerson()

        {

            return plist.Persons();

        }

        public List<EntityClasses.PersonEntity> GetPersonByAge(int Age)

        {

            return plist.Persons().Where(c => c.Age == Age).ToList<PersonEntity>();

        }

        public List<EntityClasses.PersonEntity> GetPersonByID(int ID)

        {

            return plist.Persons().Where(c => c.PersonID == ID).ToList<PersonEntity>();

        }

        #endregion

    }

3-)Hangi verilerimizi ve hangi metotlarla verceğimizi belirttik artık servisimizi host etmek için bir tane projemize Console uygulaması ekliyoruz.

Servisimizin host ayarlarını app confige yazıyoruz servisi ilk etapta ayağa kaldırmak için aşağıdaki config dosyasında yazanlar yeterlidir.Ama güvenlik,session yönetimi,debug trace gibi işlemler için config dosyasını daha farklı tagların eklenmesi gerekiyor.

<?xml version=”1.0″ encoding=”utf-8″ ?>

<configuration>

  <!–WCF konfigurasyonları için gereken ayarlar bu tag ile başlar–>

  <system.serviceModel>

    <!–End point ayarları bu taga yazılır–>

    <behaviors>

      <!– Servisimiz davranışlarını belirtiyoruz.Yani debug açık olacak mı,metadata desteği verecek mi vs..–>

      <serviceBehaviors>

        <behavior name=”SimpleServiceBehavior”>

          <!–Http protokolü üzerinden GET yönetimi kullanılarak meta verinin sorgulanıp sorgulanamayacağını belirlemektedir. Bu davranışı eklemeniz ardından hizmetinize bağlanmak üzere vekil sınıflar üretmek isteyen bir yazılımcı hizmet adresinizin sonuna ?WSDL ekleyerek hizmet şemanıza erişebilir –>

          <serviceMetadata httpGetEnabled=”True”  />

        </behavior>

      </serviceBehaviors>

    </behaviors>

    <services>

      <!–Service name hangi servis contractının adını alacak ise onun tam adını vermemiz gerekiyor(NameSpace.ClassName–>

      <!–Behaviour Configurationa isim verip behaviour tagında eklediğimiz özellikleri alır bunu vermezsek veya boş verirsek default ayarlar geçerli olur–>

      <service name=”BusinessService.PersonService” behaviorConfiguration=”SimpleServiceBehavior”>

        <!–Servisin ana çağıralacağı yeri belirtir eğer end pointlere address verilmezse base address geçerli olur–>

        <!–Endpointlere address verilirse baseaddressin sonuna ekleyerek servisi çağırır–>

        <!–Host tagı açılmadan endpointe tam address verilerek kullanım yapılabilir ancak özellikle birden fazla endpoint kullanılacaksa bu tanımla daha uygundur–>

        <host>

          <baseAddresses>

            <add baseAddress=”http://localhost:8000/BusinessService/PersonService”/><!–BasicHttpBinding veya WsHttpBinding için,Örnek internete açık web servisler–>

            <add baseAddress=”net.tcp://localhost:8080/BusinessService/PersonService”/><!–NetTcpBinding için,Uygun address kullanımı LAN ve VPN Sistemleri için–>

          </baseAddresses>      

        </host>

        <!–Endpoint address verilmezse baseaddresi alır–>

        <!–Endpointimizin binding tipini seçiyoruz.Seçtiğimiz binding tipine göre hız,güvenlik ve data encoding mantığı değişiklik gösterecektir–>

        <!–contract kısmına ise bizim servis contractımızın tanımının yapıldığı interface veriyoruz–>

        <endpoint address=”partner” binding=”wsHttpBinding” contract=”BusinessService.IPersonService”></endpoint>

        <!–birden fazla endpoint ve base address olabilir–>

        <endpoint address=”localnetwork” binding=”netTcpBinding” bindingConfiguration=”" contract=”BusinessService.IPersonService” ></endpoint>

        <endpoint address=”sonkullanici” binding=”basicHttpBinding” contract=”BusinessService.IPersonService”></endpoint>

        <!–<endpoint address=”mex” binding=”mexHttpBinding” contract=”IMetadataExchange” />–>

      </service>

    </services>

  </system.serviceModel>

</configuration>

Console Uygulamamız program cs sine aşağıdaki gibi hosttumuzu oluşturuyoruz.Console uygulamamıza BusinessClass library sini ve ServiceModel dll ni referanslardan ekliyoruz.

Bu şekilde tanım yapmamız yeterli geri kalan ayarları appconfigden otomatik olarak okuyor

using(ServiceHost hosts=new ServiceHost(typeof(PersonService)))

     {

       Console.WriteLine(“Service açılıyor…”);

       hosts.Open();

       Console.WriteLine(“Service açıldı…”);

       Console.ReadLine();

      }

Bunuda çalıştırdıktan sonra 

http://localhost:8000/BusinessService/PersonService?wsdl yazarak wsdl görebiliriz

4-)Yazdığımız Servisin metotlarını kullanmak için yeni proje açarak bir tane Console uygulaması ekliyoruz.İsminede ClientConsoleUI diyelim.Projemize Servisimizi servis referanslardan ekleyelim(Tabi daha bir yere publish edilmediği için servisi debug modda çalıştırmayı unutmayın)Programın main cs içine aşağıdaki gibi kodları yazalım ancak Client içinde gerekli app.config ayarlarımızı yapmamız lazım

            //using blogunda yazılanlar using bitince dispose oluyor.Aksi dışında kalanlar program bitince

            //Clientın içini boş verirsek tek end point olmalı ,birden fazla varsa binding ismini vermemiz lazım.Bizim servisimizde birden fazla protokol olduğu için basichttpbinding name verdim

            using (PersonServiceClient.PersonServiceClient proxy = new PersonServiceClient.PersonServiceClient(“BasicHttpBinding_IPersonService”))

            {

                List<PersonServiceClient.PersonEntity> PersonalList = proxy.GetPersonByAge(24).ToList <PersonServiceClient.PersonEntity>();

                foreach (PersonServiceClient.PersonEntity entity in PersonalList)

                {

                    Console.WriteLine(entity.Name + ” ” + entity.Age);

                 }

            }

            Console.ReadLine();

Resimde de görüldüğü gibi serviste OperationContract olarak tanımlamadığımız metotlar clienta gelmiyor

Not:Servis referans verdiğimizde client app configi otomatik oluşturyor.Aşağıda sarılı ile çizili olan nokta önemli kendi bilgisayarınızda kullanırken kodda buraları değiştirmeyi unutmayın

Not:Windows 7 makinalarda servisin start olması sorun olabiliyor onun için projeyi admin modda açmanızda fayda vardır.

<client>

            <endpoint address=”http://localhost:8000/BusinessService/PersonService/partner”

                binding=”wsHttpBinding” bindingConfiguration=”WSHttpBinding_IPersonService”

                contract=”PersonServiceClient.IPersonService” name=”WSHttpBinding_IPersonService”>

                <identity>

                    <userPrincipalName value=”LENOVO-PC\LENOVO” />

                </identity>

            </endpoint>

            <endpoint address=”net.tcp://localhost:8080/BusinessService/PersonService/localnetwork”

                binding=”netTcpBinding” bindingConfiguration=”NetTcpBinding_IPersonService”

                contract=”PersonServiceClient.IPersonService” name=”NetTcpBinding_IPersonService”>

                <identity>

                    <userPrincipalName value=”LENOVO-PC\LENOVO” />

                </identity>

            </endpoint>

            <endpoint address=”http://localhost:8000/BusinessService/PersonService/sonkullanici”

                binding=”basicHttpBinding” bindingConfiguration=”BasicHttpBinding_IPersonService”

                contract=”PersonServiceClient.IPersonService” name=”BasicHttpBinding_IPersonService” />

.NET kategorisine gönderildi | Yorum bırakın

ASP.NET MEMBERSHIP PROVIDER – 2

IIS üzerinde çalışan yeni bir web uygulamasını yarattıktan sonra Visual Studio 2008  içerisinde yer alan WebSite>ASP.Net Configuration menüsünü tıklandıktan sonra  karşımıza sadece mevcut uygulamamız için gerekli konfigurasyon ayarlarını yapabileceğimiz web tabanlı bir uygulamayı çıkarıyor.(Web Site Administration Tool)

ASP.Net Web Site Administration Tool sayesinde uygulama  ile ilgili;

Güvenlik( Security): Yeni kullanıcıların tanımlanması, yeni rollerin ve erişim kurallarının yaratılması işlemlerini
Uygulama Konfigurasyonu(Appication Configuration) : Uygulamanızın SMTP ayarları, web.config dosyası gibi konfigurasyon gerektiren işlemleri

Provider Configuration : Uygulamanızın kullanacağı membership bileşeni işlemlerini
düzenleyebilir ve yönetetebilirsiniz.

Security Tıkladığımız zaman ise  karşımıza Yeni Kullanıcı oluşturmak/Düzenlemek,Yeni Rol Oluşturmak/Düzenlemek,Yeni Kural Oluşturmak/Düzenlemek veya security işlemlerini adım adım yapabileceğimiz wizard gibi seçenekler ortaya çıkmaktadır.(Şekil Security A da görülmektedir).

Security-A

 Şekil Security-A da select authentication type tıkladığımız zaman ise uygulayacağımız güvenliğin Intranet mi yoksa Internet mi cinsinden olacağıdır. Bu projede  Internet’i seçilmiştir.

Internet Seçilerek Sistemin Form bazlı  yani Rol Tabanlı olarak çalışması sağlanır.

Şekil Security-A da Create or Manage Rol se tıklanarak sistemde var olan roller görünebilir ve sisteme yeni roller eklenebilir.Bu roller ile hangi kullanıcı tipinin hangi sayfalara erişebileceği,eriştiği sayfada yapabileceği işlem yetkileri belirlenebilir

  • Şekil Security-A da Create or Manage  Access rol ile ,sistemde olacak kurallar belirtilir.Aşağıda da Şekil Security-D de görüldüğü üzere projede YADMIN klasörüne(Dolası ile içindeki sayfalara ) erişim izni sadece Admin rolünde olacak kişiye verilmektedir.Admin dışında başka bir kişi bu sayfalara girmeye kalkarsa yetkilendirmesi olmadığı uyarısını alacaktır.

Şekil Security-D

  • Şekil Security A da Manage User basıldığı anda Sistemde var olan kullanıcıların rolleri ,bilgileri düzenlenebilir.Ya da Create New User denilerek sisteme yeni bir kullanıcı eklenebilir.
.NET kategorisine gönderildi | Yorum bırakın

ASP.NET MEMBERSHIP PROVIDER-1

Öncelikle ASP.NET Membership ayarlarını ve Asp.NET Login Kontrollerini projede kullanabilmek için SQL-Server ile konfigürasyonu gerekmektedir.

ASP.NET 3.5’un  servisleri Membership, Role Management, Profile, Web Parts ve Web Events bir veritabanına ihtiyaç duyarlar. Bunu için .Net Frameork 2.0 SDK ile gelen aspnet_regsql.exe yi kullanarak SQL Server te bir veritabanı oluşturmak mümkündür. SQL Server 7.0, 2000 ve 2005 sürümlerini destekler.

Bunun için öncelikle C:\WINDOWS\Microsoft.NET\Frameworkv2.0.50727\ aspnet_regsql.exe adresinden EXE nin çalıştırılması ile beraber bir Wizard ekranı gelecektir.

Wizard tamamlandığında veritabanımızın destekleyeceği servisleri belirtiyor. İkinci paragrafta görüldüğü gibi özelliklerin kişiselleştirilebilmesi için aspnet_regsl.exe nin parametreli kullanımasını öneriyor

Member-B

Yukarıdaki Şekil Member-B de de görüldüğü gibi bütün servisleri destekleyen kurulumu yapabilmek yada hepsini kaldırabileceği iki seçenek mevcuttur.Bütün kurulumu yapmak seçildikten sonra Server ve Database seçim ekranı gözükmektedir.Bu örnekte Windows authentication seçeneği üstünden işlem yapılmıştır.

Şekil Member-C

Member-D

  • Şekil Member-D de bu ana kadar yaptılanların özeti görülmektedir.Nexte basıldığı anda asp.net membership tabloları istenilen veritabanına eklenir veya default database seçili ise aspnetdb olarak 0 dan bir veritabanı oluşturulur.

Member-F

Member-G

  • Şekil Member-F ve Member-G de görüldüğü gibi dbo.aspnet ile başlayan Asp.net ait tablolar ve stored-procedureler bu bitirme tezi için oluşturulan BanaBit veritabanının içine entegre olmuştur.Ve artık bu sayede asp.net hazır membership toollarını projede kullanılabilecek hale getirilmiştir  
.NET kategorisine gönderildi | 1 yorum

UNIT TEST GİRİŞ

1-)Projemize bir test project ekliyoruz.

2-)Test Metod Attribute altına metodumuzu yazıyoruz.Aşağıdaki örnekte mesela bir listemiz olacak ve bunun ilk elemanının 0 olmasını isteyen bir metod yazıyoruz
Assert.AreEqual(1 parametre beklenen değer,ikinci olması gereken,3 mesaj)

[TestMethod]
public void TestMethod1()
{

GenericList liste=new GenericList();
Assert.AreEqual(liste.IlkEleman, 0, “Liste ilk yaratıldığında listenin eleman sayısı sıfır olmalıdır.”);

}

public class GenericList
{
private int _ilkeleman = 0;

public int IlkEleman
{
get { return _ilkeleman; }
// set { _count = value; }
}

}

Yukarıdaki kodda ilk elemana 0 verip ekran çalıştırırsak metodun success olduğunu görürüz

Ancak ilk elemanı değeri 1 yapıp çalıştırsaydım aşağıdaki şekildeki gibi hata mesajı alacak idik.

.NET kategorisine gönderildi | Yorum bırakın