pillinetwork hesabınızla giriş yapın.

Generic Handler WebService ve jQuery

HttpHandler Webserice ile jQuery Kullanmak

Bu yazıda ASP.net webService kullanmak yerine bize xml olarak çıktı vermeyen Generic Handler ile jQuery'i nasıl konuştururuzun cevabını alacağız. Ajax yöntemi ile mail gönderen bir uygulamayı anlatacağım.

Bunun için öncelikle gerekli servis parametrelerini kontrol edebilmek için bir BaseService sınıfı oluşturmalıyız. Bu sınıfın 3 methodu var ParametersControl, GetParameter ve dışarıya çıtkı verebilmemiz için OutResponse methodları

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//işlem için bir command parametresi var mı yok mu
public void ParametersControl()
{
if (string.IsNullOrEmpty(this.Context.Request.QueryString["command"]) && string.IsNullOrEmpty(this.Context.Request.Form["command"]))
{
this.Out = "Parameter Expcetion";
this.OutRepsonse();
}
if (!string.IsNullOrEmpty(this.Context.Request.QueryString["command"]))
{
this.Command = this.Context.Request.QueryString["command"];
}
if (!string.IsNullOrEmpty(this.Context.Request.Form["command"]))
{
this.Command = this.Context.Request.Form["command"];
}
}

Burada servisi tetiklerken bir komut parametresi bekliyoruz eğer gönderilmezse yanıt olarak Parametre hatası veriyor.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//Parametre okuyucu
public string GetParameter(string parameter)
{
//Eğer parametre okurken bir hata göndermesini istiyorsanı bu değişkeni kullanabilirsiniz.
//Şuan methodda okunmak istenen parametre bulunamazsa string.Empty olarak geri dönüyor.
bool fail = false;
if (string.IsNullOrEmpty(this.Context.Request.QueryString[parameter]))
{
fail = true;
}
else
{
return this.Context.Request.QueryString[parameter];
}
if (string.IsNullOrEmpty(this.Context.Request.Form[parameter]))
{
fail = true;
}
else
{
return this.Context.Request.Form[parameter];
}
return string.Empty;
}

Kullanacağımız Handler'da artık base.GetParameter("email") diyerek parametre hangi methodla gelirse gelsin okuyor olabileceğiz. Son olarakta servis sonucu çıkarabilmemiz için OutResponse'u yazmamız gerekiyor

1
2
3
4
5
6
public void OutRepsonse()
{
this.Context.Response.ContentType = "text/plain";
this.Context.Response.Write(this.Out);
this.Context.Response.End();
}

Bu sınıfın tamamına bu adresten ulaşabilirsiniz. Projenize eklemeniz yeterlidir.

\
İşin en basit kısmını hallettik sırada Generic Handler(ashx) dosyamızı oluşturmak var. Bu Handler daha once yazdığımız BaseService'ten miras almak zorunda Bunun için sınıfın tanımı aşağıda ki gibi olmalıdır.

1
2
3
4
5
6
public class Contact : BaseService, IHttpHandler
{
.
.
.
}

Handlera istek yapıldığında çağırılan method ProcessRequest'tir. Bu .aspx dosyalarında ki Page_Load gibidir. Bizim yapmamız gereken işlemimizi gerçekleştireceğimiz kodları bu method içerisine yazmamızdır.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public void ProcessRequest(HttpContext context)
{
//baseService sınıfımızın atamalarını gerçekleştirelim
base.Context = context;
base.ParametersControl();
//parametrelerde bir problem var mı kontrolü
bool fail = false;
if (base.Command == "send")
{
#region Special Parameter Control
if (string.IsNullOrEmpty(base.GetParameter("name")))
{
fail = true;
}
if (string.IsNullOrEmpty(base.GetParameter("mail")))
{
fail = true;
}
if (string.IsNullOrEmpty(base.GetParameter("content")))
{
fail = true;
}
#endregion
if (!fail) //parametrelerde bir sorun yoksa
{
string mailFormat = string.Format("{0} ({1}) {2}", base.GetParameter("name"), base.GetParameter("mail"), base.GetParameter("content"));
//mail gönderme işlemlerinizi burada yapabilirsiniz.
Mail.SendEmail(Settings.Read("GMAIL_ACC"), Settings.Read("GMAIL_PASS"), Settings.Read("CONTACT_MAIL"), Settings.Read("MAIL_TITLE"), mailFormat, System.Web.Mail.MailFormat.Text, string.Empty);
this.Out = "OK";
}
else
this.Out = "FALSE";
}
base.OutRepsonse();
}

\

C# ile ilgili yazmamız gerekenler bu kadar. Biraz karışık gözüküyor olabilir ama bir iki denemeden sonra aslında işin mantığının ne kadar basit olduğunu kendinizde görebilirsiniz.

Bu yöntem ile isterseniz bir php sayfası hatta sıradan bir HTML'den bile mail gönderme işlemi yapabilirsiniz. Yapmanız gereken 3 input textbox birde submit butonu.

jQuery ile yapmamız gerekenler ise çok basit;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$(document).ready(function() {
/* Objects */
var btnSend = $("#btnSend");
/* Events */
btnSend.click(function() {
//işlem bitene kadar bir daha düğmeye basılmasın
btnSend.unbind("click");
sendMail();
});
/* Functions */
var sendMail = function() {
$.ajax({
url: '/api/contact.ashx',
data: "command=send&name=" + name.val() + "&content=" + content.val() + "&mail=" + mail.val(),
cache: false,
dataType: "text",
success: function(result) {
if (result == "OK") {
alert('Mesajınız gönderilmiştir.');
}
else {
alert('Lütfen bütün alanları doldurun');
}
btnSend.bind("click", sendMail);
}
});
}
});

Örnek uygulama için tıklayın, İlk defa bir makale için bu kadar uğraştım umarım anlattığıma değmiş size faydalı bir yazı olmuştur.

Spacer
Spacer
/* Frosten yazdı. 26 Eylül 2009 12:17. 5 yorum var */

Yorumlar

hocam güzel örnek baya baya uzun o yüzden karışıyor. bir çok yerde stringleri null mu diye kontrol etmişsin tam anlamadım oraları. generic handler olamadan da yapabiliriz sanırım önemli olan ajax isteğini göndermek ve karşıda karşılamak tabi handler daha profesyonel olur.

Selamlar

mantık gayet güzel ve geliştirilmeye açık. uğraştığına deymiş..

/* ses y0k! */

olum neden tekniklerimizi anlatiyorsun millete zaten stringleri null yapmissin kafam karisti :D

aslında o method da kısalabilir paremetreleri bir dizi gibi kontrolden geçirilebilir.
neden isnullorempty kullanıyorum çünkü parametre null gelebilir yani hiç atanmamış bir obje olabilir bu yüzden string.isnullorempty kullanıyorum.

yöntemleri gösteriyorum çünkü yazılıma yeni başlayan arkadaşlar için bir fikir oluşması bodoslama tabir ettiğimiz kod yazma stilini kullanmamaları için. bundan çok rahatsız oluyorum. ayrıca son eklenen resimde proje yapısının bir örneğide var katmanlara nasıl ayrılır neden class libraryler oluşturulur bilinmesi gereken konular.

her türlü havamı attım diyorsun normal methodlardan yoksun bir çok arkadımız temelden konun özünü bilemedikleri için hızlı ve anlaşılması zor bir yazı olmuş

üye olunpillinetwork sitelerine yorum ekleyebilmek ve daha fazlası için, üye olun ya da giriş yapın.

Bu yazıyı rapor et. Kural dışı içeriğe rastladığınızda editörlerimize rapor ederek müdahale edilmesini sağlayabilirsiniz. (Hangi durumlarda rapor edebilirim?)

Bu site

Nokta ve pilli ortak yapımı olan kodaman.org hep birlikte içerik üretip gelirini yazarları ile paylaştığımız kolektif bir kod yazarları blogudur. Siz de katılabilirsiniz.

pilliilan

son yorumlar

arama

pillinetwork