SOAP ve REST

Bu kavramları açıklamadan önce, bahsetmek isterim ki her iki mimarininde çok büyük oyuncuları var. Bunlardan hangisini kullanmak isteyeceğimiz tercih meselesi. Ben geliştirdiğim projelerde SOAP mimarisini kullanıyorum. Ancak bu aralar neden REST ile ilgili çalışma yapmadığımı sorguladım ve iki mimari arasındaki farkları, avantajları ve dezavantajlarını karşılaştırdım. Öncelikle SOAP ve REST hakkında genel bilgiler verdikten sonra uygulamamızda hangisini tercih etmemiz gerektiğinden bahsedeceğim. 

SOAP(Simple Object Access Protocol)

SOAP(tr: Basit Nesne Erişim Protokolu) en temel anlamda, internet üzerinden küçük miktarda bilgileri yada mesajları aktarma protokoludur. SOAP mesajları XML formatındadırlar ve  genellikle HTTP(Hyper Text Transfer Protocol) protokolu(bazende TCP/IP) kullanılarak gönderilirler. Burada dikkat edilmesi gereken en önemli durumlardan biri SOAP bizi XML tabanlı kullanıma mecbur bırakır. Bu konuda esnek değildir.

 Kimler SOAP Kullanıyor?

Buna verilebilecek en büyük örnek Google. Blogger dışında bir çok uygulamasında SOAP kullanıyor. Bir çok kurumsal yazılımda SOAP kullanıldığını görebilirsiniz.

REST(REpresentational State Transfer) 

REST(tr: Temsili Durum Transferi) en temel anlamda, İstemci ve Sunucu(Client-Server) arasında veri alış verişinin basit bir yoludur. REST mimarisi standart bir tanımlamaya ihtiyaç duymaz. REST ile veri alış verişini JSON, XML hatta Text formatında bile yapabilirsiniz. Esnek bir yapıya sahiptir. REST mimarisinde HTTP metodlarından yararlanılır. DELETE, GET, POST ve PUT metodları kullanılır.

 Kimler REST Kullanıyor?

Neredeyse Yahoo'nun tüm servisleri REST kullanır. Amazon ve eBay hem SOAP hem de REST mimarilerini kullanmaktadırlar.

SOAP mı REST mi?

SOAP mı daha iyi, REST mi? Böyle bir karşılaştırma yapmanın anlamlı olmadığını düşünüyorum. SOAP yada REST seçimi, kullandığımız yapının uygunluğu açısından değerlendirilerek yapılması gerekiyor.

Güvenlik: SOAP üzerinde güvenlik(security) sağlamak daha kolay ve hızlı şekilde olabiliyorken, bu durum REST için karmaşık olabiliyor. Eğer güvenliğin çok önemli olduğunu düşündüğünüz bir uygulamadaysanız SOAP kullanmanızı öneririm.

Data Yapısı: REST ile JSON, XML hatta TEXT ile çalışabiliyorken, SOAP ile XML kullanmalıyız. REST bu sayede daha kullanışlı olabiliyor. JSON ile daha küçük boyutlarda verilerle işlemler gerçekleştirebiliyorsunuz. Eğer data boyutları uygulamanız için önem arz ediyorsa REST kullanmak sizin için uygun olacaktır.

Uygulama Hızı: Uygulamanızın daha hızlı çalışmasını istiyorsanız REST kullanmanız yararınıza olacaktır.

Destek: SOAP için geliştirici araçları daha iyidir. Kullanmamız için bize yardımcı olacak daha çok kaynak bulabiliriz. http://www.erenguvercin.com/

 

Web Api ve Web Api2

Api nedir? Ne işe yarar?

Öncelikle Api nin ne olduğundan bahsedelim, API’nin açılımı “Application Programming Interface” dir, İngilizceden direkt Türkçeye çevirildiğinde ise “Uygulama Programlama Arayüzü” olarak geçer. Belli bir programın dışarıya açılan belli kapıları gibidir, burada iceberg’in görünen yüzü gibi bir benzetme de yapabiliriz. Api’ler bu bağlamda birbirinden bağımsız uygulamaların görünen yüzlerini belirli standartlar(Api alt yapısına göre farklılıklar gösterir) ile konuşturmaya yarar. Mantık olarak bir sunucu(server) ve bir istemci(client) kapsamında ele alınabilir.

Neden Apiler’e ihtiyaç duyuyoruz?

Çok basit olarak mobil uygulamaları örnek verebiliriz. Hepimizin de bildiği üzere günümüzün işlemci teknolojilerinin geldiği noktada mobil aygıtlar oldukça yaygınlaştı. Buna bağlı olarak ta mobil uygulama gereksinimleri arttı. Mobil uygulamalar(VB.Net, C#, Java, Objective-C yada diğer dillerden herhangi birini biliyor olmak mobil uygulamalar yazmanız için aşağı yukarı yeterli olacaktır, aşağı yukarı diyorum çünkü mobil platformlar, web veya masaüstü platformları gibi değil kendine özgü durumları var.) üzerinden servis ile konuşuruz ve mobil bir aygıtta yapamayacağımız yada yapmamamız gereken bazı işlemler, bazı hesaplamalar yaparız. Bunun sonucunda da mobil uygulamaya nesne, nesneler veya istediğimiz formatta mesaj döneriz.

Neden WCF değil Asp.Net Web Api?

Uygulamalar yerine göre birbirinden bağımsız platformlarda yazılmış olabilirler, Web Api’ler REST desteği sayesinde platform bağımsız olarak tüketilebilirler.Microsoft yatırımlarını Web Api’ye yöneltmiş durumda, 2012 yılı sonunda ise resmi olarak WCF desteğini bırakacağını duyurdu. Kaynak(2013 yılında kaynak da silinecektir. )

WCF ile Web Api arasındaki en büyük farklardan birisi Web Api’lerin tamamen REST üzerine kurulu olmasıdır. REST mimarisi temelde Proxy’ye ihtiyaç duymaksızın HTTP istekleri ile basitçe gerçekleştirilebilen Get, Post, Put, Delete ve benzeri metotlarını destekler. Bu sayede de nereden ve hangi uygulamadan istekte bulunulursa bulunulsun, özel durumlar dışında Web Api’ye erişilebilecektir. Kısacası HTTP metotları kullanıldığı için bu bir tarayıcı isteği dahi olabilir. Diğer HTTP metotları ve ayrıntı için bu wiki bağlantısını inceleyin.

Web Api’lere herhangi bir kısıtlama getirilmediği sürece, istemcinin talebine göre jSon, Xml gibi formatlarda çıktı verebilirler. Haricen yine System.Net.Http.Formatting isim alanı altında bulunan MediaTypeFormatter sayesinde media type desteği de sunulmuştur, bu destek sayesinde istemciye yanıtı farklı formatlarda da dönebilmemiz mümkün. Örneğin Web Api kullanarak mp3 stream eden bir servis yazabilirsiniz(Örn: TTNet Müzik), yada csv formatında Excel çıktısı alabilirsiniz.

Dikkat çekici bir diğer kazancı da OData desteğidir. İstemci belirli anahtar kelimeler ile istekte bulunduğunda dönecek veriye filtre uygulayabilir, sıralatabilir. Bunun için istek adresine /?${Parametre} şeklinde parametreler göndermeniz yeterli olacaktır. Kullanılabilecek anahtar kelimeler orderby, top, skip, filter, select, vs gibidir, anahtar kelimelere buradan bakabilirsiniz. Oldukça basit bir şekilde veriyi arzu ettiğimiz koşullara göre isteyebiliriz. Elbette ki bu desteği kullanabilmek için IQueryable nesneler dönüyor olmamız gerekmektedir.

Buradan ilgili yardımcı dökümanları inleyeceleyebilirsiniz.

Buradan poster şeklideki pdf dosyasını erişebilirisiniz.

 

Kaynak:http://www.erenguvercin.com

Asp.net mvc 4 ile gelen SimpleMembership Karakter Sorunu

Merhaba arkadaşlar uzun süredir başıma bela olan simplemembership provideer sorunu sonunda nasıl çözüleceğini buldu. ' yol var,

1. MVC4  açıkkaynak projesinin indirerek gerekli kodu değiştirip tekrar derlemek.

2. Gerekli alanın Collation ayarlarından  Latin1_General_CI_AS yapmak.

Ayrıntıları bu linkte bulabilirsiniz. Ben en kolay olanını birincisinin denedim. oldu.

http://stackoverflow.com/questions/12843022/asp-net-simple-membership-provider

http://social.msdn.microsoft.com/Forums/tr-TR/ef658049-c25f-4e1d-93a7-5006063fcf1b/aspnet-mvc-4-ile-gelen-simplemembership-karakter-sorunu?forum=aspnettr

 

Proje geliştirmede Agile ve Scrum yaklaşımları

Proje geliştrimede agile(çevik) y ve scrum(hamle) yaklaşımları tüm dünyada kabul gören bir yaklaşımdır. Her projede olduğu gibi yazılım projelerinde de agile yaklaşımlarını gözterek  ve scrum modelini göre proje gelişirmek çok önemlidir. Önemi, hızlı proje geliştirme ve kaynakların verimli kullanımını sağlamasıdır. Bence her proje üreten firma, proje yöneticileri bunu uygulamalıdır. Ben bu konuyla ilgili  http://www.agileturkey.org/ adresindeki webiner videosunu paylaşmak istiyorum..

Yazılım projelerinde agile yaklaşımını uygulamak için TDD(Test Driven Development) ve yazılım tekniklerinin(Pattern, Domain Driven Design) benimsemek, öğrenmek gerekir. TDD hakkında bu makale az da olsa bilgi veriştim... Bu webiner programını aşağıdan izleyebilirsiniz.  Ayrıca bu Pattern ve yazılım tekniklerini bu linktende bakabilrisiniz.

 

Agile yaklaşımı Scrum ücretsiz Webineri from Altuğ Bilgin Altıntaş on Vimeo.

Pratik sesion kullanımı ve Join kullanara Method Linq ifadesi yazma bazında, diğer İpucları

Arkadaşar ben daha yeni faaliyete geçen bir site önereceğim. Güzel kod örnekleri var, paylaşmak istiyorumm. Kodlog.com yayın hayatında başarılar diliyorum.

Aşağıdaki kod session bilgisini basitce bir sınıfta kullanma yöntemi;

public static Member LocalMember
      {
          get { return HttpContext.Current.Session["LocalMember"] as Member; }
          set { HttpContext.Current.Session["LocalMember"] = value; }
      }

diğer örneğimiz ise join kullanarak linq ifadesinde birleşim yapmak.

joinData = uow._context.PRODUCT.Where(x => x.STATUS == IsActive).Join(uow._context.PRODUCT_TYPE,
                    Product => PRODUCT.PRODUCT_TYPE_ID,
                    ProductType => PRODUCTType.PRODUCT_TYPE_ID,
                    (PRODUCT, PRODUCTType) => new PRODUCTViewModel
                    {
                        PRODUCT_ID = Product.PRODUCT_ID,
                        PRODUCT_NAME = Product.PRODUCT_NAME,
            PRODUCT_TYPE_NAME = ProductType.Name
                       
 
                    }).ToList();
 
                return joinData;

 

Kullanıcı textbox üzerinde değişiklik yaptığında çalıştırmanız gereken kodlar bu değişikliği bu jquery koduyla yakalayabilirsiniz.

 $("input").bind("change", function () { alert($(this).attr("id")); });

Linq ToDictionary() fonksiyonunun kullanımına bir örnek

 Dictionary<string,string> xDict=new Dictionary<string,string>();

xDict=result.ToDictionary( t => t.Key.ToString(), t => t.Value.ToString() );

inq Group By sorgusuyla bir listedeki tekrar eden değerleri ve bu değerlerin sayılarını bulmak için gerekli kod 

            List<string> cities = new List<string>();
            cities.Add("New York");
            cities.Add("Istanbul");
            cities.Add("Mumbai");
            cities.Add("Istanbul");
            cities.Add("Mumbai");
            cities.Add("Berlin");
            cities.Add("Istanbul");
 
            var tekrarlar = cities.GroupBy(p => p)
                                       .Select(p => new { IlAdi = p.Key, TekrarSayisi = p.Count() })
                                       .OrderByDescending(p => p.TekrarSayisi).Skip(0).Take(10).ToList();

net framework'a 4.0 versiyonu ile katılan Tuple sınıfı ile, farklı veri tiplerine sahip çok boyutlu diziler oluşturabilirsiniz. Örnek tuple kullanımı;

var ttt =new List<Tuple<int, string, string>>();
          ttt.Add(new Tuple<int, string, string>(12, "ss", "ddf"));
          ttt.Add(new Tuple<int, string, string>(13, "ss1", "ddf1"));
          ttt.Add(new Tuple<int, string, string>(14, "ss2", "ddf2"));
 

Asp.net Mvc ile forms authentication ticket oluşturma

[HttpPost]
     public ActionResult Login(string user, string pass)
     {
         var user = service.getUser(user, pass);
         if (user != null) {
             FormsAuthentication.SetAuthCookie(user.Email, false);
             return RedirectToAction("Index""Dashboard");
         }
          
     }

global asax da yapılması gerekenler

protected void FormsAuthentication_OnAuthenticate(Object sender, FormsAuthenticationEventArgs e)
      {
          if (FormsAuthentication.CookiesSupported == true)
          {
              if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
              {
                  try
                  {
                      string username = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value).Name;
                      string roles = string.Empty;
                      
                    
                      roles = "admin";
                      e.User = new System.Security.Principal.GenericPrincipal(
                        new System.Security.Principal.GenericIdentity(username, "admin"), roles.Split(';'));
                  }
                  catch (Exception)
                  {
                      
                  }
              }
          }
      }

Sunucu tarafına JSON verisi post etmek istediğinizde jquery ajax methodunu kullanabilirsiniz, örnek kullanım;

var arro = [];
       arro.push(12);
       arro.push(44);
 
       $.ajax({
           type: "POST",
           url: "/home/test",
           contentType: "application/json; charset=utf-8",
           data:JSON.stringify({"myArray":arro}), //stringify ile json objemizi stringe çeviriyoruz
           dataType: "json" //datatype olarak json verilmeli
       
       });

Controler tarafında

public JsonResult Test(List<int> test)
     {
         return Json(new {Success=true },JsonRequestBehavior.AllowGet);
     }

Linq içinde ayrı bir method (Convert.ToInt32) kullanma istedeğimizde bu method IQuerable bir type de değil, IEnumerable tipinde olmalıdır.  Dolayıyla böyle bir hata varir. "LINQ to Entities does not recognize the method".

public IEnumerable<CourseNames> GetCourseName()
{
    var courses = from o in entities.UniversityCourses
                  select new { o.CourseID, o.CourseName };
  
   return courses.ToList()
                  .Select(c => new CourseNames()
                  {
                     CourseID = Convert.ToInt32(c.CourseID),
                     CourseName = c.CourseName
                  });
}

referans: http://kodlog.com/

 

İpucu: exe dosyalarını birlikte aç varsayılan ayarını değiştirmek.

Bazı acemi kullanılarexe uzuantıları yanlışlık veya bilmeden birlikte aç ile farklı bir program seçebilir. Bu durumu düzeltmek için çıkılmaz bir hal alır, çünkü tüm kurtarıcı araçlar exe uzantıları çalıştırmak geçer. Çözüm bir reg ayarı girmek veya .bat olan bir toplu işlem dosyası dosyası çalıştırmaktır. Çözüm aşağıdaki metni txt dosyasına yazın ve uzantısı .reg olarak değiştriin ve bu dosyayı çalıştırın.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.exe\UserChoice]

İkinci çözüm aşağıda hazır olan dosyayı çalıştırın.

İyi çalışmalar.

 

birlikteAsExeSorunu1.reg (136,00 bytes)

İpucu: exe dosyalarını birlikte aç varsayılan ayarını değiştirmek.

Bazı acemi kullanılarexe uzuantıları yanlışlık veya bilmeden birlikte aç ile farklı bir program seçebilir. Bu durumu düzeltmek için çıkılmaz bir hal alır, çünkü tüm kurtarıcı araçlar exe uzantıları çalıştırmak geçer. Çözüm bir reg ayarı girmek veya .bat olan bir toplu işlem dosyası dosyası çalıştırmaktır. Çözüm aşağıdaki metni txt dosyasına yazın ve uzantısı .reg olarak değiştriin ve bu dosyayı çalıştırın.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.exe\UserChoice]

İkinci çözüm aşağıda hazır olan dosyayı çalıştırın.

İyi çalışmalar.

 

birlikteAsExeSorunu1.reg (136,00 bytes)

LinQ ile null değerlerin toplanması

Linq da kullanılan .Sum() ifadesi normalde null değerleri toplarken hata verir, fakat  biz linq da bu değerlerin null olabileceğini belirtirsek bu hata mesajında kuturlmuş oluruz.

 

 

Program çalıştırıldığı aşağıdaki gibi bir çıktı alınır. Görüldüğü gibi son kişinin değerlerinin toplamı null dur.

 

 kaynak : http://weblogs.asp.net/zeeshanhirani/archive/2008/07/15/applying-aggregates-to-empty-collections-causes-exception-in-linq-to-sql.aspx

EntityFramework ile bir Db Migration(Taşımak)

Bir veri projede ilerlerken veri tabanın bozulmadan upgarde edilmesi veya yedeklenmesi gerebilir. Bunun için System.Data.Entity.Migrations  isimalanında gerekli komutlar mevcuttur.

Biz bir bir projede migrations etkin hale getirmek için, Package console Manegerdan,

enable-migrations -contexttypename School,

ekleme noktası yaratmak ve update etmek için

add-migration InitialCreate

update-database

Burada School contextimizin ismi, InitialCreate ise hangi işlemlerin yapıldığı belirden bir kayıt dosyası gibidir ve bir class dır.  Bu dosyalardan birini açtığımızda bunun gibi gözükebilir. Biz buraya database eklemek istedeğimiz verileri yazabilir.

internal sealed class Configuration : DbMigrationsConfiguration<ContosoUniversity.DAL.SchoolContext>
   {
      public Configuration()
      {
         AutomaticMigrationsEnabled = false;
      }

      protected override void Seed(School context)
      {
         var students = new List<Student>
            {
                new Student { FirstMidName = "Carson",   LastName = "Alexander", 
                    EnrollmentDate = DateTime.Parse("2010-09-01") },
                new Student { FirstMidName = "Peggy",    LastName = "Justice",   
                    EnrollmentDate = DateTime.Parse("2011-09-01") },
                new Student { FirstMidName = "Laura",    LastName = "Norman",    
                    EnrollmentDate = DateTime.Parse("2013-09-01") },
                new Student { FirstMidName = "Nino",     LastName = "Olivetto",  
                    EnrollmentDate = DateTime.Parse("2005-08-11") }
            };
         students.ForEach(s => context.Students.AddOrUpdate(p => p.LastName, s));
         context.SaveChanges();

         var courses = new List<Course>
            {
                new Course {CourseID = 1050, Title = "Chemistry",      Credits = 3, },
                new Course {CourseID = 2021, Title = "Composition",    Credits = 3, },
                new Course {CourseID = 2042, Title = "Literature",     Credits = 4, }
            };
         courses.ForEach(s => context.Courses.AddOrUpdate(p => p.Title, s));
         context.SaveChanges();

      }
   }

 

Ve bu class dosyısını çalışma anında yüklemek istersek aşağıdaki satırı yazmak gerekir.

var configuration = new Configuration();
            var migrator = new DbMigrator(configuration);
            migrator.Update();

Bir sonraki yazımızda görüşmek üzere hoşçakalın..

Mvc4 Helper yazma

Merhaba arkadaşlar MVC de program yazan arkadaşların mutlaka bilmesi gereken konulardan birisi htmlHelperları kullanma ve yazmadır. Helper parametrelerini anlamak ve bunlara uygun kod yazmak için için c# bilginin üdt düzey olması gerekir. En azından generic kullanımı, dictonary<T,T> gibi yazım şekilleri bilmeniz gerekir.

Ben hızlı kod yazmak için bazen bu helperlarla uğraşmak can sıkıcı olabiliyor. Ben bazen direkt html kodları yazıyorum... Herşey için helper yazmak zor geliyor. Ben bu örenekte aşağıdaki gibi bbir çıktı veren bir helper yazmak istiyorum.

<input foo:message="Please enter a value." foo:required="true" id="UserName" name="UserName" type="text" value="">

Seneryo gereği input tagına burada foo isminde bir attiribute eklemesi yapmak istiyorum.

public class FooAttribute
{
    public bool Required { get; set; }
    public string Message { get; set; }
}

public static class FooHelper
{
    public static MvcHtmlString LegacyTextboxFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, FooAttribute fooAttributes)
    {
        var fieldName = ExpressionHelper.GetExpressionText(expression);
        var fullBindingName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(fieldName);
        var fieldId = TagBuilder.CreateSanitizedId(fullBindingName);

        var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
        var value = metadata.Model;

        TagBuilder tag = new TagBuilder("input");
        tag.Attributes.Add("name", fullBindingName);
        tag.Attributes.Add("id", fieldId);
        tag.Attributes.Add("type", "text");
        tag.Attributes.Add("value", value == null ? "" : value.ToString());

        if (fooAttributes != null)
        {
            if (fooAttributes.Required) tag.Attributes.Add("foo:required", "true");
            if (!String.IsNullOrEmpty(fooAttributes.Message)) tag.Attributes.Add("foo:message", fooAttributes.Message);
        }
        return new MvcHtmlString(tag.ToString(TagRenderMode.SelfClosing));
    }
}

Artık aşağıdaki gibi bir kod yazdığım da tam da istediğim gibi bir kod çıktısını elde edebilmekteyim.. bir sonraki makalemizde görüşmek üzere hoşçakalıın..

 @Html.MyTextboxFor(model => model.UserName, new FooAttributes {Required=true, Message="Please enter a value." })

 

The file '/Custom/Widgets/Calendar/widget.cshtml' does not exist.The file '/Custom/Widgets/Category list/widget.cshtml' does not exist.The file '/Custom/Widgets/Tag cloud/widget.cshtml' does not exist.The file '/Custom/Widgets/Page List/widget.cshtml' does not exist.The file '/Custom/Widgets/Month List/widget.cshtml' does not exist.