Web Service Nasıl Yazılır ?

Web Service günümüz teknolojilerinin olmazsa olmazları arasında yer almaktadır. Bunun en büyük nedeni M2M iletişimin önünü açmak ve back-end sistemde var olan çeşitli database yada enterprise yapıların diğer platformlarla iletişimini güvenli bir şekilde sağlamaktır.  

.Net tarafında çeşitli Web Service yazma yolları vardır bunlardan bir tanesi asmx dediğimiz [WebMethod]’ lar kullanılarak yazılan servislerdir. Aşağıda ki örnekte Database’den veri çekilerek nasıl bir asmx servis yazılıp çekilen veri internet ortamında yayınlanır ona değiniyor olacağız.

1.Adım | Projenin Oluşturulması

  • Öncelikle aşağıdaki resimde de olduğu gibi ismi "WebService" olan bir adet Asp.Net Empty Web Application oluşturuyoruz

2.Adım | Projeye Web Service Sayfası Eklenmesi

  • Projeyi oluşturduğumuzda içerisinde default olarak Properties, References ve Web.config sayfalar geliyor. WebMethod yazabilmek için Proje ismine sağ tıklayıp aşağıda ki resimde de olduğu gibi bir adet ismi "WebMethods" olan WebService sayfası ekliyoruz.

  3.Adım | WebMethod 'un Anlaşılması

  • Service sayfasını ekledikten sonra kodlarını açtığımızda içerisinde default olarak gelen bir adet HelloWorld() metodu bulunmaktadır
[WebMethod] // [WebMethod] tag'i altında yazılı olan Metodun bir "Web Method" olduğunu belirten yapıdır. Aslında kabacası bizim internette yayınlayacağımız ve Client tarafında kullanılacak metod olduğunu belirtiyor.
publicstring HelloWorld()  //Herbir .asmx service sayfasında Default olarak gelen parametre almadan geriye string dönen HelloWorld() bulunmaktadır.Browser'da servici çalıştırdığınızda aşağıda resimde olduğu gibi metodları görüyor olacaksınız
DipNot - [WebMethod] tanımlaması yapılan metodlar Browser'da görünmeyecektir, Sadece [WebMethod] etiketine sahip metodlar burda görünür ve Client tarafından direkt olarak kullanılır
{
return"Hello World";
}

4.Adım | Web Service Nasıl Bir İşlem Yapıyor Olacak ?

  • Geliştireceğimiz Web Service local'de bulunan Northwind Database'ine bağlanarak Employees tablosunda bulunan Çalışanların Ad(FirstName), Soyad(LastName) ve İş Tanımı(Title) bilgilerini yayınlıyor olacak.Bunun için öncelikle pc'nizde Northwind database'i bulunuyor olması gerekli. Olmayan arkadaşlar bu Link' teki script'i indirip MS-SQL Management Studio kullanarak kurulum yapabilirler.

5.Adım | Database'den Employees Bilgilerini Çeken Metodun Yazılması

  • Database ile bağlantı kurmanın çeşitli yolları vardır.İster Entity Framework kullanırsınız istersenizde klasik Ado.Net yazarsınız.Ben Ado.Net'in Entity Framework ve yandaşlarına kıyasla 7 kat gibi bir hız farkıyla çalışmasında dolayı Ado.Net kullanıyor olacağım Smile. İlk olarak "Employees" tablosundan "FirstName" ,"LastName" ve "Title" bilgilerini almamız için bu attributelere sahip "Employees" class'ını aşağıdaki gibi oluşturuyoruz
public class Employees
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Title { get; set; }
 }
  • Şimdi ise Ado.Net kullanarak çekeceğimiz bu Employees'leri List<Employees> array'i oluşturup içerisine atıp sonrasında Web Service' imiz ile yayınlıyor olacağız. Geriye List<Employees> dönen CallEmployees() adında bir metod tanımlayalım ve kodlarımızı aşağıda olduğu içerisine yazalım.
[WebMethod]
public List<Employees> CallEmployees()
{
//Employees'leri içerisine doldurup return ettireceğimiz List<> array
List<Employees> AllEmployees = new List<Employees>();
 
//Local'de bulunan Northwind database'ine bağlanmamızı sağlayan connectionstring'i
SqlConnection conn = new SqlConnection("server=.;database=Northwind;trusted_connection=True");
 
//Hangi bilgileri çekeceğimizi belirttiğimiz sql sorgumuz
SqlCommand cmd = new SqlCommand("select FirstName,LastName,Title from Employees", conn);
conn.Open(); //Sql bağlantısını açıyoruz
SqlDataReader dr = cmd.ExecuteReader();  //DataReader kullanarak verileri alıyoruz
while (dr.Read())
{
//Çektiğimiz verileri Employee nesnesi'nin attribütlerine atayıp sonrasında AllEmployees array'inin içerisine atıyoruz
AllEmployees.Add(new Employees()
{
FirstName = dr.GetString(0),
LastName = dr.GetString(1),
Title = dr.GetString(2)
});
}
//Son olarakda doldurduğumuz array'i return ediyoruz
return AllEmployees;
}
  • Projeyi Run ettiğimizde Browser'da aşağıda olduğu gibi HelloWorld() metoduyla birlikte bizim sonradan tanımladığımız CallEmployees() metodunu görüyor olacağız. 1. resimde bulunan metodumuza tıkladığımızda 2. resimde gördüğümüz sayfa açılıyor olacak ve Çağır butonuna tıkladığımızda son resimde gördüğümüz gibi Database'den gelen veriler XML formatında görüntüleniyor olacak.

 -

 6.Adım | Web Service'in Internet'te Yayınlanması

  • Geliştirmiş olduğunuz bu gibi Web Servic'i yayınlamak için Solution'dan proje üzerine sağ tıklayıp Publish deyip sonrasında generate edilmiş dosyaları web sitenizin bulunduğu ftp' ye atmanız yeterli olacaktır.
  • Yazılmış olan bu web service'i diğer projelerde kullanmak için ise service'in bulunduğu sayfayı projelerinize Reference olarak ekleyip sonrasında içerisinde bulunan metodları kullanabilirsiniz.Biz projede sadece select işlemi yapan bir WebMethod yazdık ama ihtiyaca göre çok daha farklı inserti, update, delete gibi işlemler yapan WebMethod'larda yazılabilir.

 7.Adım | Web Service' de Güvenlik

  • Makalenin başında da bahsettiğimiz gibi Web Service'ler şirketler için büyük önem taşırlar nedeni ise veri'nin sadece istenilen kişiler tarafından kullanılması. Biz yukarıda geliştirmiş olduğumuz projede güvenlik olarak hiç birşey yapmadık yani siz bu projeyi internette publish ettikten sonra çeşitli yazılımlar kullanılarak data-sniffing ile servis'in bulunduğu URL bulunup yazmış olduğunuz metodlar diğer kişiler tarafındanda kullanılabilir.İşte bu gibi durumlarda güvenlik çok büyük öneme sahip oluyor.Konu uzun olduğu için Web Service'de Güvenlik Nasıl Sağlanır ? bir sonraki makalemizde görüyor olacağız. Umarım buraya kadar yazdıklarımız yararlı olmuştur, herhangi bir sorunuz olduğunda e-mail ile ulaşabilirsiniz,

 

Projeyi burdan indirebilirsiniz..

Windows Phone Facebook'a Paylaşım Yapma

1.Adım | Visual Studio Projesi Oluşturulması

  • İlk olarak ismi TestApp olan bir adet Windows Phone Projesi oluşturuyoruz

 2.Adım | Design Sayfasının Hazırlanması

  • Uygulama ekranında bir adet TextBox, bir adette Button ve bir adette WebBrowser Kontrolleri olacak, gerekli kontroller eklediğinde en dışta bulunan Grid Design Kodları aşağıda olduğu şekildedir;

    

<Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock Text="Caner Tosuner" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0"/>
            <TextBlock Text="Facebook" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Grid.RowDefinitions>
                <RowDefinition Height="auto"/>
                <RowDefinition Height="auto"/>
            </Grid.RowDefinitions>
            <TextBox Grid.Row="0" Height="150" Name="Message"/>
            <Button Grid.Row="1" Content="Post" Click="Button_Click"/>
        </Grid>
        <phone:WebBrowser Name="Browser" Grid.Row="1" Background="Aqua" Width="450" Height="600" Visibility="Collapsed" Navigated="Browser_Navigated"/>
    </Grid>

 

  • Bu işlemler sonucunda UI aşağıdaki gibi görünecektir.

3.Adım | Facebook AppID Oluşturma

  • Uygulamada Facebook'un geliştirmiş olduğu SDK'yı kullanacağımızdan Facebook bilgilerini kullanacak uygulamayı sistemine kaydetmeyi ve belirli izinler doğrultusunda SDK'yı kullanma izni vermektedir. Bunun için https://developers.facebook.com/apps adresine giderek aşağıda olduğu gibi uygulama oluşturup sonrasında Facebook'un bize vereceği AppID'yi alıp kullanacağız.

     

4.Adım | Facebook SDK'nın Projeye Eklenmesi

  • Facebook'un geliştirmiş olduğu kütüphaneyi uygulamamıza eklemek için Nuget'ı kullanıcaz.Bunun için Visual Studio'dan Tools -> Library Package Manager -> Package Manager Console tıklayıp altta açılan sayfaya  PM> Install-Package Facebook yazıyoruz ve kütüphanenin kurulmasını bekliyoruz. Kurulum tamamlandıktan projemizin References bölümüne aşağıda olduğu gibi Facebook'un eklendiğini görüyor olacaksınız.

5.Adım | FacebookClient Oluşturulup AppID Değerinin Kullanılması

  • FacebookClient nesnesi bizim Facebook API'ları ile connection'ı kurup bütün veri alış verişini sağlayacak olan yapıdır. Facebook'ta yeni uygulama oluştururken bize verilen AppID/App Key kodunu aşağıda AppID değişkenine atıyoruz ve Facebook böylece hangi uygulamanın API'larını kullandığı gibi bilgilere ulaşmış oluyor.
private const string AppID = "Facebok App ID";
private FacebookClient client;
// Constructor
public MainPage()
{
InitializeComponent();
client = new FacebookClient();
 }

6.Adım | Post Buton'u Click Event'i

  • Uygulamadaki senaryo şu şekilde işliyor olacak; TextBlock'a girilen string Post butonuna tıklandığı anda SDK'yı kullanarak Facebook'a bağlanıp kullanıcı adı ve şifre bilgileri doğru girildiğinde bize authentication verecek ve sonrasında paylaşım yapmamızı sağlayacak. Aşağıda Post butonuna tıklandığında çalışacak olan kodlar bulunmaktadır.
private void Button_Click(object sender, RoutedEventArgs e)
{
//API' ile birlikte gönderilecek olan parametreler
var parameters = newDictionary<string, object>();
parameters["client_id"] = AppID;
parameters["redirect_uri"] = "https://www.facebook.com/connect/login_success.html";
parameters["response_type"] = "token";
parameters["display"] = "touch";
 
parameters["scope"] = "publish_stream";
Browser.Visibility = System.Windows.Visibility.Visible;
Browser.Navigate(client.GetLoginUrl(parameters));
}

Bütün bu işlemleri hatasız bir şekilde yapıp uygulamamızı çalıştırdığımızda aşağıdaki gibi bir görüntü alıyor olacağız.

7.Adım | Browser Navigation Event'i

  • Kullanıcı UserName ve Password bilgilerini girip giriş yaptıktan sonra Browser, bizim access token'ımızın yani doğru bir şekilde giriş yaptığımıza dair gerekii bilgiyi API'ları çağırmak için bir URL'e navigate edilecek. Browser'ın Navigated Event'i aşağıdaki gibi olacak.
private void Browser_Navigated(object sender, NavigationEventArgs e)
{
FacebookOAuthResult oauthResult;
//URL'in erişim izni olduğunu kontrol ediyoruz
if (!client.TryParseOAuthCallbackUrl(e.Uri, out oauthResult))
{
return;
}
//Checking that the user successfully accepted our app, otherwise just show the error
if (oauthResult.IsSuccess)
{
client.AccessToken = oauthResult.AccessToken;
 
Browser.Visibility = System.Windows.Visibility.Collapsed;
DuvaraGonder();
}
else
{
MessageBox.Show(oauthResult.ErrorDescription);
Browser.Visibility = System.Windows.Visibility.Collapsed;
}
}

8.Adım | DuvaraGonder() Metodu

  • Bütün bu işlemleri yaptıktan sonra artık başarılı bir şekilde Facebook'a giriş yaptık ve gerekli izinleri aldık bundan sonra yapmamız gereken şey TextBox'dan girilen değeri DuvaraGonder() metodunu kullanarak Timeline Duvarımıza göndermek.
private void DuvaraGonder()
{
var parameters = new Dictionary<string, object>();
parameters["message"] = Message.Text;
client.PostAsync("me/feed", parameters);
}

9.Adım | PostCompleted() Metodu

  • Kullanıcı Post butonuna tıkladıktan sonra göndermiş olduğumuz mesajın başarılı bir şekilde gidip gitmediğini öğrenmek için PostCompleted() metodundan yararlanabiliriz. Gerekli kodları constructor'ın içerisinde EventHandler'ın içerisine ekliyor olacağız.
// Constructor
public MainPage()
{
InitializeComponent();
client = new FacebookClient();
client.PostCompleted += (o, args) =>
{
//Hata Kontrolünün yapıldığı bölüm
if (args.Error != null)
{
Dispatcher.BeginInvoke(() => MessageBox.Show(args.Error.Message));
}
else
{
Dispatcher.BeginInvoke(() => MessageBox.Show("Mesaj başarılı bir şekilde gönderildi"));
}
};
}

10.Adım | Proje Test İşlemi

  • Buraya kadar yazmış olduğumuz kodlar sayesinde artık Facebook'a giriş yapıp TextBlock içerisine yazılan metni Post butonuna tıklandığında Facebook sayfamıza gönderiyor olacağız. Bir üstte yazdığımız 9.Adım'da göndermiş olduğumuz metnin Gidip Gitmediği hakkında bilgide alabiliyoruz. Uygulamayı çalıştırdığımızda ekran görüntüsü aşağıdaki gibi olacaktır.

                                               

11.Adım | Access Token'ın IsolatedStorage ile Kaydedilmesi

  • Kullanıcının uygulamayı kullanıp her Facebook Share işleminde UserName ve Password bilgilerini girmesi hiç istenen birşey değildir. Bizde bunun için Access Token bilgisini IsolatedStorage ile uygulama içerisine kaydedecez.Bunun için SaveAccessToken() adında bir metod yazıcaz.
private void SaveAccessToken(String token)
{
if (!IsolatedStorageSettings.ApplicationSettings.Contains("token"))
IsolatedStorageSettings.ApplicationSettings.Add("token", token);
else
IsolatedStorageSettings.ApplicationSettings["token"] = token;
IsolatedStorageSettings.ApplicationSettings.Save();
}

12.Adım | Access Token'ın IsolatedStorage'dan Okunması

  • Uygulama içerisine kaydettiğimiz Access Token bilgisini kullanıcı paylaşım yapmak istediğinde tekrardan IsolatedStorage'dan okuyor olmamız gerekiyor.Aşağıda bu işlemi yapan GetAccessToken() metodumuzun kodları bulunmaktadır.
private string GetAccessToken()
{
if (!IsolatedStorageSettings.ApplicationSettings.Contains("token"))
return null;
else
return IsolatedStorageSettings.ApplicationSettings["token"] as string;
 }

13.Adım | Uygulama Açıldığında Access Token'ın Kontrol Edilmesi

  • Gerekli metodları yazdıktan sonra uygulama açılış anında ya da her nerde gereki ise AccessToken var mı ? yok mu ? kontrol etmemiz gerekmektedir.Bunuda aşağıda olduğu gibi yapıyoruz.
//AccessToken var mı yok mu kontrolü
if (GetAccessToken() != null)
client.AccessToken = GetAccessToken();

  14.Adım | Expire Olan Token'ın Kontrol Edilmesi

  • PostCompleted handler'ı içerisinde bu kontrolü yapmamız gerekiyor ve kodlar aşağıda olduğu gibi Contructor'ın içerisinde yazıyoruz.
client.PostCompleted += (o, args) =>
{
//Hata Kontrolünün yapıldığı bölüm
if (args.Error != null)
{
//Yetki Hatası
if (args.Error is FacebookOAuthException)
{
Dispatcher.BeginInvoke(() => MessageBox.Show("Yetki Hatası"));
//Hata oluştuğundan dolayı Saved Token'ı uçuruyoruz
SaveAccessToken(null);
client.AccessToken = null;
}
else
Dispatcher.BeginInvoke(() => MessageBox.Show(args.Error.Message));
}
else
   Dispatcher.BeginInvoke(() => MessageBox.Show("Mesaj başarılı bir şekilde gönderildi"));

};

15.Adım | Back Buton'nuna Tıklanılması

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
//Browser görünüyor ise gizle ve navigation event'i iptal et
if (Browser.Visibility == System.Windows.Visibility.Visible)
{
Browser.Visibility = System.Windows.Visibility.Collapsed;
e.Cancel = true;
}
base.OnBackKeyPress(e);
}

16.Adım | Haydi Test Edelim :)

Windows Phone'da Web Service Kullanımı

Mobil tarafta uygulama geliştiriyorsanız Web Service’den kaçışınız imkansızdır. Çünkü database’ler ile mobil uygulama arasındaki iletişimi sağlayacak hizmet Web Service tir ve mobil uygulama aktarılacak olan veri XML yada JSON tipinde yayınlamaktadır. Bu makalede IMKB’den aldığı sonuclarla anlık Döviz Verilerini paylaşan bir XML Web Service’den gelen verileri alıp Parse işlemi yapıp daha sonrasında WP uygulamamızda gösteriyor olacağız.

 

Öncelikle ilk olarak Visual Studio’yu açıp 1 adet adı XML_Parse olan Windows Phone Pivot App Projesi oluşturalım.

 

Design sayfasında Default olarak gelen xaml kodlarını tamamiyle temizleyelim. Bunun için En dıştaki Grid içerisinde bulunan kodları silmek işimizi görecektir. Grid içerisindeki kodları sildiğimizde son hali aşağıda olduğu gibidir.

    

<!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
                  //Bu bölümdeki kodları temizledik
    </Grid>

 

 Bir sonraki işlem olarak Design sayfasını istediğimiz şekilde düzenleyelim. Görünüm olarak daha güzel görüneceğini düşündüğümden WrapPanel kullanmayı tercih ettim.WrapPanel sayesinde uygulama ekranına dinamik olarak yerleşecek Buton’lar Panorama Page gibi geliştirilmiş uygulama havası katacaktır. WrapPanel kullanmak için ilk olarak bir dll’i projenize referans vermeniz gerekiyor. http://silverlight.codeplex.com/downloads/get/270984 sitesinden Silverlight Toolkit kurup daha sonrasında aşağıda olduğu gibi Solution Explorer’da projeniz içerisinde bulunan References’a sağ tıklayıp Add Reference diyip aşağıda dosya yolunda bulunan dll’i projenize referans olarak ekliyorsunuz.

For 32-bit systems:

C:\Program Files\Microsoft SDKs\Windows Phone\v7.1\Toolkit\Aug11\Bin\Microsoft.Phone.Controls.Toolkit.dll

For 64-bit systems:

C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v7.1\Toolkit\Aug11\Bin\Microsoft.Phone.Controls.Toolkit.dll

Referansı ekledikten sonra uygulamamızın design sayfasına da aşağıda bulunan kod’u yazıyoruz.

 

xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

Şimdi xaml kodlarını yazmaya başlayabiliriz. Design tarafında kullanacağımız kontrollerin kodları aşağıdaki gibi olacaktır.

       

<Grid.Background>
        <!--Pivot Control-->
        <controls:Pivot x:Name="dovizpivot">
            <!--Pivot item one-->
            <controls:PivotItem Header="Döviz Verileri">
                <ListBox x:Name="lbdovizler" ScrollViewer.VerticalScrollBarVisibility="Disabled" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <toolkit:WrapPanel></toolkit:WrapPanel>
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <Button x:Name="btndoviz" Content="{Binding ADI}" FontSize="32" Background="#0076dd" FontWeight="Bold" Foreground="White" Height="120" Width="150">
                                </Button>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </controls:PivotItem>

 

Senaryo şu şekilde işliyor, Xml olarak gelen verileri Parse edip bir array’in içerisine atacaz ve o array’ide üstte yazdığımız lbdovizler lsitbox’ına ItemsSource olarak verecez. Sonrasında listbox’ın ItemTemplate’inde bulunan Buton’un Content’ine Bind olarak oluşturacağımız object’in ADI attribute’ünü verdiğimizden o Döviz’in ismi ekranda görünecektir.

 Şimdi ise CodeBehind’a geçelim..

Gelen Veriyi Dovizler adında class oluşturarak ona atayacağız, class aşağıdaki şekilde olacaktır.

   

//Service’in sunduğu Xml formatı aşağıdaki gibi.Bize DOVIZ türünde ADI,ALIS,SATIS attributleri olan altinkaynak adında array dönüyor

 public class Dovizler
    {
        public string ADI { get; set; }
        public string ALIS { get; set; }
        public string SATIS { get; set; }
    }

//Dovizleri saklayacağımız List array’i tanımladık.

        List<Dovizler> Dovizler = newList<Dovizler>();
        public MainPage()
        {
            InitializeComponent();
            GetResult();  //GetResult Metodunu çağırıyoruz
        }
//GetResult Metodu bize Web Service’in bulundu adrese giderek orda XML olarak yayınlanmış verileri getirecektir.
        publicvoid GetResult()
        {
            WebClient wc = newWebClient();
            wc.DownloadStringCompleted += wc_DownloadStringCompleted;
            wc.DownloadStringAsync(newUri("http://xml.altinkaynak.com.tr/doviz.xml")); //Service URL’i
        }

 

void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)// Eğer hata mesajı döner ise metod’dan çıkıyoruz
                return;
            try
            {
                XElement xel = XElement.Parse(e.Result);  //gelen veriyi xel’e atıyoruz ve sonrasında nesne haline getirerek array’in içerisine insert ediyoruz
                 Dovizler = from dv in xel.Elements("DOVIZ") //Doviz nesnesine gitmesini söyledik
                           selectnewDovizler()
                           {
    //Doviz nesnesinin hangi attributlerini alacağımızı belirtiyoruz
                               ADI = dv.Element("ADI").Value,
                               ALIS = dv.Element("ALIS").Value,
                               SATIS = dv.Element("SATIS").Value
                           };
                // Son olarak Array’i lbdovizler ListBox’ına ItemsSource olarak veriyoruz
                lbdovizler.ItemsSource = Dovizler;
            }
            catch (Exception)
            {
                MessageBox.Show("Lütfen Daha Sonra Tekrar Deneyin.", "Bilgilendirme", MessageBoxButton.OK);
                return;
            }
        }

Uygulamanın ekran görüntüsü aşağıda olduğu gibidir.

Isolated Storage Kullanımı

Windows Phone' uygulama içerisinde veri saklamak için kullanabileceğimiz çeşitli yapılar vardır. Bunlardan birtanesi IsolatedStorage'dır. IsolatedStorage kullanarak uygulamanın kullanıcı tarafından değiştirilmiş ayarlarını, yada uygulamada UserName Password gibi bilgiler gerekli ise bu bilgileri uygulama her açıldığında sürekli kullanıcıya sormak yerine ilk seferde kullanıcıdan bu bilgileri alıp IsolatedStorage içerisine kolayca kaydedebiliriz.

IsolatedStorage Veri Yazma

private void DosyayaYaz(string text)
{
IsolatedStorageFile storage= IsolatedStorageFile .GetUserStoreForApplication();
IsolatedStorageFileStream fs =storage.CreateFile("data.txt");
StreamWritersw =newStreamWriter(fs);
sw.Write(text); //Metoda gelen text değişkeni içerisindeki değer IsolatedStorage ile data.txt dosyası içerisine kaydedilir
sw.Close();
}

 

IsolatedStorage Veri Okuma

private string DosyadanOku()
{
IsolatedStorageFilestorage= IsolatedStorageFile.GetUserStoreForApplication();
if (storage.FileExists("data.txt"))  //daha öncesinde oluşturduğumuz data.txt adlı dosya varmı diyee kontrol ediyoruz
{
IsolatedStorageFileStream fs = storage.OpenFile("data.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read);
StreamReader sr=new StreamReader(fs);
string kayitliVeri = sr.ReadToEnd();
sr.Close();
}
else
{
return String.Empty; //eğer o isimde bir dosya yok ise boş değer döndürüyoruz
}
return kayitliVeri ;
}

IsolatedStorage Veri Silme

private void DosyaSil()
{
IsolatedStorageFile storage= IsolatedStorageFile.GetUserStoreForApplication();
if(storage.FileExists("data.txt"))
     storage.DeleteFile("data.txt");
else
   return ;
}

>> catch {Foot in Mouth} 'e düşmemeniz dileğiyle.. Smile <<

 

Log4Net Database Logx

Log4Net .net uygulamaları için geliştirilmiş olan açık kaynak kodlu bir log’ lama kütüphanesi ve Java’da bulunan loglama aracı Log4J'nin .NET uyarlamasıdır.

 

Log Seviyeleri

ALL : Tüm mesajların loglandığı seviyedir.

DEBUG : Developement aşamasına yönelik loglama seviyesidir.

INFO : Uygulama içerisindeki bilgileri loglayabildiğiniz seviyedir.

WARN : Hata olmayan fakat önemli bir durumun oluştuğunu belirtebileceğimiz seviye.

ERROR : Hata durumunu belirten seviye. Sistem hala çalışır haldedir.

FATAL : Uygulamanın sonlanacağını, faaliyet gösteremeyeceğini belirten mesajlar için kullanılacak seviyedir.

OFF : Hiç bir mesajın loglanmadığı seviyedir.

 

Log’lanacak bilgiler file system tarafında ya da database’de kaydedilebilmektedir.

DBLog adında bir database oluşturalım ve Log kayıtlarını tutacağımız Log adında aşağıda olduğu gibi bir tablo yaratalım

CREATE TABLE [dbo].[Log] (
    [Id] [int] IDENTITY (1, 1) NOT NULL,
    [Date] [datetime] NOT NULL,
    [Thread] [varchar] (255) NOT NULL,
    [Level] [varchar] (50) NOT NULL,
    [Logger] [varchar] (255) NOT NULL,
    [Message] [varchar] (4000) NOT NULL,
    [Exception] [varchar] (2000) NULL
)

 

Uygulama içerisinde App.cofig ya da Web.config sayfalarının içerişini aşağıda olduğu gibi yapıp sadece connectionstring’ini değiştirmeniz yeterli olacaktır.

<?xmlversion="1.0"encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net"type="log4net.Config.Log4NetConfigurationSectionHandler,
Log4net"/>
  </configSections>
  <log4net>
    <root>
      <levelvalue="DEBUG" />
      <appender-refref="ADONetAppender" />
    </root>
    <appendername="ADONetAppender"type="log4net.Appender.ADONetAppender">
      <bufferSizevalue="100" />
      <connectionTypevalue="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionStringvalue="server=serveradi; database=databaseadi;trusted_connection=true;" />
      <commandTextvalue="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
      <parameter>
        <parameterNamevalue="@log_date"/>
        <dbTypevalue="DateTime"/>
        <layouttype="log4net.Layout.RawTimeStampLayout"/>
      </parameter>
      <parameter>
        <parameterNamevalue="@thread"/>
        <dbTypevalue="String"/>
        <sizevalue="255"/>
        <layouttype="log4net.Layout.PatternLayout">
          <conversionPatternvalue="%thread"/>
        </layout>
      </parameter>
      <parameter>
        <parameterNamevalue="@log_level"/>
        <dbTypevalue="String"/>
        <sizevalue="50"/>
        <layouttype="log4net.Layout.PatternLayout">
          <conversionPatternvalue="%level"/>
        </layout>
      </parameter>
      <parameter>
        <parameterNamevalue="@logger"/>
        <dbTypevalue="String"/>
        <sizevalue="255"/>
        <layouttype="log4net.Layout.PatternLayout">
          <conversionPatternvalue="%logger"/>
        </layout>
      </parameter>
      <parameter>
        <parameterNamevalue="@message"/>
        <dbTypevalue="String"/>
        <sizevalue="4000"/>
        <layouttype="log4net.Layout.PatternLayout">
          <conversionPatternvalue="%message"/>
        </layout>
      </parameter>
      <parameter>
        <parameterNamevalue="@exception"/>
        <dbTypevalue="String"/>
        <sizevalue="2000"/>
        <layouttype="log4net.Layout.ExceptionLayout"/>
      </parameter>
    </appender>
  </log4net>
</configuration>

CodeBehind tarafında ki kodlar ise şu şekilde olacaktır

private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.
MethodBase.GetCurrentMethod().DeclaringType);
        private void button1_Click(object sender, EventArgs e)
        {
            log4net.Config.XmlConfigurator.Configure();
            log.Debug("log Debug");
            log.Info("log Info");
            log.Warn("log Warn");
            log.Error("log Error");
            log.Fatal("log Fatal");
        }

  

Bu işlemler sonrasında database’de ki tabloya kayıtlar insert olmuş olacaktır.

 

Android'den fazla C# kodu yazılan Google Hackathon'u :)

     ODTÜ Teknokent, Google Türkiye ve Amerika Birleşik Devletleri Büyükelçiliği iş birliği ile 16-17 Mayıs 2013 tarihinde Orta Doğu Teknik Üniversitesi’nde gerçekleşen “Social Entrepreneurship Hackathon” adlı yarışmaya Kadir Has Üniversitesi'ni temsilen 5 arkadaş katıldık.

         Aslında üniversitede ki hocam Selçuk Öğrenci bana ilk "Android hackathon var gitmek ister misin ?" diye sorduğunda ilk başta "tabi hocam hemen giderim, nerede ne zaman ?.. " gibi konuştuktan sonra kendi kendime bi sordum "Caner hayırdır ?.. Markette 16 tane uygulamam ver derken bu android market değil Windows Phone abicim..." falan filan derken bu düşüncemi sonrasında Selçuk hocamla da paylaştım ama o yinede benden katılmamı ve şakayla karışık takımın "Core" denen şeysi olmamı söyledi :)

Bende emir büyük yerden deyip tamam hocam elimden gelen neyse üstüne dahasını katarak arkadaşlara yardım edeceğimi söyledim. Neyse 15 Mayıs günü yola çıktık ve yaklaşık 6-7 saat içerisinde gece 23:15 gibi Ankara'ya vardık. Ankara dışından gelen öğrenciler TEDAS Misafirhanesi'nde konaklayacak diye söylemişlerdi bizde geceyi orada geçirdik.Sabah ODTU Kültür Merkezine geçtik ve orada açılış konuşmasının olacağı salona gittik. Google Türkiye ekibinden, ODTU Teknopark ekibinden, ABD Büyük elçiliğinden ve Teknoloji bakanlığından gelen konuşmacıları dinledikten sonra 2-3 saatlik bir ara verdik ve sonradan 22 saat sürecek olan non-stop coding yani Hackathon başladı. Arkadaşlarla geliştirmeye karar verdiğimiz uygulamanın adı "EBS" Engelli Bildiri Sistemi'ydi. Ne yapacaktı EBS ; aslında içinde biraz Twitter biraz Instagram olan bir uygulama gibi düşünebiliriz.

        Engelli vatandaşlara hizmet verecek olan uygulamanın ana işlevi şu şekilde olacak; diyelim ki engelli bir   vatandaşımız sokakta yolda giderken kendisine engel teşkil eden bir durumla karşılaştığında uygulamasını açıp lokasyon bilgisine göre bulunduğu yerin Belediyesi'ne Fotograf, Açıklama, Yer Bilgilerini göndererek engel hakkında bildiri/şikayet yapabiliyor olacaktı. Sağtarafta bulunan fotoğrafı uzun bir süre önce internette görmüştüm örnek olacağını düşünerek paylaşmak istedim. Bu vatandaşımızı örnek alacak olduğumuzda ;

        Engelli vatandaş bu karşılaştığı engel karşısında uygulamasını açıp sorumlu belediyeye sorunun fotoğrafını çekip, açıklamasını yazıp gönder butonuna basacak ve bu bildiri Belediye nin sahip olduğu Web arayüzüne düşüp görüntülenecek Belediye tarafından görüntülenecek ve sorun giderildiğinde o şikayeti yapan vatandaş mail yoluyla "Sorun giderilmiştir" şeklinde bilgilendirilecek.

    Aslında fikir bence gayet güzeldi çünkü etkinliğin adı Sosyal Girişimcilik olduğundan uygulamanın içeriği hem Sosyal olmalıydı ve toplumsal bir soruna parmak basıyor olması gerekiyordu. 

Yazılımsal olarak neler gerekli diye düşündüğümüzde ;

  1. Öncelikle Server'da tutulan Sağlam bir Database 
  2. Mobil uygulama ile iletişimi sağlayıp bütün ihtiyaçlara cevap verecek iyi bir WebService,
  3. Belediyeler tarafında gelen bildirimleri görüntülemek için kullanılacak fonksiyonel bir Web Sayfası.
  4. Ve tabi son olarak da Android uygulaması :)

        1, 2 ve 3. şıklar benim yapacağım konulardı. İlk olarak MS-SQL kullanarak kullanışlı bir Database geliştirdim ve bu Database'i Azure Cloud servisimde sakladım. Sonrasında WCF kullanarak json formatında yayın yapan bir adet Web Service geliştirdim. En son olarak da ASP.Net kullanarak belediyeler için bir adet Web Sayfası geliştirdim. Şaka gibi ama bütün bunlar 6 saat içerisinde bitmişti Hackathon bu olsa gerek Smile.

Android uygulaması üzerinde çalışan arkadaşlar o sırada geliştirmeye devam ediyorlardı. 22 saatin sonunda maalesef arkadaşlar Android uygulamasını tam istediğimiz haliyle yetiştiremediler Frown Sunumumuzu yaptık ve sıralamaların açıklanmamıştı ve birincide olamamıştık.

Aslında bi ara şey diye düşünmedim değil; "Acaba çok mu fazla Microsoft'u işin içerisine soktum ?.." çünkü baktığımızda üstte saydığım gibi yazılımsal olarak 4 adet görev yada geliştirilecek yapı vardı ve bunlardan 3 tanesinde tamamiyle Microsoft'un izi vardı, MS-SQL Database, WCF WebService ve Asp.Net Web Sayfası :) Etkinlik sonunda arkadaşlarla oturup bi baktığımızda şaka maka Android kodundan fazla C# vardı işin içerisinde Cool 

Ama her şeye rağmen gayet güzel ve eğlenceli bir hackathon oldu, kişisel deneyim olarak bir çok şey kazandım gibi zira önümüzdeki sene Microsoft'un her yıl düzenlediği Imagine Cup yarışmasına katılmayı düşünüyordum ve bu deneyim benim için gerek sunum noktasında, gerek takım olarak çalışabilme konusunda gerekse işin sosyallik kısmında son derece katkıları oldu diye düşünüyorum. Umarım Selçuk hoca bize ilerleyen zamanlarda da bu tür görevler paslar ve bizde okulumuzu (1. olamazsakda) en iyi şekilde temsil etmeye çalışırız Laughing

 

 

Windows 8.1 Tanıtım Videosu Yayınlandı

Windows 8'e gelecek en büyük ve en kapsamlı güncelleme olması beklenen Windows 8.1'in kullanım videosu yayınlandı.

Windows 8 ilk çıktığı günden buyana birçok konuda eleştirilse de yayınlanacak olan 8.1 güncellemesi ile birlikte Microsoft'un birçok değişiklik yaparak eleştirilere cevap vereceği söyleniyordu. 

26 Haziranda düzenlenecek olan Microsoft Build geliştirici konferansında kullanıma sunulacak Windows 8.1 güncellemesinden önce Microsoft dün yayınladığı video ile birlikte Windows 8.1'de ne gibi değişiklikler var duyurmuş oldu.

Kısaca ne gibi deşiklikler var dersek ;

      • Herkesin merakla beklediği "Başlat" butonu geri gelmemiş gibi duruyor,
      • Uygulamaları Kategorize edebilme özelliği,
      • Birden fazla uygulama Tile' larını seçip aynı anda taşıyabilme,
      • Metro arayüzünde hareketli duvar kağıdı özelliği,
      • Metro arayüzünde bulunan her bölümün tema rengini değiştirebilme,
      • Yenilenmiş Skydrive uygulaması
      • Denetim Masası'ndan yapılan bütün işlemleri yeni eklenen Ayarlar bölümünden yapabilme,
      • Lock Screen'de hareketli arka plan resimleri ekleme,
      • Daha büyük Tile oluşturabilme özelliği,
      • Metro arayüzde iken ekranı aşağıdan yukarıya doğru çektiğinizde açılan "All Apps" sayfası,
      • Uygulamaları Kategorize edebilme özelliği,
      • Yeni Search uygulaması ile birlikte aranan her kelimeyle ilgili bulunan sonuçların kullanıcıya kategorilenmiş olarak sunulması,

 

  

IIS Network Load Balancing

IIS Load Balancing Nasıl Yapılır ?

 

IIS üzerinde Load Balancing (NLB) Network Load Balancing Manager Programı ile yapılır , ağ yükünün yük dengeleme ve hata toleransına bağlı olarak birden fazla sunucuya dağılımını yapan servistir.

 Server Üzerinde Network Load Balancing  Aktifleştirme (NLB)

 1.       Open the Server Manager of your Windows Server by opening your Start Menu and clicking Administrative Tools      » Server Manager.

2.       In the navigation tree on the left, click Features.

3.       In the right pane, click Add Features.

4.       From the list of features that appear, select Network Load Balancing and click Next » Install. An installation progress bar appears.

5.       When installation is finished, click Close.

 Cluster yapısı:Network üzerinde tek bir sistem olarak görünen bir grup server.

Node: Cluster içerisindeki sunuculara verilen ad..

NLB cluster max 32 Node’dan oluşur.

 Cluster yapıları Aktif/Aktif ya da Aktif/Pasif çalışabilir.

Aktifdurumdaki sunucu cluster yapısı içerisinde, cluster yapısına gelen isteklere doğrudan cevap veren sunucudur.

Pasifolan sunucu ise cluster yapısı içerisinde Aktif durumdaki makinede donanımsal ya da yazılımsal bir sorun olması durumunda onun yerine geçebilecek şekilde hazırda bekleyen sunucudur. 

Aktif/Aktif Cluster yapısı ağ üzerinde yük dengeleme işlevini yerine getirir. Aktif/Pasif Cluster yapısı ise hata toleransını sağlamaya yöneliktir. Aktif/ Aktif Cluster yapısına Load-Balancing Cluster, Aktif/Pasif Cluster yapısına ise Fault-Toleranced Cluster denilebilir.

 

Network Load Balancingdonanımsal ya da yazılımsal olarak sağlanabilir. Donanımsal Load Balancing cihazları NLB’yi Aktif/Aktif yaparlarken Microsoft Server 2003 işletim sistemi içerisinde NLB Manager ile Load Balance yapılandırılırken Aktif/Aktif  ya da Aktif/Pasif Cluster yapılabilir.

NLB’de kullanıcıların Session bilgileri tutulamıyor, bu yüzden IIS sunucuları yapılandırarak bilgileri tutmak gerekir.

Session tutmadığımız durumda kullanıcının NLB yapısından kaynaklanan bir şekilde bir sunucuya ya da diğer sunucuya gönderilmesi sonucu session bilgileri kaybolacaktır.

Örneğin kullanıcı, sunuculardan birinde, sayfalardan biri için şifre girdiğinde sayfa içerisindeki linklerden birine basarak başka bir sayfaya gitmek istediğinde, NLB yapısı bu istek sonucu kullanıcıyı başka bir sunucuya yönlendirirse web browser kullanıcıya tekrar şifre soracaktır. 

Web Uygulamaları için session bilgileri IIS tarafından asp.net yardımı ile tutulabilir.

Session verilerini tutmanın 3 türlü yöntemi vardır:

1-    In Process Mode(inProc)

inProc moda session bilgileri aspnet_wp.exe dosyasına bağlı olarak her sunucu içinde bireysel olarak tutulur

2-    State Server Mode

State Server Mode’da ise session bilgileri serileştirilerek sunucuların RAM’lerinde bir birinden bağımsız process’ler olarak tutulur

3-    Out of Process – SQL Server Mode(outProc)

SQL Server Mode’da session bilgileri serileştirilmiş yani serializable bir şekilde SQLsunucuda tutulur

Çalışma Şekli..

NLB sürücüsü NIC sürücüsü ile IP protokolü arasına yerleşir ve böylece tüm NLB kümesi üyelerine gelen her paketi alıp inceler. Paket kablodan Cluster’a geldiğinde her node paketi alır ve inceler ve cluster çapında belirtilmiş kurallara göre paketi üst katmanda bulunan IP protokolüne iletir veya paket daha NLB sürücüsündeyken atılır. Böylece trafik node’lar arasında paylaştırılır. Kısaca tüm node’lar Cluster’a gelen trafiği alır ama tüm node’lar cevap vermez.

Sorun Olduğunda..

NLB Cluster üyesi olan bir sunucu hata verdiğinde NLB Cluster grubundaki diğer sunucular, offline duruma düşen sunucunun üzerindeki iş yükünü üstlenirler. Hata veren sunucu tekrar online durumuna geçtiğinde, NLB servisi görev dağıtımını yeniden düzenleyerek online duruma geçen sunucuya yeni görevini atamaktadır

 Network Load Balanacing yönetimi için temel olarak Network Load Balancing Manager snap-in kullanılır. Bununla birlikte network kartı özellikleri penceresinden de NLB ayarları yapılabilir.

Store Procedure if / else Kullanımı

Store Procedure'ler veri tabanı kullanılan projelerin olmazsa olmazıdır.Bunun en önemli nedeni Güvenlik ve Hız dır. Ado.net kullanılanılarak veri insert, update, delete işlemleri yapılan bir uygulamada Store Procedure değilde direkt olarak SqlCommand nesnesine "insert,update,delete" gibi query'ler yazmak pek önerilen bir yol değildir. Nedeni de yine az önce söylediğim gibi öncelikle hız, güvenliktir ve yazdığın kodun ne kadar profesyonelce yazıldığıyla ilişkilidir.

Store Procedure'lerde IF ELSE kullanabildiğiniz vakit emin olun uygulama tarafında yazdığınız C# kodları %30'lara kadar azalacaktır. Örnek olarak verecek olursak; database'de kayıtlı Users adında bir tablom var ve bu tablo Ad, Soyad, Email bilgilerini alarak kullanıcıları kaydediyor olsun. Store Procedure kullanarak bu kullanıcıları database'e kaydeden bir uygulama geliştirecek olduğumuzda, UserInsert ve  UserUpdate işlemlerini yapan 2 adet Store Procedure ihtiyacımız var diyelim. Aslında IF ELSE kullanarak bunu bir Store Procedure ile yapmak hem daha hızlı, hemde C# tarafında bizi çok daha fazla kod yazmaktan kurtarıyor.

Users Tablosu Örneği;

CREATE PROCEDURE InsertUser   //Procedure İsmi

    @Ad varchar(20),   //aldığı atribüt'ler

    @Soyad varchar(20),

    @Email varchar(20)

AS

BEGIN

      DECLARE@HasExist int  //Email adresine göre o kullanıcı daha önce kayıt olmuş mu diye kontol etmemizi sağlayacak olan değişken

      Select @HasExist COUNT(1)

      from Users

      Where Email=@Email   //Bu email adresi kayıtlı mı diye bakıyoruz

IF(@HasExist=0) //Üstteki sorgudan dönen değer @HsExist değişkenine atanıyor ve eğer o kayıt var ise "0" dan farklı bir değer yok ise "0" değerini dönüyor, "0" döndüğünde yeni bir kayıt ekleyeceğimizi anlıyoruz ve aşağıda olduğu gibi Procedure'e parametre olarak gelen değerleri alıp tabloya yeni bir User ekliyoruz

BEGIN

      Insert Into Users   //Insert işlemi

      values

            (@Ad,@Soyad,@Email)

END

ELSE  //Eğer @HasExist "0" a eşit değilse bu demek oluyorki bu kullanıcı database'de kayıtlı bulunmakta, bu seferde Procedure'e parametre olarak gelen değerleri alarak o kullanıcının bilgilerini aşağıda olduğu gibi Update ediyoruz

BEGIN

      Update Users   //Update işlemi

      set

            Ad =@ Ad,  //bilgileri update ediyoruz

            Soyad=@Soyad,

            Email=@Email

      WHERE Email=@Email  //where koşulu O kullanıcıyı bulmamızı sağlıyor

END

END

 

 

"Xap packaging failed. Object reference not set to an instance of an object" Hatası

Windows Phone uygulamalarında "Xap packaging failed. Object reference not set to an instance of an object." hatası aldığınızda sorunun nedeni büyük olasılıkla uygulama içerisinde daha önceden var olan bir resim dosyası yada o tür bir dosyanın silinmiş olmasıdır.

 

 

 

Örnek olarak sol tarafta resimde olduğu gibi banner.png dosyası bulunduğu klasörden silinmiş ancak solution'da halen bulunmaktadır. Çözüm; bu dosyayı solution içerisinden de silmektir.