msHOWTO

10 Temmuz 2013 Çarşamba

web service parser error could not create type .net framework 4.0

Merhaba arkadaşlar ,

bugün web servisler ile ilgili yaşadığım sorunu ve çözümü sizlerle paylaşacağım . Öncelikle durum şudur ; E-Ticaret sisteminin içerisinde Web Service projesi oluşturdum. Gerekli kodları yazdım . Yayında olan E-Ticaret sisteminin ftp server ına servislerimi yukleyecektim. Web Servis projeme sağ tıklayıp Publish dedikten sonra oluşturduğu dosyaları ftp nin içerisine attım . Ftp nin içerisinde Web Projem de olduğu için bu projenin bin klasorü de mevcut idi. Daha sonra bir klasor altına Web Service projemin publish dosyalarını upload ettim. Ornegin : http://www.xxx.com/Servisler/servisadi.asmx olarak browser a girdiğimde karşıma ;

<%@ WebService Language="C#" CodeBehind="servisadi.asmx.cs" Class="BHI.Rats.servisadi" %>

şeklinde bir hata çıktı. Bu hatanın sebebi ise , ftp nin içerisinde Web Projemin oluşturduğu var olan bin klasörü ile Servisler klasörünün içinde bulunan bin klasörünün karışıklık oluşturmasıdır. Yani ben http://www.xxx.com/Servisler/servisadi.asmx olarak ilgili servisi çağırdığımda ilk olarak ana dizindeki bin klasörünün içerisinde servis projemin dll dosyasını arayıp bulamadı için bu şekilde bir hata meydana gelmektedir.

Çözüm ise çok basit . Ana dizindeki bin klasörüne web service projenizin .dll dosyasını atmanı ve çalıştırmanız yeterli olacaktır.Yani kısaca class property sinde yazdığınız classı bu bin klasöründe bulunan dll dosyasında aramasıdır.

6 Temmuz 2013 Cumartesi

Asp.Net Web Sitemde Routing Çalışmıyor. Asp.Net Routing Ayarları

Merhaba arkadaşlar. Bugün sizlere ASP.NET ile web sitesi geliştirdiğiniz projelerinizde eğer Routing kullanırsanız yüksek ihtimalle karşılaşacağınız sorunun çözümünü paylaşacağım. İlk olarak routing yapısını kullandıysanız hosting panelinizden ASP.NET ayarlarından Pipeline Mode ayarını Classic den INTEGRATED olarak kaydetmeniz gerekecektir. Gerekli olan hosting ayarını yaptıktan sonra ise Web Site projeniz içerisinde bulunan Web.config dosyanıza Configuration tag ları arasına aşağıdaki configuration satırlarını eklemeniz gerekecektir.

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="UrlRoutingModule"/>
      <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>
    <handlers>
      <add
        name="UrlRoutingHandler"
        preCondition="integratedMode"
        verb="*" path="UrlRouting.axd"
        type="System.Web.HttpForbiddenHandler, System.Web, 
              Version=2.0.0.0, Culture=neutral, 
              PublicKeyToken=b03f5f7f11d50a3a"/>
    </handlers>
  </system.webServer>

Tüm yapmanız gereken bu kadar. Eğer hosting panelinizde bahsettiğim ayarı bulamazsanız mutlaka hosting firmanızla iletişime geçiniz. Bu ayarı yapmazsanız eğer sisteminiz tekrar 404 hatası verecektir.

Umarım faydalı olmuştur.

27 Mayıs 2013 Pazartesi

"A potentially dangerous Request.Form value was detected from the client" Hatası ve Çözümleri

Merhaba arkadaşlar. Bugün proje geliştirirken aldığım hatanın sebebini ve çözümlerini sizlerle paylaşacağım. Hatanın sebebi web projenizde herhangi bir sayfanızda herhangi bir yerinden girdi olarak HTML girdisi alınıyorsa direk olarak bu hatayı fırlatıyor. Asp.Net kendisi bu şekilde bir nebze de olsa güvenlik sağlamaya çalışıyor. Fakat bazen öyle durumlar oluyor ki kullanıcan HTML içerikli girdi almak durumunda kalıyorsunuz. Bu durumlar da yapılması gereken ilk şey farklı bir editör kullanmak. Örneğin CKEditor gibi. Fakat benim şuan geliştirdiğim uygulamda kullanıcıdan Google Map embed linki almam gerekiyor. Bunun için CkEditörü sayfaya import edip yüklenmesini sağlayıp sayfayı yavaşlatmak saçma ve gereksiz olur. Bu nedenle klasik ve düz TextBox kullanıyorum. Bu durumda da html girdi olduğu için direk bu hatayı fırlatıyordu. Bu sorunun birden fazla çözümü mevcuttur .

1-) Web.config dosyamıza <system.web> tag ının altına <pages validateRequest="false"/> tag ı eklenir.

2-) Bu şekilde veri girdisi sadece o page de olacaksa daha özele inip , ilgili page in <%@Page tagına  validateRequest="false" eklenir.

3-)Eğer bunları yapıp hala aynı hatayı alıyorsanız muhtemelen Visual Studio 2010 ve 4.0 ile projenizi geliştiriyorsunuz demektir. Bu durumda ise Web.config dosyamıza <system.web> tag ının altına   <httpRuntime requestValidationMode="2.0" /> tag ı eklenir.

Umarım faydalı olmuştur arkadaşlar. Bir sonraki makalemde görüşmek üzere.

22 Mayıs 2013 Çarşamba

Entity FrameWork .Net Framework 4.5 Projelerinde Transaction Kullanımı

Merhaba arkadaşlar ,

Geliştirmekte olduğum projemin içerisinde database işlemlerini yaptığım methodlarda transaction kullanmam gerekti.Daha önce .Net Framework 4.0 ile geliştirdiğim projelerimde Transaction yapısını kullanmıştım. Fakat şuan ki projemi .Net 4.5 ile geliştiriyorum.Transaction işlemi için .Net 4.0 da kullanmış olduğum ,


using (TransactionScope scope = new TransactionScope())
{
}

bloğunu tekrar kullanmam gerekiyordu. Fakat bu şekilde yazında TransactionScope Class ının içerisinde bulunduğu Library 'i görmedi. Bunun için uyguladığım çözüm ise ;

Solution içerisinde transaction uygulanacak sınıfın ait olduğu project teki references kısmına sağ tıklayıp Add Reference dedim . Çıkan listede System.Transactions olması gerekiyor.Bu listenin içerisinde göremiyorsanız siz de benim gibi , penceredeki Browse butonuna tıklayın ve aşağıdaki dizine konumlanın .

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\

Daha sonra bu klasörün içerisinde System.Transactions.dll dosyasını seçin ve Ok butonuna basın. Bu şekilde referas olarak ekledikten sonra transaction uygulanacak sınıfınıza geri dönün. Ve

Using System.Transactions;

satırını ekleyin. Artık


using (TransactionScope scope = new TransactionScope())
{
}

scope larının içerisine yazacağınız tüm database işlemlerine transaction uygalanacaktır.Yani bir işlem başarısız olursa eğer , bu scope içerisindeki tüm database işlemleri geri alınacaktır.

Umarım faydalı olmuştur. Görüşmek üzere.

9 Mayıs 2013 Perşembe

Unable to update the EntitySet 'Slider' because it has a DefiningQuery and no element exists in the element to support the current operation. Hatasının Çözümü

Merhaba arkadaşlar. Bugün proje geliştirirken karşıma çıkan hatanın çözümünü sizinle paylaşacağım.Öncelikle hatayı Entity Framwork kullanarak veri tabanındaki bir tabloya kayıt eklerken aldım. Daha sonra bu hatanın çözümü için uyguladığım seçenekler ise ,

1-) Projemdeki modeli güncellemek ,
2-) Veri tabanındaki ilişkileri kontrol etmek ,
3-) Projemdeki modeldeki ilişkileri kontrol etmek ,
4-) Google ' a sormak :)

ve 4. seçenekte www.stackoverflow.com sitesinde karşıma çıkan öneriyi denedikten sonra sorunum çözüldü. Sorun aslında yapılmaması gereken bir hatadan kaynaklanıyormuş. Veri ekleme işlemi yaptığım tabloyu oluşturduğumda Primary Key belirtmediğimden dolayı hata alıyormuşum.

Yani kısaca sorunu ilgili tabloma Primary Key alanı ekleyerek , daha sonra da projemdeki modeli güncelleyerek çözmüş bulunmaktayım.

Umarım yardımcı olmuştur.

11 Nisan 2013 Perşembe

Method not found: 'System.Data.Entity.DbSet`1 Entitiy.get_Markas()'. Hatası

Merhabalar arkadaşlar. Bu makalemde tam 3 saatimi alan ve aklıma gelen her yolu denediğim internetten de pek çözüm bulamadım Method not found: 'System.Data.Entity.DbSet`1<Entitiy> Entitiy.get_Markas()'. Hatasının çözümünü anlatacağım. Umarım karşılaşmazsanız ve umarım internette aradığınızda benim sayfama çabuk ulaşırsınız :)

Çözüm için denediklerim ,

- Hatayı fırlatan methodun içinde bulunduğu projedeki entity framework paketini güncellemek.
- Model içerisindeki entity i kontrol etmek ,
- model.edmx.diagram dosyasını incelemek ,
- modeli update etmek ,
- modeli silip yeniden kaldırmak ,
- Hatayı fırlatan methodun içinde bulunduğu projedeki config dosyasındaki connection string i güncellemek ....

Ama tüm bunların hiç biri işe yaramadı . En son sinirlenip Visual Studio 2012 IDE sini kapattım. 2 dk sonra tekrar proje açtığımda ise her şey tıkır tıkır çalışıyordu.

Yani ya bu üstteki yaptıklarımdan dolayı çözüme ulaştım ama bana yansımadı ya da bu hatanın tek bir çözümü var KAPAT - AÇ ... 

Şaka gibi ama gerçek :)

Kolay gelsin...

22 Şubat 2013 Cuma

LINQ Nedir ? (Giriş)


Merhaba arkadaşlar , daha önceki makalelerimde sizlere Entity Framework ve ORM hakkında giriş bazlı bilgi vermiştim. Bu makalemde sizlere entity framework kullanarak var olan database üzerinden nasıl sorgulama yapacağımızı anlatmaya çalışacağım.Peki nasıl sorgulama yapacağım ? Veri tabanı üzerinde sorgulama yapabilmem için benim programım ile veri tabanı arasında bir bağ oluşturmam gerekir.Bu bağı da ya ADO.NET mimarilerinden biri ile ya da herhangi bir ORM tool u ile sağlayabilirim veya third party component ile sağlayabilirim.Bu makalemde ise ORM kullanarak var olan bir veri tabanı üzerinde sorgulama işlemi yapacağız.

Eğer ADO.NET mimarilerinden biri ile bağlantı sağlayacak olsaydık , mutlaka o veri tabanı üzerinde sorgulama işlemi yapmak için SQL kullanmak zorunda kalacaktık.

Peki ORM yani Microsoft tarafındaki ORM tool olan Entity Framework ile sorgulama işlemini nasıl yapacağız ?
     - Elimizde bu işlem için uygun çok güzel bir teknoloji var :)

Tekrar SQL mi kullacağız ?
     - Tabi ki Hayır.

Peki nedir bu teknoloji ?
    - LINQ.

Bana sağlayacağı sadece Sql yazma derdinden mi kurtarmak ?
    - Tabi ki de hayır. Şimdi entity framework kullanırsanız eğer , veri tabanı modelinizi projenize import ettikten sonra model üzerinde bulunan her bir tablo bize object olarak sunuluyor.Ben oop ile harmanlayarak sorgulama yapmak istediğim tablolar arasından ilgili alanlar için bir class içerisine property tanımlayarak , istediğim şekilde verileri çeker alırım.Böylelikle hem veri tabanımın güvenliği artmış olur hem benim kod yazmam hızlanır , hem projem daha düzgün gözükür , gereksiz bir çok tür dönüşümü ile uğraşmam , gereksiz veriler arasında dolanıp durmam ... Daha bir çok faydası mevcuttur.

Peki tüm bu sunulanlar çok güzel. Fakat ya hız ?
     - Ado.Net daha verimli çalışmakta.

LINQ ' i sadece veri tabanı sorgulama işlemlerinde mi kullanabilirim ?
     - Hayır. Object List ' lerin hepsinde kullanabilirsiniz.


Umarım giriş bölümünden kafanızda LINQ ' i oluşturabilmişimdir.Niçin kullanılır ? Faydaları nelerdir ? SQL yerine neden LINQ kullanırım ? Nerelerde kullanırım ? gibi soruların cevabını verdikten sonra isterseniz LINQ ' in syntax ini inceleyelim.

Aslında Linq syntax i eğer sql komutları yazdıysanız daha önceden size hiç de yabancı gelmeyecektir.Çünkü linq yazımında kullanılan keyword ler sql keyword leri ile neredeyse aynı.Basit bir örnek üzerinde syntax i görelim.

Mesela veri tabanımızdan çalışanlar ile ilgili tüm verileri tek bir tablo üzerinden çekecek olursak ,




  var TumCalisanlar = from calisanlar in calisanListesi
                                select calisanlar;




Evet arkadaşlar ben bu sorgulama işlemini eğer sql kullanarak yapacak olsaydım eğer ,

select * from calisanListesi    şeklinde bir sql komutu yazmam gerekecekti. Farkettiyseniz "from" ve "select" keyword leri aynı şekilde kullanılmıştır.Tek fark "in" keyword u.Lınq syntax i ile aslında biz şu şekilde emir veriyoruz ; "calisanListesi içerisindeki tüm verileri calisanlar diye bir değişkene aktar ve bu değişkenin içerisindeki tüm herşeyi seç ve TumCalisanlar değişkenine bu seçitiklerini ata." diyoruz. Böylelikle bana son derece esnek bir yapı sağlanmış oluyor.Ben linq kullanarak C# yapısında bulunan türleri , kendi oluşturduğum class ları , objeleri aslında Sql komutları ile birleştiriyorum.Böylelikle bir tarafta sql yazayım sonucunu alayım sonra C# üzerinde işlemler yapayım dönüşümleri sağlayım falan filan gibi gereksiz bir çok işlemden kurtulmuş oluyorum.

Peki bir tablodan veri çekerken ben bir filtreleme işlemi gerçekleştirmek istiyorum.Nasıl yaparım ?

     - Bu sorunun cevabını hem sql ile hem de linq ile vereceğim . Sql kullanırsak eğer ;
                   select * from calisanListesi where yas>30 (gibi bir filtreleme işlemi olsun)
     
       Bu işlemin linq tarafı ise şu şekilde ;

                    var TumCalisanlar = from calisanlar in calisanListesi where calisanlar.Yas>30
                                                   select calisanlar;

Görüldüğü gibi her iki sorgulama işleminde de filtreleme işlemi için "where" keyword u kullanılıyor.

Peki bir tablodan sadece bir kolondaki tüm verileri nasıl çekerim ?

     - Sql kullanarak :   select adi from calisanListesi

     - Linq kullanarak :   from calisanlar in calisanListesi select calisanlar.adi;



Peki bir tablodan birden çok kolondaki bilgileri nasıl çekerim ?

   - Sql tarafında select ifadesinden sonra istediğiniz kolon isimlerini virgül ile yan yana yazarak alabilirsiniz.

   - Linq tarafında ise  from calisanlar in calisanListesi select new  { calisanlar.adi , calisanlar.yasi};

olarak istediğiniz kolonları alabilirsiniz.Bu sayede bu sorgudan çıkan sonuç yeni bir tür olarak tutulur.Bu veri kümesini istediğiniz gibi kullanabilirsiniz.

Peki birden çok tabloyu birleştirerek sorgulama işlemi nasıl yaparım ?

      -Sql tarafında : select * from calisanListesi join Yetkiler on calisanListesi.ID = Yetkiler.CalisanListesiID
                           
      -Linq tarafında ise from calisanlar in calisanListesi join yetkiListesi in Yetkiler  on calisanlar.ID equals yetkiListesi .CalisanListesiID

Evet arkadaşlar basit anlamda Linq sorgulama işlemini anlatmaya çalıştım.Mümkün olduğu kadar sql ile kıyaslamalı örnekler vermemin nedeni zaten sql yazıyorsunuz , linq i görüp kaçmamanızı sağlamaktı :) Umarım faydalı olmuştur . Linq üzerinde bu makalede sadece sorgulama işlemi yaptık. Insert Update ve Delete işlemlerini başka bir makalemde anlatacağım.Linq i lambda expressions la kullanırsanız çok daha fayalı olacaktır.Lambda expressions ı da fırsat bulursam anlatacağım .

Şimdilik bu kadar görüşmek dileğiyle ...