C# Dilinde Kullanılan Faydalı Operatörler

28 Ağu

(??)  “null coalescing” Null kontrol operatörü

Bu operatör nullable(null değer alabilir) bir değişkenin null oluğ olmadığını kontrol eder.

Örnek:
               string name = "Product";
               string info = name ?? "product name is null"

(?:)  Mantıksal Sınama Operatörü

Bu operatör mantıksal bir sınamayı ifadeyi temsil eder. if sınamasının kısa yazım şeklidir.

Kullanımı:
               condition ? first_expression : second_expression;
               şart ? birinci_durum : ikinci_durum;

Örnek:
               if(x != 0.0) s = Math.Sin(x)/x; else s = 1.0;
               s = x != 0.0 ? Math.Sin(x)/x : 1.0;

Nullable<> (?) operatörü

Örnek: public int? Command { get; set; } şeklindeki bir tanımlamada ? ile Command property’nin null değer alabileceği ifade ediliyor.

Örnek:
              public Nullable<int> Command {get; set;}

(::) operatörü

Bazı kütüphanelere extern alias tanımlaması yapılır. Harici isim takma şeklinde Türkçeleştirilebilir. .NET’te birçok noktada global:: şeklinde tanımlamalar bulunur. Amaç aynı isimdeki sınıfların birbirini ezmesini engellemek ve her iki sınıfada farklı isimler vererek kullanıma sunmaktır.

Örnerk:
              public global::System.Int32 id

Asp.net MVC ActionMethodSelector Attribute

26 Ağu

Bu yazımızda controller action metodları çalıştığı durumlarda action metodunu kontrol eden kendi attribute sınıfımızı nasıl oluşturabileceğimiz üzerinde duracağız. Kendi özel attribute sınıfımızı oluşturmak için yazdığımız sınıfı ActionMethodSelectorAttribute sınıfından türetmemiz gerekiyor.

Bu sınıf ileri düzeyde oluşturulmuş bir sınıf olacak. Miraslama işlemi ile oluşturduğumuz sınıfa ActionMethodSelectorAttribute sınıfından gelen IsValidForRequest() adında tek bir metod olacaktır.

    public class AjaxMethod : ActionMethodSelectorAttribute

{

public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)

{

if (!controllerContext.HttpContext.Request.IsAjaxRequest())

{

throw new Exception(“Bu metod [” + methodInfo.Name + “] sadece Ajax request için tanımlanmıştır.”);

}

 

return true;

}

}

 

Oluşturulan attribute bir action metoda şu şekilde uygulanmaktadır:

        [AjaxMethod]
        public ActionResult Unknown()
        {
            return View();
        }

Eğer Unknown() metoduna Ajax request haricinde bir request gelirse aşağıdaki gibi bir hata sayfasıyla karşılaşıyor olacağız.

Bir sonraki yazıda görüşmek üzere herkese iyi çalışmalar.

Asp.net MVC Action Kontrolü ve Action Attribute

25 Ağu

Bu bölümde controller sınıfımızdaki action metodları nasıl kontrol edilebileceği vebu metodlara erişim izinlerini belirleyen ve bu metodları bir anlamda özelleştiren bazı attribute’lerden bahsedeceğiz. İnceleyeceğimiz bazı attribute’ler:

  • AcceptVerbs
  • ActionName
  • ActionMethodSelector

AcceptVerbs Attribute

Bu attribute action metoduna HTTP operasyonları yardımıyla erişme izinlerini belirler. Bir action metoduna sadece HTTP Get metoduyla ya da Post metoduyla erişilmesini isteyebiliriz. Bu durumda ilgili action metodumuz AcceptVerbs attribute ile işaretlememiz gerekecektir.

Bir employee controller sınıfımıza ait Create() metodu olduğunu varsayacak olursak bu noktada iki adet Create() action metoduna ihtiyacımız olacaktır. Birinci metod HTTP GET operasyonu ile metodu ile çağrılmalı ve form sayfasını karşımıza çıkarmalı, ikinci metod ise form doldurulduktan sonra HTTP POST metodu ile verilerin alınarak işlenmesini sağlayacaktır.

// GET: /Employee/Create

[AcceptVerbs(HttpVerbs.Get)]

public ActionResult Create()

{

return View();

}
// POST: /Employee/Create

[AcceptVerbs(HttpVerbs.Post)]

public ActionResult Create(Employee employeeToCreate)

{

try

{

//Kayıtları yap…

return RedirectToAction(“Index”);

}

catch

{

return View();

}

}

Bu durumda bowser ortamından /Employee/Create şeklinde çağırdığımızda eğer controller oluşturulmamışsa hata raporu gözükecektir.

The resource cannot be found.

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly.

Requested URL: /Employee/Create

Bu hatanın sebebi, henüz Employee adında controller oluşturulmamış olmasıdır.

Employee adında bir Controller oluşturulduktan sonra ve bir Create action metod oluşturulursa sorun çözülmüş olacaktır.

Action metodlarını HTTP operasyonlarıyla işaretlemenin bir diğer yolu ise aşağıdaki şekildedir. [AcceptVerbs(HttpVerbs.Post)] yazımının kısa yazılmış şeklidir.

        [HttpGet]
public ActionResult MyAction()

{

return View();

}

Bu metod daha kullanışlıdır. Hazır oluşturulmuş attributeler yazdımıyla işaretlemeler yapılmaktadır.

HTTP operasyonlarından en çok bilinen POST ve GET operasyonlarıdır. Diğer operasyonlar DELETE, PUT, HEAD, TRACE, CONNECT.

Asp.net MVC 4 Yol Haritası

24 Ağu

Microsoft ASP.NET MVC 4 Yol haritasını yayınladı. Tabi bu yol haritası üzerinde değişklikler yapılabilmesi muhtemel geçici bir bakış açısı gibi duruyor. Bu yol haritasında dikkat çekici üç hazırlık mevcut. Bunlar yeni araçlar (tooling), genişletilmiş mobil platform desteği ve bulut tabanlı (cloud based) çözümler.

ASP.NET MVC takımındaki bir diğer çalışma ise Genişletilebilir Görev Tabanlı Araçlar (Recipes = (Extensible Task-Based Tooling). Örneğin view katamnında bir datagridi doldurup göstermek için önce data-access sınıfları hazırlanır, sonra controller tarafında veriler bir model doldurulur ve view katmanına sunulur. Bu çözümler (Recieps) denilen araçlar bu işlemlere yardım edecek. Kullanıcılar kendi çözümlerini de kendileri yazabilecekler. Yazılan çözümler bir arayüz vasıtası ile uygulamaya dahil edilebiliyor olacak.

Smartphone ve tablet tarafından olaya baktığımızda Microsoft ASP.NET MVC takımı template vb. yöntemlerle ASP.NET MVC 4 web sayfalarının mobil versiyonuna daha iyi destek vermeyi düşünüyor. Aşağıda MVC3 ve MVC4 ile yapılmış web sitelerinin mobil ortamda görüntülerini incelediğimizde farkı daha iyi anlamış olacağız.


Ele alınan bir başka değişiklik ise özellikle tablet ve mobil cihazlar için yeni bir proje şablonu. Bu şablonun da görünümü yine aşağıdaki gibi olacak:


Tabi bu kadarla da kalmayıp aygıta göre View oluşturma imkanı da gelen yeni yenilikler arasında. Örneğin mobil aygıtlar için oluşturulan bir View .mobile uzantılı olacak. Aşağıdaki resimde view katmanının görünümü verilmiştir:

Asp.net MVC ve ELMAH ile Hata Log Kaydı

22 Ağu

Web uygulamalarımızı yaparken tüm kontrol elimizde olsun isteriz. Kontrol etmek istediğimiz noktalardan birisi de süreç işlerken oluşan hataların neler olduğudur. Yani bir kullanıcı sistemde işlem yaparken bir hata ile karşılaştığında işleminin neden yarıda kesildiğinden haberdar olmak isteriz. Yazdığımız kodlardaki bug’lar olsun, sunucu kaynaklı sorunlar olsun sorunun ne olduğu, ne zaman meydana geldiği hatta hangi kullanıcının bu sorunu yaşadığı kaydedip incelemek istediğimiz durumlardır.

Bu noktada yazılmış hata yöneticilerinden biri de ELMAH (Error Logging Modules and Handlers) kütüphanesidir. Bu kütüphane süreç işlerken oluşan hataları detaylı olarak kaydeder.

Oluşan Log kayıtlarını birçok ortamda depolayabiliriz. Bu depolama ortamları:

Burada dikkat etmemiz gereken noktalardan biri oluşan hata loglarını nereye kaydedeceğimizi belirlemektir. Biz kayıtları XML dosyada tutacağız.

ASP.NET MVC projesine ELMAH kütüphanesini dahil etmek için Nuget Package Manager eklentisini kullanıyor olacağız.

Package Manager Console açarak Install-Package elmah.xml komutunu giriyoruz. Kurulum otomatik olarak gerçekleşiyor. Web.config dosyası içerisinde ayarlamalar otomatik olarak yapılıyor. Hata kayıtlarının nerede tutulacağını belirleyen kısım ise aşağıdaki gibidir.

  <elmah>   
    <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data/Elmah.Errors" />
  </elmah>

Yükleme işlemi gerçekleştikten sonra HomeController içersine About adında bir index belirliyoruz ve bu metodun hata fırlatmasını sağlıyoruz.

 

http://localhost:1735/Home/About şeklinde çağırdığımızda meşur sarı hata sayfasıyla karşılaşıyoruz. (1735 portu kendi makinamın verdiği port numarası, sizin denemenizde bu numara farklı olabilir.)

Bu hata kaydı  App_Data/Elmah.Errors dizininde XML dosya içersine kaydedilmiş olacak. Hata kaydını görmek için http://localhost:1735/elmah.axd yoluna bakıyoruz ve aşağıdaki şekilde başarılı sonuca ulaşmış oluyoruz.

Global.asax Applicarion_End, Applicarion_Start, Session_End, Session_Start

22 Ağu

Global.asx dosyası içinde oturum açıldığı ve kapandığı sırada ya da uygulama ayağa kalktığında veya sonlandığında gerçekleşen ve açıklanmayı bekleyen bazı olaylar vardır. Bunlardan birkaçını açıklamaya çalışalım.

protected void Application_Start()

{

System.Diagnostics.Debug.WriteLine(“Application_started”);

 

AreaRegistration.RegisterAllAreas();

 

RegisterRoutes(RouteTable.Routes);

}

 

protected void Session_End(object sender, EventArgs e)

{

System.Diagnostics.Debug.WriteLine(“Session_End”);

}

 

protected void Session_Start(object sender, EventArgs e)

{

System.Diagnostics.Debug.WriteLine(“Session_Start”);

}

 

protected void Application_End()

{

System.Diagnostics.Debug.WriteLine(“Application_ended”);

}

 

Application_Start() metodu uygulama ilk çalıştırıldığında tetiklenecektir. Yani uygulamanın ApplicationDomain’i yaratıldığında oluşturulur. Her .Net Process’i default olarak bir tane Application domain’i içerir; bu application domain CLR tarafından işlemin başlatılması ile otomatik olarak yaratılır.

Application_End() metodu uygulama son bulduğunda tetiklenecektir.         Yani uygulamamız ApplicationDomain’den çıkarıldığında çalışacaktır.

Session_Start() metodu uygulamamıza bir istek geldiğinde tetiklenecektir. Daha basit bir anlatımla kullanıcı siteye girdiğinde çalışacaktır.

Session_End() metodunu kullanıcı hareketleriyle yakalamak imkansızdır. Yani kullanıcı siteye girdi ve browser’ı kapattı. Browser kapandığında Session_End metodu çalışmaz. Çünkü browser kapanması sunucuya bir istek göndermeyecek. Dolayısıyla istek olmadığı için cevapta olmayacaktır. Bir session server tarafında varsayılan olarak 20 dakika tutulur. Kullanıcı 20 dakika boyunca hiçbir işlem yapmazssa session otomatik olarak sonlandırılır ve Session_End() metodu çalışır.

Asp.net MVC Handling Unknown Actions

22 Ağu

Bu yazımızda controller sınıfımızdaki action metodları içinde bulunmayan bir action çağrıldığında bu çağrıyı yakalayıp duruma göre kullanıcıya mesaj verme işleminin nasıl yapılacağı konusuna değiniyor olacağız.

Controller sınıfları HandleUnknownAction() adında protected bir metoda sahiptir.

protected virtual void HandleUnknownAction(string actionName);

Bu metod bir action metodu çağrıldığında eğer istenen action bulunamazssa otomatik olarak devreye girer.örneğin browser üzerinden (/Product/olmayanMetod ) şeklinde olmayan bir action çağrıldığında HandleUnknownAction() metodu çalışacaktır.

Normalde olmayanMetod çağrıldığında metod 404 hatası fırlatmalıdır. Ancak biz HandleUnknownAction() metodunu ezerek kullanıcıya düzgün mesaj bildirimleri ile hataları gösterebiliriz. Özel oluşturduğumuz hata sayfasına yönlendirebiliriz.

    [HandleError]

public class HomeController : Controller

{

public ActionResult Index()       {

ViewData[“Message”] = “Welcome to ASP.NET MVC!”;

return View();

}

protected override void HandleUnknownAction(string actionName)

{

ViewData[“actionName”] = actionName;

View(“Unknown”).ExecuteResult(this.ControllerContext);

}

}

 

Upgrading Entity Framework 4.1 RC

22 Ağu

Entity Framework 4.1 RC yayınlandı ve eski sürümlerin bu sürüme yükseltilmesi faydalı olacaktır. Bu sürümde bazı küçük hatalar(bug) da giderilmiştir.

EF 4.1 RC  Upgrade sırasında izlenecek yöntem

  1. NuGet konsola uninstall-package EFCodeFirst yazarak eski paketi kaldırılır.
  2. NuGet konsola install-package EntityFramework yazarak yeni sürümü yüklenir.
  3. Birkaç satır kod ile CTP 5 sürümünden RC sürümüne geçiş sağlanır.

1. Uninstall Entity Framework 4.1 CTP 5

NuGet Package Manager eklentisi yüklü değilse buradan edinebilirsiniz.

  • İlk olarak  NuGet Package Manager Console açılarak yola çıkılır:
  • Package Manager penceresinde açılır listede(dropdown list) doğru projenin seçili olduğundan emin olunur.
  • Konsola uninstall-package EFCodeFirst yazarak ENTER tuşuna basılır.
  • View –> Other Windows –> Package Manager Console

Alternatif bir yöntem ise form arayüz (UI) ile NuGet paketin kaldırılmasıdır. Alternatif yol şu şekildedir.

  1. Projeye sağ tıklayarak Add Library Package Reference seçimi yapılır.
  2. Sol menüden Installed Packages seçilir
  3. Uninstall butonuna basarak EFCodeFirst paketi kaldırılır.

2.  Entity Framework 4.1 RC sürümünün NuGet ile yüklenmesi

EF 4.1 RC kurulumu yükleme dosyasını indirerekte kurulabilir fakat NuGet çok daha basit.

  • İlk olarak NuGet Package Manager Console açılarak başlanır. Konsolu açmak için şu yol izlenir:
  • Package Manager penceresinde açılır listede(dropdown list) doğru projenin seçili olduğundan emin olunur.
  • install-package EntityFramework komutu girilerek ENTER tuşuna basılır.
  • View –> Other Windows –> Package Manager Console

Alternatif bir yöntem ise form arayüz (UI) ile NuGet paketin yüklenmesidir. Alternatif yol şu şekildedir.

  1. Projeye sağ tıklayarak Add Library Package Reference seçilir.
  2. Sol menüden Online seçeneği tıklanır.
  3. Sağ üstteki arama kutusuna EntityFramework yazılır ve paketin listeye gelmesi beklenir.
  4. Paket seçilerek Install butonuna tıklandığında yükleme başlar.

Karşılaşılabilecek sorunlara dair ipuçları

 

İpucu 1

Önceki sürümde veritabanındaki store prosedürler gibi yapıları çağırmak işin kullanılan  SqlCommand komutu ExecuteSqlCommand olarak değiştirilmiş.

//return base.Database.SqlCommand(“DeleteAccounts”);
return base.Database.ExecuteSqlCommand(“DeleteAccounts”);

 

İpucu 2

ModelBuilder nesnesi DbModelBuilder olarak yeniden adlandırılmıştır.

//protected override void OnModelCreating(ModelBuilder modelBuilder)
protected override void OnModelCreating(DbModelBuilder modelBuilder)

 

İpucu 3

MapLeftKey ve MapRightKey extension metodlarının aşırı yüklenmiş metodlarıyla değiştirilmiştir. Aşağıdaki kodda verilen değişikliği inceleyebilirsiniz.

 

//modelBuilder.Entity<WatchList>().HasMany(w => w.Securities)
// .WithMany()
// .Map(map => map.ToTable("WatchListSecurity")
// .MapRightKey(s => s.Id, "SecurityId")
// .MapLeftKey(wl => wl.Id, "WatchListId"));
modelBuilder.Entity<WatchList>().HasMany(w => w.Securities)
       .WithMany()
       .Map(map => map.ToTable("WatchListSecurity")
       .MapRightKey("SecurityId")
       .MapLeftKey("WatchListId"));

Kaynak: http://blogs.msdn.com/b/adonet/archive/2011/07/25/ef-4-1-update-1-released.aspx

Windows Live Hotmail için Outlook 2007 Ayarları

21 Ağu

Microsoft’un Hotmail için POP3 desteği vermesinden sonra Office Outlook ortamından maillere erişip yönetmek mümkün hale geldi. Windows Live hesabı olan arkadaşlar hesaplarına Outlook ortamından erişebilmek için aşağıdaki yöntemi izleyebilirler. Bu ayarları test edip ayarların çalıştığını gördükten sonra paylaşıyorum. Bilgisayarımda yüklü office sürümünün dili ingilizce olduğu için resimlerde ingilizce ayarlar görünüyor olacaktır.

Ayarlar

  1. Outlook penceresinden Araçlar (Tools)Hesap Ayarları (Account Settings) seçilir.
  2. Yeni (New) butonuna tıklayarak Yeni E-posta Hesabı Ekle (Add New E-Mail Account) penceresi açılır. Açılan pencerede “Microsoft Exchange, POP3, IMAP ve HTTP” seçeneği işeretlenerek ilerlenir.
  3. Gelen pencerede alt köşede “Sunucu ayarlarını veya ek sunucu türlerini el ile yapılandır” (Manually configure server settings or additional server types)seçeneği işeretlenerek ilerlenir.
  4. Gelen pencerede “Internet E-Posta” (Internet E-Mail) seçeneğini seçip ilerlenir.
  5. Bu yeni pencerede gerekli bilgilerin girilmesi gerekiyor.

  • Adınız (Your Name): Adınız ve soyadınız ( Bu alan mail gönderdiğinizde gönderdiğiniz kişinin mail kutusunda kimden kısmında yazacak olan bilgidir.)
  • E-Posta Adresi (E-Mail Adress): sample@hotmail.com veya sample@windowslive.com (Windows Live Hotmail adresiniz)
  • Hesap Türü (Account Type): POP3 seçilir.
  • Gelen Posta Sunucusu (Incoming mail server): pop3.live.com
  • Giden Posta Sunucusu (Outgoing mail server SMTP): smtp.live.com
  • Kullanıcı Adı (User Name): genelde mail adresidir. sample@hotmail.com gibi
  • Parola (Password): Mail şifresiniz.
  • Parolamı Anımsa (Remember password): işaretlenir. İşaretlenmezse her Outlook açıldığında size parola soracaktır.
  • Güvenli Parola kimlik doğrulaması kullanarak durum açılsın (Require logon using Secure Password Authentication SPA) işaretlenir.

 

  1. Bilgiler eksiksiz girildikten sonra Diğer Ayarlar (More Options) butonu tıklanarak Internet E-Posta Ayarları (Internet E-Mail Settings) penceresi açılır.
  2. Genel (General) sekmesinde kişisel ayarlar vardır ve isteğe bağlı doldurulabilir.
  3. Giden sunucu (Outgoing server) sekmesinde Giden sunucum (SMTP) için kimlik doğrulaması gerekiyor (My outgoing server (SMTP) requires authentication) seçeneği işeretlenir.
  4. Bağlantı (Connection) sekmesinde bir değişiklik yapmaya gerek yok.
  5. Gelişmiş (Advenced) sekmesinde  Gelen sunucu (POP3) (Incoming Server POP3) port değeri 995 olarak girilir. Bu sunucu şifreli bir bağlantı gerektirir (This server requires an encrypted connection SSL) Kutucuğu işaretlenir. Giden sunucu SMTP (Outgoing server SMTP) port değeri olarak 587 girilir. Aşağıdaki şifreli bağlantı türünü kullan (Use The following type of encrypted connection) listesinden TLS seçilir. Ardından Tamam butonuna tıklanır.
  6. Artık bütün ayarlar yapılmış durumda ve Hesap ayarlarını sına (Test Account Settings) Butonuna tıklayarak testin başarılı bir şekilde gerçekleşmesi beklenir.

Sonraki pencerede Son (Finish) butonu tıklanarak mail adresindeki verilerin indirilmesi işlemi başlar.

Bir sonraki yazıda görüşmek üzere.

Asp.net MVC ActionName Attribute

21 Ağu

ActionName attribute bir action metodunun farklı isimlerle adlandırılmasını sağlar. Bu işlem iki farklı yolla yapılır.

Birinci yöntem olarak overload edilmiş, yani aynı isimdeki iki metodu birbirinden ayırmak için kullanabiliriz. Örneğin Product controller Details() adında iki metoda sahip olsun. İlk Details() metodu integer tipinde id parametresi alıyor olsun. İkinci Details() metodu parametre almasın. Bu durumda iki metodu birbirinden ayırmak için ActionName attribute kullanılabilir.

İkinci yöntem olarak ise farklı isimdeki metodları aynı isimle çağırmak isteyebiliriz. Yani ilk yöntemin tam tersi bir durum olabilir.


[ActionName(“Edit”)]
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Edit_GET(Merchandise merchandiseToEdit)
{
     return View(merchandiseToEdit);
}

// POST: /Merchandise/Edit

[ActionName(“Edit”)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit_POST(Merchandise merchandiseToEdit)
{
     try {
           return RedirectToAction(“Edit”);
         }
     catch
         {
           return View();
         }
}

Dikkat: Bir sınıf içinde aynı isimde ve aynı parametreyi alan iki metod bulunamaz. Ancak aynı isimde ve aynı parametre alan iki action olabilir.

Örnekte gördüğümüz gibi iki Edit() metodundan biri HTTP GET operasyonu, diğeri ise HTTP POST operasyonu tarafından çağrılıyor.