Merhaba arkadaşlar;
Bu bölümde sizlere asenkron chat işlemleri nasıl olur. Aspçnet de cache üzerinde nasıl çalışırız verileri nasıl cache üzerinde insert ederiz obları anlatmaya çalışıcam.
İlk önce kısaca senaryodan bahsedeceğim;
Client chat sayfamıza gelir ve login girişi yapar. Sessionda timeout a hemen uğramaması için şifreleyip cookie de tuttuyoruz değerleri.
Daha sonra chat sayfamıza düşer. Sağ tarafsa kullanıcılar listelenir sol taraftada chat alanı. Burada işlemler Jquery sayesinde timer ile sürekli veri çekilir.Önemli olan kısım ise şudur. Timer sadece cache üzerindeki verileri çeker her 10 dk da bi cache üzerinde tutulan chat verileri Veritabanına aktarılır. Hiç bir şekilde veri tabanına uğramaz sadece veritabanına kayıt yapmamızın amacı geçmişi tutmazmız. Cache server taraflı oldugundan süresiniz sınırsız verirseniz eğer taa ki Application Pool ne zaman restart oldu ozaman silinir cache yada siz sildirirsiniz belli aralıklarda. Tekrar dan altını çizerek söylüyorum
veritabanından veri okuyup yazmıyoruz
cache üzerinden gerçekletiriyoruz tüm işlemlerimizi.
Öncelikler veri tabanımızı oluşturuyoruz.
Daha sonra projemize modelimizi ekliyoruz.
2 tane class sımız bulunmakta ben fazla uzatmamak için kütüphaneye değil AppCode altına koydum
1-
CacheProperties.cs --> Kendi çapımda oluşturmuş oldugum Cache inser/delete/status metot ları var
2-
Chat.cs --> Chat ile ilgili Select/İnsert metot larımız bulunmakta.
Chat.cs
properties
public class Chat
{
public static string CacheName = "Chat";
public string UserName { get; set; }
public int MyUserID { get; set; }
public int UserID { get; set; }
public string Message { get; set; }
public DateTime Created { get; set; }
}
public class ChatBusiness
{
public static IEnumerable ChatList()
{
IEnumerable Data;
List chatList = new List();
//Eğer Cache Boş Değilse Cache Den Getir
if (CacheProperties.CacheStatus(Chat.CacheName) != false)
{
//Cache deki datayı Okur
Data = HttpContext.Current.Cache[Chat.CacheName] as IEnumerable;
//HttpContext.Current.Response.Write("Cacheden Geldi");
}
//Eğer Cache Boş İse Data Yı Veritabanından doldur
else
{
CacheChat_Entities mdl = new CacheChat_Entities();
foreach (var item in mdl.tbl_Chat)
{
Chat chat = new Chat();
chat.UserID = item.UserID.Value;
chat.MyUserID = item.MyUserID.Value;
chat.UserName = item.tbl_Users.UserName;
chat.Message = item.Message;
chat.Created = item.Created.Value;
chatList.Add(chat);
}
//Datayı Doldurup Geri Döndürür
Data = chatList.ToList();
//Data = chatList.ToList();
//Datayı Cache'ler
CacheProperties.CacheInsert(Chat.CacheName, Data);
//Response.Write("Datadan Geldi");
}
return Data;
}
public static void InsertMessage(string Mesaj,int UserID,int MyUserID,string UserName)
{
List chatList = new List();
chatList = HttpContext.Current.Cache[Chat.CacheName] as List;
Chat chat = new Chat();
chat.UserID = UserID;
chat.MyUserID = MyUserID;
chat.UserName = UserName;
chat.Message = Mesaj;
chat.Created = DateTime.Now;
chatList.Add(chat);
}
}
Class larımız bukadar şimdi gelelim Generic Handler larımıza
3 Tane handler ımız bulunmaktadır
1-
Add.ashx --> Yeni mesaj eklemek için
2-
CachetoDb.ashx --> Her 10 dk da bir Cache in veritabbanına aktarılmasıı için
3-
Mesajlar.ashx --> Mesajları getirir
Sonuç yukarıdaki gibidir. :) Dosyaların kod kısımlarındada bol bol açıklamalar yazdım.Çok fazla uğraşmadım ama isterseniz dahada geliştirbilirsiniz. Her hangi bir sorunuz olursa istediğiniz gibi sorabilirsiniz.
Not : Test ederken login girişleri olarak veri tabanındaki users tablosuna 3 kayıt eklemiştim onları kullanabilirsiniz.Rar içersinde Db scriptinide paylaşıyorum
Hepinize kolay gelsin
CacheChat
Hasan Akpürüm7/2/2015 12:40:43 AM
Makale örnek projedir. Chat sistemlerini signalr ya da nodejs i araştırarak yapabilirsiniz. En stabil yöntem o olacaktır.
Yasin 7/2/2015 12:33:16 AM
Abi ben bunu kendi projeme eklicem ama ben 2 kişinin kendi arasında konuşmasını ve sağda listem var oda online olanlara tıklayınca bu mesajlaşma olayının olmasını istiyorum .