Sayfalar

13 Eylül 2010 Pazartesi

AJAX: Web Uygulamalarında Yeni Yaklaşım

Web uygulamalarında var olan olumsuz taraflar günden güne yokolup bunların yerlerini yeni yaklaşımlar alıyor. Masaüstü uygulama yazanlar web uygulama yazanlara göre çok daha fazla zenginliğe sahiptirler. Bu fark web geliştiricilerin sağladığı deneyimler ile masaüstü uygulamalarını kullanan kullanıcıların arasında bir boşluk yarattı. Fakat bu boşluk gitgide kapanıyor. Örneğin Google Suggest siz arama textbox'ına girdiğiniz karakterelere göre, size neredeyse aynı anda size önerdiği terimler, güncelleniyor. Ya da Google Maps. Haritayı daha da yaklaştırdığınızda, farenin imlecini oynatın yada haritayı tutup sağa sola oynatın. Sanki her şey bir anda gerçekleşmiş gibi değil mi? Hem de sayfa tekrar yüklenmeden. Aslında bunların hepsi sunucu tarafında oluyor. Aynı anda oluyor zannetmeniz sadece gerekli metotların sunucu tarafından işlenmesi sayesindedir.

Google Suggest ve Google Maps gibi bu yeni web uygulamarındaki yaklaşımın iki örneğin kullandığı uygulamaya Ajax adı verilir. Asenkron olarak JavaScript + XML'i kullanır. Bu web ortamında yapılabileceklerin temel değişikliklerini temsil eder.

Ajax'ı Tanımlayalım

Ajax bir teknoloji değildir. Bir kaç teknolojiyi içinde barındırır. Her birinin yeniliklerini ve gelişmelerini birlikte kullanıp yeni ve güçlü bir yol yaratır. Ajax şunları barındırır.

•XHTML ve CSS'i kullanarak standart web temelini sunar.

•Dinamik gösterim ve Document Object Modeli (DOM) u kullanarak dinamik etkileşim.

•XMLHttpRequest'i kullanarak asenkron (eş zamanlı olmayan) veriyi tekrar alır.

•ve JavaScript her şeyi bind edebilir.

Klasik web uygulamaları şu şekilde çalışır: Kullanıcıların çoğu uygulamanın ara yüzünde bir olayın olmasını sağlayarak web sunucusuna bir HTTPRequest gönderir. Sunucu bazı işlemler yapar (data alır, çeşitli sistemlerle etkileşime girer...) ve istemcinin sayfasına HTML döndürür.



Klasik Web uygulaması modelinde, sunucu kendine ait işlemler yaparken kullanıcının yaptığı tek şey beklemek oluyor. Uygulamayı kullanırken attığı her adımda bekliyor. Aslında eğer web'i web uygulamaları için en başından inşa etseydik , kullanıcıları bekletmezdik. Öncelikle bir ara yüz yüklenir daha sonra kullanıcı uygulama ile etkileşime girer ve ihtiyacı olan şeyleri sunucudan alır. Peki neden kullanıcı uygulamanın sunucuya gitmesini seyretmek zorunda?

Ajak'ın Farklı Yönleri

Bir Ajax uygulaması kullanıcı ve sunucu arasında bir Ajax Motoru kullanarak Web üzerinde sunucu-istemci arasında sürekli gidip gelmesini ortadan kaldırır. Bir web sayfasını açtığınızda bir oturum açarsanız bu sırada bir web sayfası yüklenir. İşte bu yüklenen web sayfası JavaScript ile yazılmış ve gizli bir frame içine yerleştirilmiş Ajax Motorunu yükler.Ajax motoru sunucu ile iletişimi bağımsızdır. Böylece kullanıcı asla boş browser penceresine ve kum saati ikonuna bakmaz. Sunucunun gerekli işlemleri yapmasını bekler.



Bu yeni web yaklaşımında her bir kullanıcının yarattığı olay normal olarak HTTP isteği yaratır ve bu isteği Ajax motoru olarak adlandırılan JavaScript'den alır. Kullanıcının yarattığı herhangi bir isteğin cevabı için -basit veri geçerliliği, hafızadaki veriyi düzenlemek- sunucuya gitmesi gerekmez. Eğer Ajax motoru herhangi bir cevap için sunucuya ihtiyaç duyarsa- herhangi bir verinin işlenmesi, ek kullanıcı ara yüz kodlarının yüklenmesi, yeni verinin alınması gibi- Ajax motoru tüm bu istekleri asenkron biçimde, genellikle XML kullanarak, kullanıcının uygulama ile etkileşiminde herhangi bir gecikme olmaksızın yerine getirir.

Kimler Kullanıyor

Google Ajax yaklaşımının gelişmesi için büyük yatırımlar yaptı. Google'ın geçen yıl tanıttığı önemli ürünlerin hepsi, Orkut,Gmail, Google Groups, Google Suggest ve Google Maps, ajax yaklaşımı kullanılarak geliştirilmiştir. Diğerler örnekler ise; Fickr Ajax tabanlıdır ve Amazon'un A9.com arama motoru da aynı teknik kullanılarak yazılmıştır.

Yukarıda bahsettiğimiz örnekler Ajax'ın sadece teknik bir terim olmadığını aynı zamanda gerçek hayata (real-world) uygun uygulamalar için de pratik olduğunu gösterir. Ajax uygulamalarını buyüklüğü değişen her tür uygulamada; Google Suggest gibi basit bir uygulamdan Google Maps gibi karışık bir uygulamaya kadar kullanabilirsiniz.

Basit bir Ajax örneği yapalım. bu örnekte ajax kullanmak için sayfa ve web.config ayarlarının nasıl olması gerektiğini ve nasıl çalıştığını basit bir şekilde bulabilirsiniz.

HttpHandler kurulumu

HttpHandler'ın nasıl çalıştığı hakkında detaylı bilgi vermeden ASP.NET isteklerini nasıl karşıladığını örnekle anlatalım. Örneğin; *.aspx sayfaları için tüm istekler (request) System.Web.UI.PageHandlerFactory sınıfı tarafından kontrol edilip yönetilir. Benzer şekilde bizde web.config sayfasında yapacağımız ekleme ile ajax/*.ashx'a yapılan istekler Ajax.PageHandlerFactory sınıfı ile kontrol edilecektir.

<httpHandlers>

<add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax"
/>

</httpHandlers>


Yukarıdaki kod parçası Ajax.PageHandlerFactory sınıfı tarafından ele alınan (ajax/*.ashx) ile belirtilmiş path'i,varsayılan handler factory yerine,herhangi bir request ile illişkilendirir. Bunun için herhangi bir ajax dizini yaratmanıza gerek yoktur. Bu, Diğer HttpHandler sınıfları .ashx eklentilerini kendi alt dizinleri ile kullanılabilsin diye söylencesel(mythical) basit bir dizindir.

Sayfa Ayarları

Artık kod yazmaya hazırız.Bunun için yeni bir sayfa yaratın veya varolan bir sayfayı codebehind'da açın. Aşağıdaki kodu codebehind'a ekleyin.



public class Sample : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
Ajax.Utility.RegisterTypeForAjax(typeof(Sample));
}


İstemci taraflı çağrıda eş zamanlı olmayacak bir şekilde sunucu taraflı bir fonksiyon oluşturalım. Code behind'da aşağıdaki fonksiyonu yazalım.



[Ajax.AjaxMethod()]
public string HelloServerSide(string Name, string Surname)
{
return "Merhaba! "+ Name + " " +Surname;
}


Bu fonksiyon Ajax.AjaxMethod özelliğine sahiptir. Bu özellik, istemci tarafından bu tür metotların çağrılabilmesi için JavaScript vekaletleri yaratmak için kullanılır.

En son adımda, istemci tarafında JavaScript kullanılarak sunucu tarafında kullanacağımız metodu yazacağız.

<body>

<form id="Form1" method="post" runat="server">

<script language="javascript">

function HelloClientSide(result)

{

if(result.error != null)

{

alert(result.error);

return;

}

document.getElementById("hello").innerHTML = result.value;

}

</script>


Adı:<asp:TextBox id="txtname" runat="server"></asp:TextBox>

Soyadı:<asp:TextBox id="txtsurname" runat="server"></asp:TextBox>

<input type="button" id="submit" value="ClientSubmit"
onclick="Sample.HelloServerSide(txtname.value,txtsurname.value,HelloClientSide)
">

<asp:Button id="Button1" runat="server" Text="ServerSubmit"></asp:Button>

</form>

Client Side Result: <span id="hello" style="COLOR: #993300;
FONT-FAMILY: Tahoma"></span><br>

Server Side Result:

<asp:Label id="lblserverside" runat="server" style="COLOR:
#993300; FONT-FAMILY: Tahoma"></asp:Label>

</body>

Yukarıda yazdığım kodun design tarafında görüntüsü şu şekildededir.



Burada iki tane TextBox kontrolü ve 2 tane'de Button vardır. Bu butonlardan ClientSubmit butonu sunucu taraflı çalışmayacak, diğeri ise sunucu tarafında çalışacak şekilde tasarlanmıştır. OnClick() olayı gerçekleştirildiği zaman sunucu tarafında Sample.HelloServerSide metodu çağrılacaktır ve HelloClientSide JavaScript fonksiyonuna "result" değişkenini döndürecektir. TextBox'lara değerler girip ClientSubmit() butonuna tıkladığı zaman sadece çalışması gereken metot çalışacak ve geriye Merhaba! yazısı ile birlikte TextBox kontrollerine yazdığınız değerler dönecektir. Yani tüm sayfadaki herşey sunucuya gidip gelmez, sadece gerekli kontroller ve metotlar çalışır. Böylece sunucu gereksiz yere çalışmaz. Sizde ServerSide ve ClientSide butonunu tıklayarak işlemlerin nasıl gerçekleştiğini daha iyi anlayabilirsiniz. Aşağıda bu uygulama ile ilgili örnek kod verilmiştir. Uygulama içindeki bin dizininde yer alan Ajax.dll'i de bulunmaktadır. Eğer Ajax'ı web uygulamasında kullanacaksanız bu dll'i projenize eklemeyi unutmayın.

CLng() Fonksiyonu

CLng(Sayı)


CLng fonksiyonu girilen sayı değerini Long değerine dönüştürür.

Girilen sayıların aralığının -2,147,483,648 ve 2,147,483,647 olması gereklidir.

Code:

<% orneksayi=1234.5 %>

<% =CLng(orneksayi) %>

Çıktı:

1234.5

CInt() Fonksiyonu

CInt(Sayı)


CInt fonksiyonu herhangi bir sayı değerini integer yapar.

Döüştürme değerleri -32,768 ve 32,767 arasındadır. Girilen sayı yuvarlanır.

Örnek Kod:

<% orneksayi=1234.567 %>

<% =CInt(orneksayi) %>

Çıktı:

1235

Chr() Fonksiyonu

Chr(ANSIdeğeri)


Chr fonksiyonu verilen ANSI karakter kodu değerini karaktere çevirir.

Örnek Kod:

<% =Chr(98) %>

Çıktı:

b

CDbl() Fonksiyonu

CDbl(Sayı)


CDbl fonksiyonu geçerli değişkeni Double olarak tanımlamamıza yarar.

Dönüştürülen değerlerin aralığı :

Negatif değerler için -1.79769313486232E308 to -4.94065645841247E-324 ve pozitif değerler için 4.94065645841247E-324 to 1.79769313486232E308.

Örnek Kod:

<% orneksayi=1234.5 %>

<% =CDbl(orneksayi) %>

Çıktı:

1234.5

CDate() Fonksiyonu

CDate(Gün)


CDate fonksiyonu geçerli herhangi bir tarih veya saat formatını Date yani gün değişkeni olarak tanımlamamıza yarar.

Geçerli olan tarih formatı çoğunlukla şu şekildedir : **/**/** ve geçerli saat formatı : **:**:** *M .

Ayrıca kabul edilen tarih aralığı da 1 ocak 100 ile 31 Aralık 9999'dur.

Örnek Kod:

<% ornekgun = "Ocak 26, 1943" %>

<% =CDate(ornekgun) %>

Çıktı:

6/26/43

Örnek Kod:

<% ornekgun = #6/26/43# %>

<% =CDate(ornekgun) %>

Çıktı:

6/26/43

Örnek Kod:

<% orneksaat="2:23:59 PM" %>

<% =CDate(orneksaat) %>

Çıktı:

2:23:59 PM

CCur() Fonksiyonu

CCur(Sayı)


CCur fonksiyonu girilen herhangi bir sayi değerini Currency yani para birimine dönüştürmeye yarar.

Yapılabilecek sayi aralığı ise :

-922,337,203,685,477.5808 to 922,337,203,685,477.5807

Örnek Kod:

<% orneksayi=(12345) %>

<% =CCur(orneksayi) %>

Çıktı:

12345

Bu fonksiyon 4 desimal değere yuvarlama yapar.

Örnek Kod:

<% orneksayi=(55555.123456) %>

<% =CCur(orneksayi) %>

Çıktı:

55555.1235

CByte(Sayı)

CByte fonksiyonu 0 ile 255 arasında herhangi bir sayıyı byte değişkenine dönüştürür.


Örnek Kod:

<% orneksayi=(9.876) %>

<% =CByte(orneksayi) %>

Çıktı:

10

Örnek Kod:

<% orneksayi=(255) %>

<% =CByte(orneksayi) %>

Çıktı:

255

CBool() Fonksiyonu

CBool(Sayı)


CBool fonksiyonu girilen sayıyı boolean değişkenine dönüştürmeye yarar.

Boolean değişkeni için çıktı iki şekilde olmaktadır: "True" veya "False". Eğer dönüşüm başarılı ise "true", hatalı ise "False" veya bir hata mesajı çıkacaktır.

Örnek Kod:

<% sayi=7.77 %>

<% =CBool(sayi) %>

Çıktı:

True

Örnek Kod:

<% sayidegil=abc %>

<% =CBool(sayidegil) %>

Çıktı:

False

Atn() Fonksiyonu

Atn(Sayı)


Atn fonksiyonu verilen sayısının arc-tanjantını bulmaya yarar.

Örnek Kod:

Çıktı:

1.54857776146818

Ayrıca negatif sayılarda kullanabilirsiniz.

Örnek Kod:

Çıktı:

-1.54857776146818

Asc() Fonksiyonu

Asc(String)

Asc bir string ifadenin ilk karakterinin ANSI karakter kodunu vermektedir.

Aşağıdaki iki örnekte görüldüğü gibi sadece ilk karaktere bakılmaktadır.

Örnek Kod:

<% =Asc("abcde fghij klmno pqrst uvwxyz") %>

Çıktı:

97

Örnek Kod:

<% =Asc("a") %>

Çıktı:

97

Array() Fonksiyonu

Array(Liste)

Array fonksiyonu tek boyutlu statik dizi(array) yaratmaya yarar. Array Fonksiyonunu kullanarak dinamik dizi tanımlayamazsınız.

Unutmayın ki; dizinin ilk elemanı her zaman sıfır("0") olarak tanımlanmalıdır. Örneğin ; deneme(0)

List terimi dizinin elemanı olacak değerleri listelemeye yarar.

Örnek Kod:
Çıktı:
A
B
C
D

Örnek Kod:

Çıktı:
111
222
333
444
555

Dinamik yapıda bir dizi Dim ve ReDim fonksiyonlarının kullanımı ile olabilir. Öncelikle dinamik diziyi tanımlamak için Dim fonksiyonunu boş parantezler kullanarak çağırmanız gerekir. Ardından programın herhangi bir noktasında ReDim fonksiyonunu çağırarak eleman sayısını tanımlarsınız. Ayrıca istediğiniz zaman dinamik dizinizi tekrardan tanımlayabilirsiniz.

Örnek Kod:
Diziler 60 boyuta kadar desteklenmektedir. Eğer çok boyutlu bir dizi tanımlamak istiyorsanız, yine Dim tanımını kullanmalısınız.
Örneğin aşağıda bulunan dizi 3 boyutludur. ılk elemanın 23, ikincinin 15 ve üçüncünün 201 elemanı bulunmaktadır. Sonuç olarak, bu dizide toplamda 23x15x201 = 69345 eleman bulunmantadır

Yarattacağınız boyut sayısı mevcut olan bellek ile sınırlıdır.Eğer varolan bellek değerini aşarsanız bir hata mesajı alırsınız.

Örnek Kod:

Abs() Fonksiyonu

Abs(Sayı)

Abs fonksiyonu verilen sayının mutlak değerini bulmamıza yarar.

Negatif sayılar pozitif olur, pozitif sayılar ise değişmeden pozitif olarak kalır.

Örnek Kod:
<% =Abs(-127.89) %>

Çıktı:
127.89

Örnek Kod:
<% =Abs(127.89) %>

Çıktı:
127.89

ASP ile Neler Yapabilirsiniz

Asp’nin avantajlarıdan ve çalışma mantığından bir önceki konuda söz ettim. Bu avantajlar göz önüne alındığında elelktronik ticaret için en kullanışlı dil olma avantajı vardır. Çünkü güvenlik bu tür uygulamalarda çok önemlidir ve Asp de bize bu güvenliği sağlamaktadır. Diğer avantajı ise çok kolay bir dil olmasıdır. Gerçekten bir perl ile program geliştirebilecek kişi sayısı sınırlıdır ama Asp’yi biraz programlama bilgisi olan herkes çözebilir ve çok kısa zamanda iyi işler ortaya koyabilir.
Asp ile veritabanına bağlanıp gelen verilerden faydalanarak sayfalar üretebilirsiniz. Bunun için SQL, Access veya Oracle kullanabilirsiniz. ODBC bağlantısı yapabileceğiniz tüm veritabanlarına Asp kullanarak erişebilirsiniz.

Asp ile her şeyin başında dinamik sayfalar hazırlayabilirsiniz. Böylece her kullanıcıya farklı bir sayfa gösterebilirsiniz. Html ile bunu ypamanız imkansızdır ancak farklı sayfalar yaparak bu sorunu çözebilirsiniz. Bu da zamandan ve yerden büyük kayıp demektir.

Asp kullanarak elinizdeki bilgiyi kolayca diğer insanların kullanımına açabilirsiniz. Sizde bulunan bir uygulama programını Asp ile entegre çalıştırabilirsiniz. Bu da sizin B2B ve B2C uygulamalar geliştirmenizi sağlar.

28 Ağustos 2010 Cumartesi

This Operatorü

Javascript' te this operatörü bütün OOP detekleyen dillere olduğu gibi oldukça faydalıdır. This operatörünü kullanarak belirli bir nesne için değil, sonsuz nesne için işlem yapan fonksiyonlar yazabilir, hatta nesnenin tipine, ait olduğu forma vb. göre ayrı işlemler yaptırabiliriz.
Örneğin bir e-ticaret uygulamasında ürünlerin listelendiği, her ürün için adet alanı bırakıp, kullanıcının adet alanına 0-255 arası bir sayı girdiği ürünleri sepete ekleyecek, her ürün için adet alanına nümerik olmayan veya 0-255 aralığının dışında bir değer girildiğinde kullanıcıyı uyaracak bir sayfa yapalım.

Örneğimizde ürün bilgileri "urunler.mdb" dosyasında durmaktadır. Bütün işlemler "index.asp" dosyasında gerçekleşmektedir.

index.asp


<%@ LANGUAGE="VBSCRIPT"%>

<%

dim constr

constr="provider=microsoft.jet.oledb.4.0;data source=" &
server.MapPath("urunler.mdb")

dim con

dim rst

dim sql

set con=server.createobject("adodb.connection")

set rst=server.createobject("adodb.recordset")

con.open constr

%>

<html>

<head>

<SCRIPT LANGUAGE="javascript">

<!--

function check(txt)

{

if(isNaN(txt.value)||txt.value>255||txt.value<0)

{

alert("Lütfen 0-255 arası bir sayı giriniz!");

txt.value="0";

setFcs(txt);

}

}

function setFcs(txt)

{

txt.focus();

txt.select();

}

//-->

</SCRIPT>

</head>

<body>

<%

sql="select kod,ad,aciklama,fiyat from urunler"

rst.open sql,con

if not rst.EOF then

%>

<table>

<form action="sepet.asp" method="get" name="frm">

<%

while not rst.EOF

%>

<tr>

<td><%=rst.Fields("ad").Value%></td>

</tr>

<tr>

<td><%=rst.Fields("aciklama").Value%></td>

</tr>

<tr>

<td>Fiyat : <%=rst.Fields("fiyat").Value%>$</td>

</tr>

<tr>

<td>Adet : <input type="text" name="adet<%=rst.Fields("kod").Value%>"
value="0" onkeyup="check(this);" onclick="setFcs(this);"></td>

</tr>

<tr>

<td>&nbsp;</td>

</tr>

<%

rst.MoveNext

wend

%>

<tr>

<td><input type="submit" value="Sepete Ekle"
name="submit">

</td>

</tr>

</form>

<%

else

%>

Ürün bulunamadı

<%

end if

%>

</table>

</body>

</html>

<%

set rst=nothing

set con=nothing

%>

Javascript - ASP Etkileşimi

Javascript kullanırken "src=xxx.js" parametresini kullanarak birden fazla sayfada kullandığımız javascript fonksiyonlarını tek bir dosyada toplayabiliriz. Ancak bu statik bir çözümdür ve birçok sayfada dinamik bilgilere ihtiyaç duyarız.

Bu yüzden işin içine Asp ' yi katarak database de dahil olmak üzere tüm server-side teknolojileri kullanarak çok daha esnek javascript uygulamaları yazabiliriz.

Örneğin havadurumu bilgilerini içeren bir siteniz var (havadurumu.com) ve başka sitelerin de bu bilgileri kullanabilmesini istiyorsunuz. Bunun için bir web servisi yaratabilir ve xml aracılığıyla bilgi alışverişi yapabilirsiniz. Ancak bu tip basit uygulamalarda Asp & Javascript kullanarak oldukça kolay çözümler üretmek daha mantıklıdır.

Örneğin bir müşteriniz sizin hava durumu bilgilerinizin belli bir ücret karşılığında kendi sitesinde de olmasını istiyor. Bu işi müşterinizin sayfasında hiçbir asp kodu olmadan ( connection string' i vermek istemezsiniz :))) halledebilirsiniz. Yani Asp destekleyen bir sunucuda olması gerekmez. Çünkü müşterinin sayfasındaki kod tamamen client-side çalışır.

Örneğimizde hava durumu bilgileri "hava.mdb" dosyasında durmaktadır. "Hava.asp" dosyası db' den havadurumu bilgilerini çekip response.write ile javascript ile kullanabileceğimiz client-side değişkenlere atar. "index.html" sayfasında da bu bilgileri document.write metoduyla sayfada istediğimiz yere yazdırabiliriz.


<%@ LANGUAGE="VBSCRIPT"%>

<%

dim constr

constr="provider=microsoft.jet.oledb.4.0;data source=" &
server.MapPath("hava.mdb")

dim con

dim rst

dim sql

dim ist1,ist2,ank1,ank2



set con=server.createobject("adodb.connection")

set rst=server.createobject("adodb.recordset")

con.open constr

sql="select top
2 derece1,derece2 from hava where datevalue(tarih)='"& datevalue(date())
&"' order by sira"

rst.open sql,con

if not rst.eof then

ist1=rst.Fields("derece1").Value

ist2=rst.Fields("derece2").Value

rst.MoveNext

if not rst.EOF then

ank1=rst.Fields("derece1").Value

ank2=rst.Fields("derece2").Value

end if

end if

set rst=nothing

set con=nothing

%>

<!--

var istHava="<%=ist1%>" + "/" + "<%=ist2%>";

var ankHava="<%=ank1%>" + "/" + "<%=ank2%>";

//-->

index.html

<html>

<body>

<head>

<script language="javascript" src="hava.asp"></script>

</head>

<body>

HAVA DURUMU<br><br>

İstanbul : <script language="javascript">document.write(istHava);</script>

<br>

Ankara : <script language="javascript">document.write(ankHava);</script>

<br>

</body>

</html>


Gördüğünüz gibi hiç asp kodu olmamasına rağmen html sayfamızdaki havadurumu bilgileri dinamik olarak gelmektedir.

Bu örnek aynı klasörde olan "hava.asp" dosyasının çağırmaktadır. Başka bir siteden bu bilgileri almak için



satırını



olarak değiştirmemiz yetecektir.

ASP.NET ile Upload İşlemi

ASP konusunda en sık sorulan sorulardandı Upload yani dosya yükleme işleminin nasıl yapılacağı. ASP.NET geliştirilirken üzerinde durulan sorulardan en önemlisi şu idi: "Yazılım geliştiriciler ASP'de neyi en sık kullandılar ve bunu yaparken ASP belirli noktalarda yetersiz kaldı?" Bu soruya verilebilecek en somut yanıtlardan biriydi upload. Ve artık Upload ASP.NET içerisinde bütünleşik geldi. Aşağıdaki kod örneği C# ile yazılmıştır, istenirse VB.NET'e çevirmek de oldukça kolay. İsterseniz koda genel bir göz atalım ardından makaleye devam edelim:

<%@Page Language="C#"%>
<Html>

<head>
<title>ASP.NET ile Upload İşlemi</title>

</head>

<body>

<script language="C#" runat="Server">

void DosyaUpload(object Sender,EventArgs E)

{

if (dosya.PostedFile !=null) //Dosyanın kontrolü

{

string DosyaAdi = Dosya.PostedFile.FileName.Substring(File1.PostedFile.FileName.LastIndexOf("\\") + 1) ;

string DosyaTipi = Dosya.PostedFile.ContentType ;

int DosyaBoyutu =Dosya.PostedFile.ContentLength;

if (DosyaBoyutu <=0)
Response.Write("Hatalı dosya, upload yapılamadı: " + DosyaAdi);
else

{

Dosya.PostedFile.SaveAs(Server.MapPath(".\\" + DosyaAdi));

Response.Write( DosyaAdi + " isimli " + DosyaTipi + " dosya tipindeki " + DosyaBoyutu.ToString() + " byte dosya boyutuna sahip dosya başarıyla upload edilmiştir.");
}

}

}

</script>

<%if(!Page.IsPostBack)

{

%>

ASPnedir?com ASP.NET ile Dosya Upload İşlemleri<br><br>

<form id="nedirupload" name="nedirupload" method="post" enctype="multipart/form-data" runat="server">

Dosyayı seçiniz: <input type="file" id="dosya" name="dosya" runat="server">

<br><br>

<asp:button value="Upload" runat="server" id="UploadButonu" Text="Upload" onClick="DosyaUpload" />

</form><br><br>

Not: Upload İşlemi için işlem yapılan klasöre mutlaka write hakkı verilmelidir.

<%}%>

</body>

</Html>

Şimdi dikkatinizi çektiyse ilk defa sayfa çağırıldığında iki sunucu kontrolü aktif olacaktır. Birincisi input type=file diyoruz ama dikkat runat=server dediğime göre ve bir id verdiğime göre bu bir sunucu kontrolü artık. İkincisi ise ASP.NET ile gelen bir sunucu kontrolü olan asp:button kontrolü. onClick event'ine dikkat; sunucu tarafında gerçekleşiyor ve DosyaUpload isimli C# kodunu çağırıyor.


Koda bakacak olursanız sayfa ile çeşitli bilgi denetleme kontrolleri bulunmakta dosya olup olmadığını ve adını parse eden. Ardından tek yapmamız gereken ön sayfadan aldığımız id'si dosya olan nesnemizin özelliklerini kullanarak dosyayı almak ve sadece SaveAs methodunu çağırmak.


Unutmadan bu upload işleminin yapıldığı klasöre write hakkı verilmesi gerekmektedir.

ASP'de Form ve Veri İşleme

Genel olarak bir form içindeki bilgiler diğer bir sayfaya gönderilir ve bu sayfa içinde çeşitli işlemlere tabi tutulur.

Örneğin:
<form action="uye_ekle.asp" method="post" name="frmUyeBilgileri"> gibi bir yapıyla bilgiler ayrı bir dosya içinde değerlendirir. Yapısallık açısında iyi bir yöntem gibi görünse de istemeden de olsa proje içinde dosya karmaşasına yol açılmış olunur.

Bunu önlemek için güzel bir yol mevcut. Dikkat ettiyseniz, yukarıdaki örnekte method kısmını kırmızı ile yazdım. İşte anahtarımız bu.

Şöyle bir fikir jimnastiği yapalım. Action kısmında yer alan dosya ismi bizim formumuzun içinde bulunduğu dosya olursa ne olur? Tabi ki sayfa yeniden yüklenir ve form boş olarak görüntülenir. Aslında bilgiler post edildi. Fakat bu bilgileri işleyebilmemiz için birkaç düzenleme yapmamız gerekiyor.


1- .ASP dosyamızın başına aşağıda ki kodu eklemeliyiz. Görüldüğü üzere bu kod boolean tanımlı bir değişkeni post edilme durumuna göre 1 veya 0 yapıyor.


<%@ Language=VBScript %>


<%


Dim bPost


BPost = False


If Request.ServerVariables ("request_method")="POST" Then


bPost=True


End If


%>


2- Artık bu yapıyı kullanarak .ASP sayfamızı iki parçaya bölmemiz mümkün.


If Not bPost Then

'Herhangi bir bilgi Post Edilmemişken görüntülenecek sayfa


%>

<form ....>


</form>

<%


Else

'Herhangi bir bilgi Post Edildikten sonra görüntülenecek sayfa


txtAd=Request.Form ("txtAd")


IsaretliSayisi = Request.Form ("chkUyeID").Count


End If


Görüldüğü gibi yöntem oldukça basit. Bundan sonra formdan gelen bilgilere göre sayfanın ikinci bölümünü daha alt parçalara bölmek de mümkün.

ASP ile Güvenli Download

Bazı projelerde ziyaretçiye download yapabilmesi için siteye giriş yapması gerekebilir.


Örneğin online yazılım satışı yapan bir sitede sadece ücreti ödeyen ziyaretçilerin download hakkı olmalıdır. Bunun yanında download ettiği dosyanın yoluna bakıp satın almadığı başka dosyaları alabilme şansı olmamalıdır. Bu durumda download işleminin güvenliğini directory security gibi klasik yollarla değil , ASP ile programlama yaparak çözebiliriz.

Aşağıdaki örnekte "files" klasöründeki dosya.zip dosyası ASP ile bir değişkene atılıp browser' a gönderilmektedir. Bu nedenle kullanıcı dosya yolunu göremeyecektir. Ayrıca dosyaları site root' unun dışına koyarak yazdığımız ASP dışında bir yolla indirilmesini tamamen de engelleyebiliriz.


<%@language="vbscript"%>

<%

dim stream

dim content

dim filename

dim saveas


saveas="dosya.zip"

filename = "files/dosya.zip"

filename=server.mappath(filename)


response.contenttype = "application/x-msdownload"

response.addheader "content-transfer-encoding", "binary"

response.addheader "content-disposition", "attachment;filename="& saveas



set stream = server.createobject("adodb.stream")

stream.mode = 3

stream.open

stream.loadfromfile filename

content=stream.readtext(-1)

response.binarywrite(content)

stream.close

set stream=nothing

content=null

%>


Eğer dosyamızı download şeklinde değil de stream ederek göndermek istiyorsak


response.contenttype = "application/x-msdownload"

response.addheader "content-transfer-encoding", "binary"

response.addheader "content-disposition", "attachment;filename="& saveas


satırlarını

response.contenttype = "application/octet-stream"

response.addheader "content-disposition", "attachment;filename="& saveas


satırlarıyla değiştirmeniz yeterli olacaktır.

Tabi ki stream etme olayını bir zip dosyası değil de media türü dosyalarda kullanmamız mantıklı olacaktır.

Bu arada dikkat etmemiz gereken bir nokta var. ASP dosya içeriğini bir değişkene atıp sunucunun belleğinden browser' a gönderdiği için microsoft.com' da olduğu gibi download sayısını sunucumuzun kapasitesine göre sınırlandırmalıyız.

AspHttp ile başka web sitelerinden bilgi alımı

AspHttp şuanda başka sitelerden bilgi almak için kullanılan


bileşenlerin arasında benim en iyisi olarak gördüğüm bir bileşendir.

AspTear ve XmlHttp ile başka web istelerinden bilgi alımı yapılabilir ama

kullandığınız Server'da AspTear veya XmlHttp yoksa ama AspHttp varsa işte size çözüm:


AspHttp'nin kullanımına geçmeden AspHttp'nin kurulumuna bir gözatalım.


AspHttp'yi http://www.serverobjects.com/comp/asphttp3.zip adresinden indirebilirsiniz.

AspHttp bileşeni deneme sürümüdür. AspHttp ile ilgili düşünceleriniz olumlu ise

bileşeni kullanabilmeniz için satın almanız gerekiyor.


AspHttp'yi kullanabilmeniz için asphttp3.zip içerisindeki "Asphttp.dll" dosyasını register etmeniz gerekmektedir. asphttp3.zip dosyasının içerisinde bulunan "Asphttp.dll" dosyasının Windows 'un sistem klasörüne kopyalayınız (NT için '\winnt\system32', Win9x için '\Windows\System'). Daha sonra "Başlat/Start" menüsünden "çalıştır/Run" menüsünü seçiniz. Açılan ufak pencereye "regsvr32 asphttp.dll" yazıp "Tamam" 'ı tıklayınız. Bu sayede register işlemimiz gerçekleşecektir.


AspHttp 'nin Kullanımı:


ısterseniz AspHttp ile istediğiniz web sitesinin tamamını (resimler hariç) gösterim yapabilirsiniz.


AspHttpHTM.Asp

<%

Server.ScriptTimeout = 240

'Bağlantımızı Kuralım

Set HttpObj = Server.CreateObject("AspHTTP.Conn")

HttpObj.Url = "http://www.microsoft.com"

rem HttpObj.Port = 80

rem HttpObj.TimeOut = 80

HttpObj.FollowRedirects = true

HttpObj.RequestMethod = "GET"

HttpObj.UserAgent = "Mozilla/2.0 (compatible; MSIE 3.0B; Windows NT)"

strResult = HttpObj.GetURL


'Sayfamızı Yazdılarım...

Response.Write strResult

Response.Write "<blockquote><hr>URL is now: " & HttpObj.URL

Response.Write "<hr><pre>" & HttpObj.Headers & "</pre>"


'Bileşenimizin Kayıtlı Olup Olmadığını öğrenelim...

Response.Write "<hr>"

strRegName = HttpObj.RegisteredUser

if Left(strRegName, 5) <> "Unreg" then

Response.Write "Bileşenin Kayıtlı Olduğu ısim: " & strRegName & "<br>"

else

Response.Write "Bileşen Kayıtlı Değil.<br>"

end if

%>

'AspHttpHTM.Asp Bitti


AspHttp ile yapabileceğimiz diğer bir işlem ise verilen web sitesi adresindeki tüm linkleri

listeleyebilmektir.


ASpHttpList.Asp


<html>

<body>

<%

Server.ScriptTimeout = 240

'Bağlantımızı Kuralım

Set HttpObj = Server.CreateObject("AspHTTP.Conn")

HttpObj.Url = "http://www.genusa.com/asp/tools.html"

rem HttpObj.Port = 80

rem HttpObj.TimeOut = 80

HttpObj.RequestMethod = "GET"

HttpObj.UserAgent = "Mozilla/2.0 (compatible; MSIE 3.0B; Windows NT)"

strResult = HttpObj.GetURL


'Linklerimizi Listeleyelim...

Response.Write "<h2>A HREF Listesi</h2>"


varHREFArray = HttpObj.GetHREFs


intHREFArrayLimit = UBound(varHREFArray) -1

For I = 0 to intHREFArrayLimit

Response.Write varHREFArray(I) & "<br>" & VBCrLF

Next

%>

'ASpHttpList.Asp Bitti

Bu bileşenin diğer bir avantajı başka web sitelerinden istediğimiz satır veya bilgiyi alabilmektir. Buna bir örnek olarak TR.Net sitesinden hava durumunu nasıl alabileceğimizi bir örnekle gösterelim:


Hava.Asp

<%

'Bağlantımızı Kuralım

set HttpObj = Server.CreateObject("AspHTTP.Conn")

HTTPObj.Url = "http://www.tr.net"

odunc = HTTPObj.GetURL


'Sayada Ankara nın yerini belirleyelim.

yer = Instr(1,odunc,"Ankara")

ankara = Mid(odunc,yer+89)

son = Instr(1,ankara,"<")

son = son - "1"

'Ankara nın HavaDurumunu öğrenelim

ankara = Mid(odunc,yer+89,son)


'Sayada ıstanbul un yerini belirleyelim.

yer = Instr(1,odunc,"ıstanbul")

istanbul = Mid(odunc,yer+103)

son = Instr(1,istanbul,"<")

son = son - "1"

'ıstanbul un HavaDurumunu öğrenelim

istanbul = Mid(odunc,yer+103,son)


'Sayada ızmir in yerini belirleyelim.

yer = Instr(1,odunc,"ıstanbul")

izmir = Mid(odunc,yer+103)

son = Instr(1,izmir,"<")

son = son - "1"

'ızmir in HavaDurumunu öğrenelim

izmir = Mid(odunc,yer+103,son)

%>

<html>

<head><title>AspHttp ile TR.Net 'ten HavaDurumu</title>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">

<style>

table {font-family: verdana; font-size: 7pt};

</style>

</head>

<body>

<table border="0">

<tr><td>Ankara</td><td><%=ankara%></td></tr>

<tr><td>ıstanbul</td><td><%=istanbul%></td></tr>

<tr><td>ızmir</td><td><%=izmir%></td></tr>

</table>

</body></html>

'Hava.Asp Bitti

ASP'de Built-In Objects

Merhabalar,


Bu yazımızda ASP nin yapısında bulunan Yapı Objelerini ( Built-In Objects ) ayrıntılı şekilde ele alacağız.



ASP bildiğiniz gibi temelde VBScript’i kullanır ve VBScriptte geçen tüm fonksiyonlar,Operatörler,Metodlar ve diğer işlemler aynı şekilde ASP içinde geçerlidir.

Burada aklınıza "O zaman neden VBScript kullanmıyoruzda ASP kullanıyoruz ?" diye bir soru gelebilir. Bunu ASP ile VBScript farkları olarak şöyle açıklayabiliriz.



• ASP Server tabanlı bir script dilidir ve Webserver olmadan çalışmaz. VBScript ise normal HTML sayfalarında da kullanılabilir.

• ASP hem VBScript in getirdiği özellikleri kullanabilir hem de objelerle ilişkilidir. VBScript ise ASP kadar obje yönelimli değildir.

• ASP nin tabanında yapı objeleri ( Built-In Objects ) vardır fakat VBScriptte bu şekilde objeler yoktur.

• ASP , VBScript ‘ e göre veritabanları ile daha kolay anlaşabilir ve daha çarpıcı işlemler yapabilir.

• ASP de yazdığınız kodlar kullanıcının bilgisayarına gittiğinde HTML tagları olarak görünür fakat VBScript kodları kullanıcının bilgisayarına gittiğinde yazıldığı gibi görünür.



Bu farkları gördüğümüzde neden ASP kullandığımızı daha iyi anlıyoruz.



ASP 2.0 da 5 adet yapı objesi bulunurken ASP 3.0 da bu sayı 7 ye çıkarılmıştır.



ASP 2.0 da bulunan yapı objeleri :

• Response

• Request

• Session

• Application

• Server



ASP 3.0 da bulunan yapı objeleri :

• Response

• Request

• Session

• Application

• Server

• Errors Object

• ObjectContext Object


Gördüğünüz gibi ASP 3.0 ile birlikte hata kontrolleri için Errors objesi ve Transaction işlemleri için ObjectContext objesi gelmiştir.


Bu yazımızda bu objelerden Response ve Request objesini inceleyeceğiz.


RESPONSE :

Bu obje ASP’de en çok kullanılan objelerden biridir. Webserver’ın kullanıcıya ( Client ) cevap vermesi anlamına gelir.

Yani kullanıcı Webserver dan bir istekte bulunur ve Webserver da kullanıcıya Response objesi ile cevap verir.

Örneğin, kullanıcı herhangi bir ASP sayfasını çağırdığında ekrana gelen değişken değerleri veya kişinin bilgisayarına çerezlerin ( Cookie ) gönderilmesi gibi işlemler bu obje sayesinde olur.

Şimdi Response objesine ait özellikleri ve metodları inceleyelim ...



Response.Write : Bu metod ASP sayfalarında çok fazla kullanılır. Bir değişkenin değerini yada herhangi bir yazıyı ekranda görüntülemek için kullanılır.

Örnek kullanımı : Response.write (“ bu bir deneme yazısıdır...”)

şeklindedir. Bu örneği kullandığınızda ekranda “ bu bir deneme yazısıdır...” yazısını görürsünüz.

Bunun dışında tek satırlık işlemler yapıyorsanız “ = “ işareti kullanabilirsiniz.Bu işlem Response.Write metodunun yaptığı işi yapar. Örnek kullanımı : <%=data(“kisiadi”)%> Şeklindedir.



Response.Redirect : Bu metod bulunduğunuz sayfadan başka bir sayfaya yada başka bir internet adresine yönlendirilmek istediğinizde size yardımcı olacaktır.Örneğin bir kişiyi sitenize kayıt ettikten sonra otomatikman o kişiyi kayıt olmuş kişiler sayfasına yönlendirmek isterseniz redirect metodunu kullanabilirsiniz.

Örnek kullanımı : Response.Redirect (“default.asp”)

şeklindedir. Bu örneği kullandığınızda bulunduğunuz sayfadan default.asp sayfasına yönlendirilirsiniz.



Response.Expires : Bu özellik sayfanın kaç saniye sonra iptal ( Expire ) olacağını belirler. Örneğin kullanıcı hiçbir işlem yapmadan 20 saniye beklerse sayfa expire olur.tabi burada 20 saniye yada diğer zaman birimlerini belirlemek size kalmış.

Örnek kullanımı : Response.Expires=50

Şeklindedir. Burada 50 rakamı sayfanın 50 saniye sonra expire edileceğini belirtmektedir.



Response.Cookies : Bu koleksiyon Zzyaretçinin bilgisayarına Cookie ( Çerez ) denilen, genelde içinde kişi ve site hakkında bilgi barındıran küçük bilgi dosyacıkları gönderir.Cookieler siteler tarafından fazlaca kullanılır ve kullanıcıyı tekrar tekrar sitede bir takım olayları gerçekleştirmekten kurtarır. Örneğin kişi bilgilerini içeren bir Cookie niz varsa ziyaretçi sizin sitenize girdiğinde

O kişiye ismi ile hitap edebilirsiniz ve bunun o kişiyi memnun edeceğinden emin olabilirsiniz.

Örnek kullanımı : Response.Cookies(“isim”)=”ismail AKTAŞ”

Şeklindedir. Bu Örneği kullandığınızda ziyaretçinin bilgisayarına isim adında ismail AKTAŞ değerini içeren bir cookie göndermiş olursunuz .



Response.IsClientConnected : Bu özellik sitenizde herhangi ziyaretçinin olup olmadığı hakkında size bilgi vermektedir.

Eğer sitenizde ziyaretçi var ise geriye değer olarak true döndürmektedir.

Örnek kullanımı : Response.IsClientConnected

Şeklindedir. Burada size döndürecek True , False değerlerinden birine göre işlemler yapabilirsiniz.



Response.Buffer : Bu özellik sayfanın tam olarak yüklenmeden gösterilmemesini sağlar. Yani bu özelliği kullandığınızda sayfanızdaki objeler,elemanlar ve diğer tüm işlemlerin oluşması tamamlanmadan sayfanız ekranda görünmez.

Örnek kullanımı : Response.Buffer=True

Şeklindedir. Burada True değerini girmezseniz yada buffer özelliğini hiç kullanmazsanız mevcut değeri olan False aktif olacaktır.



Response.Charset : Bu özellik bölgesel ayarlarda kullanılır ve sayfada kullanılan karakterlerin set edilmesi işlemini içerir.

Örnek kullanımı : Response.Charset=1254

Şeklindedir.Buradaki 1254 değeri türkçe karakterlerin yazılacağını belirtir.



Response.End : Bu metodu sayfanın neresine koyarsanız kodlar oraya kadar normal bir şekilde çalışır ve response.end satırını gördüğü anda durur. Bu metod daha çok kodlama sırasında kontrol işlemlerinde kullanılır fakat bazı sayfalarda da işlemleri sonlandırmak için kullanıldığı görülmüştür.

Örnek kullanımı : Response.End şeklindedir.


Response.ContentType : Kullanacağınız ASP sayfasının içeriğini tanımlamakta kullanılır.Örneğin Browser' ınızda bir Excel,Word yada bir PowerPoint sayfasını ContentType özelliğini kullanarak açabilirsiniz.

Örnek kullanımı : Response.ContentType="application/msword" yazdığınızda browser bir Word sayfası açar.

Eğer Excel sayfası açmak isterseniz ; Response.ContentType = "application/vnd.ms-excel" yazarak bu işlemi de yapabilirsiniz.


Şimdi de Request objesinin özelliklerini ve metodları görelim.


REQUEST :

Request objesi Webserver ‘ ın ziyaretçiden bilgi alması anlamına gelmektedir.

Request.QueryString : Formlarda GET metodu ile bilgi gönderilmek istediğinde bu bilgi request objesinin QueryString koleksiyonu ile alınır.Ayrıca linkler aracılığı ile bilgi gönderilmek istendiğinde de bu bilgi GET metodu ile gönderilmiş sayılıp yine QueryString koleksiyonu ile alınır.

Örnek kullanımı : Response.QueryString(“formdan gelen bilgi”) Şeklindedir.


Request.Form : Bu koleksiyon ise QueryString in yaptığı işlemlerinin bir benzerini yapmaktadır. Tek farkı formlarda GET metodu yerine POST metodu aktif olduğunda kullanılır ve linkler aracılığıyla gönderilen veriler bu koleksiyon ile alınmaz.

Örnek kullanımı : Response.Form(“formdan gelen bilgi”) Şeklindedir.


Request.ServerVariables : Bu koleksiyon server bilgilerini almak için kullanılır. Webserver’ların tuttuğu bilgilere ihtiyacımız olduğunda bu koleksiyonu kullanırız.

Örnek kullanımı : Response.Servervariables(“REMOTE_ADDR”)

Şeklindedir. Bu örneği uyguladığınızda sitenize gelen ziyaretçinin IP ( Internet Protokol ) numarasını almış olursunuz.


Request.Cookies : Bu koleksiyon ise Response objesi ile gönderilen cookieleri alma da kullanılır.

File System Objesi ile Windows Gezgini

Bu yazımızda ASP ile File System objesini kullanarak basit bir windows gezgini yazacağız.


Bu işlem için Database yada benzeri bir harici dosya kullanmadan, bir tek dosya ile bu işlemi gerçekleştireceğiz.



Bu iş için öncelikle bir asp dosyası yaratalım ve de adını Filesystem.asp verdelim.daha sonra yarattığımız bu Filesystem.asp dosyasının içerisine aşağıdaki ASP kodunu ekleyelim.



------------------- Filesystem.asp ------------------------



<HTML>

<HEAD>

<TITLE>Windows Gezgini...</TITLE>

</HEAD>

<BODY>

<div id=divdrives>

<font face=verdana size=2>Sisteminizdeki Sürücüler :<p>

<%

dim objfso

set objfso=server.CreateObject("Scripting.FileSystemObject")

for each x in objfso.Drives

set drivename=objfso.GetDrive(x)

Response.Write "<a href=filesystem.asp?drive="&drivename.DriveLetter&">"&drivename.DriveLetter&"</a> "

next

if Request("drive")<>"" then call FolderList(Request("drive"))

if Request("foldername")<>"" then call FileList(cstr(Request("foldername")))

if Request("filename")<>"" then call FileDetails(cstr(Request("filename")))



'Sürücüler.

Function FolderList(Drivename)

Response.Write "  <img src=ustfolder.gif id=ustfolder style=cursor:hand alt="&chr(34)& _

"bir üst klasöre gitmek için tıklayınız."&chr(34)&">"

Response.Write "<br><br>"

set RootFolders=objfso.GetDrive(Drivename).RootFolder

set Folders=RootFolders.SubFolders

set SubFiles=RootFolders.Files

for each i in Folders

Response.Write "<img src=folder.gif> <a href=filesystem.asp?foldername="&i.ShortPath& _

" style=text-decoration:none>"&i.name&"</a><br>"

next

for each x in SubFiles

Response.Write "<img src=file.gif> <a style=text-decoration:none href="&chr(34)&"filesystem.asp?filename="& _

x.path&chr(34)&">"&x.name&"</a><br>"

next

End Function



'Klasör içeriğini listeleme.

Function FileList(Foldername)

Response.Write "  <img src=ustfolder.gif id=ustfolder style=cursor:hand alt="&chr(34)& _

"bir üst klasöre gitmek için tıklayınız."&chr(34)&">"

Response.Write "<br><br>"

set filesname=objfso.GetFolder(Foldername).Files

set Foldersname=objfso.GetFolder(Foldername).SubFolders

for each i in Foldersname

Response.Write "<img src=folder.gif> <a href=filesystem.asp?foldername="&i.ShortPath& _

" style=text-decoration:none>"&i.name&"</a><br>"

next

for each x in filesname

Response.Write "<img src=file.gif> <a style=text-decoration:none href="&chr(34)& _

"filesystem.asp?filename="&x.path&chr(34)&">"&x.name&"</a><br>"

next

End Function



Function FileDetails(Filename)

set filesdetail=objfso.GetFile(cstr(Filename))

Response.Write "  <img src=ustfolder.gif id=ustfolder style=cursor:hand alt="& _

chr(34)&"bir üst klasöre gitmek için tıklayınız."&chr(34)&">"

Response.Write "<div id=divfiles class=divstyle>"

Response.Write " <b>Seçilen Dosyanın Ayrıntıları : </b><br><br>"

Response.Write " <b>Path:</b> " & cstr(Filename) & "<br>"

Response.Write " <b>Dosya Adı :</b> " & filesdetail.Name & "<br>"

Response.Write " <b>Dosya Büyüklüğü :</b> " & filesdetail.Size & " KB <br>"

Response.Write " <b>Dosya Tipi :</b> " & filesdetail.Type & " <br>"

Response.Write " <b>Son Düzenleme Tarihi :</b> " & filesdetail.DateLastModified & "<br>"

Response.Write " <b>Son Erişim Tarihi :</b> " & filesdetail.DateLastAccessed & "<br>"

Response.Write "<br><br> <b>!</b><a href="&chr(34)&filename&chr(34)& _

" target=_new style=text-decoration:none>Bu Dosyayı açmak için buraya tıklayınız.</a>"

Response.Write "</div>"

End Function

%>



<script language="VBScript">

sub ustfolder_Onclick()

history.go(-1)

end sub

</script>

</div>

</BODY>

</HTML>



---------------------------------------------------------------



Bu kod bizim bilgisayarımızda sürücüler ve klasörler arasında gezinmemizi ve istediğimiz herhangi bir dosya hakkında bize bilgi verilmesini sağlar.



Şimdi bu kodu bloklar halinde inceleyelim.







1. BLOK



<%

dim objfso

set objfso=server.CreateObject("Scripting.FileSystemObject")

for each x in objfso.Drives

set drivename=objfso.GetDrive(x)

Response.Write "<a href=filesystem.asp?drive="&drivename.DriveLetter&">"&drivename.DriveLetter&"</a> "

next

if Request("drive")<>"" then call FolderList(Request("drive"))

if Request("foldername")<>"" then call FileList(cstr(Request("foldername")))

if Request("filename")<>"" then call FileDetails(cstr(Request("filename")))

%>



Bu blokta Filesytemobjesi yaratılıyor ve sistemde bulunan sürücüler (A:,C: v.s) listeleniyor.

Dikkat ederseniz 3. satırda For each döngüsü görüyoruz.Bu döngü belli koleksiyonların içerisindeki elemanları listeler.

Burada kullanmamızın sebebi Filesystem objesinin GetDrive koleksiyonun elemanlarını listemek içindir.

if ile başlayan satırlar kontrol amacıyla konulmuştur.



2. BLOK

<%

Function FolderList(Drivename)

Response.Write "  <img src=ustfolder.gif id=ustfolder style=cursor:hand alt="&chr(34)& _

"bir üst klasöre gitmek için tıklayınız."&chr(34)&">"

Response.Write "<br><br>"

set RootFolders=objfso.GetDrive(Drivename).RootFolder

set Folders=RootFolders.SubFolders

set SubFiles=RootFolders.Files

for each i in Folders

Response.Write "<img src=folder.gif> <a href=filesystem.asp?foldername="&i.ShortPath& _

" style=text-decoration:none>"&i.name&"</a><br>"

next

for each x in SubFiles

Response.Write "<img src=file.gif> <a style=text-decoration:none href="&chr(34)&"filesystem.asp?filename="& _

x.path&chr(34)&">"&x.name&"</a><br>"

next

End Function

%>



Bir önceki kodda Sürücüleri listelemiştik fakat ordan seçilen sürücünün içerisindeki dosya ve klasörlerin nasıl listeleneceğinden bahsetmemiştik.

İşte burada o işlemi yani seçilen sürücünün içeriğinin listelenmesi işlemini bu fonksiyon sayesinde gerçekleştiriyoruz.

Ayrıca bu fonksiyon alt klasörlere gidildikçe onlara ait alt klasörleri de ekrana getirir.



3. BLOK

<%

Function FileList(Foldername)

Response.Write "  <img src=ustfolder.gif id=ustfolder style=cursor:hand alt="&chr(34)& _

"bir üst klasöre gitmek için tıklayınız."&chr(34)&">"

Response.Write "<br><br>"

set filesname=objfso.GetFolder(Foldername).Files

set Foldersname=objfso.GetFolder(Foldername).SubFolders

for each i in Foldersname

Response.Write "<img src=folder.gif> <a href=filesystem.asp?foldername="&i.ShortPath& _

" style=text-decoration:none>"&i.name&"</a><br>"

next

for each x in filesname

Response.Write "<img src=file.gif> <a style=text-decoration:none href="&chr(34)& _

"filesystem.asp?filename="&x.path&chr(34)&">"&x.name&"</a><br>"

next

End Function

%>



Bu blok ise seçilen bir klasörün yada sürücünün altında bulunan dosyaları listemek amaçlı olarak kullanılır.

Sürücüler,klasörler ve alt klasörler altındaki tüm dosyalar bu fonksiyon sayesinde listelenir.



4. BLOK

<%

Function FileDetails(Filename)

set filesdetail=objfso.GetFile(cstr(Filename))

Response.Write "  <img src=ustfolder.gif id=ustfolder style=cursor:hand alt="& _

chr(34)&"bir üst klasöre gitmek için tıklayınız."&chr(34)&">"

Response.Write "<div id=divfiles class=divstyle>"

Response.Write " <b>Seçilen Dosyanın Ayrıntıları : </b><br><br>"

Response.Write " <b>Path:</b> " & cstr(Filename) & "<br>"

Response.Write " <b>Dosya Adı :</b> " & filesdetail.Name & "<br>"

Response.Write " <b>Dosya Büyüklüğü :</b> " & filesdetail.Size & " KB <br>"

Response.Write " <b>Dosya Tipi :</b> " & filesdetail.Type & " <br>"

Response.Write " <b>Son Düzenleme Tarihi :</b> " & filesdetail.DateLastModified & "<br>"

Response.Write " <b>Son Erişim Tarihi :</b> " & filesdetail.DateLastAccessed & "<br>"

Response.Write "<br><br> <b>!</b><a href="&chr(34)&filename&chr(34)& _

" target=_new style=text-decoration:none>Bu Dosyayı açmak için buraya tıklayınız.</a>"

Response.Write "</div>"

End Function

%>



Bu blokta bulunan fonksiyon ise ekrana seçilen dosya hakkında bilgiler getirir.

Bu bilgiler ;

· Dosyanın path’i

· Dosyanın adı

· Size olarak büyüklüğü

· Dosya Tipi (exe,txt v.s)

· Son düzenleme tarihi

· Son erişim tarihi

Ayrıca bu dosya Explorer tarafından açılabilecek bir dosya ise (txt,gif,jpg,excel,word,power point v.s) “ Bu Dosyayı açmak için buraya tıklayınız.” Linkine tıklayarak bu dosyayı açabiliriz.



<script language="VBScript">

sub ustfolder_Onclick()

history.go(-1)

end sub

</script>



Bu blok ise bir önceki klasöre gitmekte kullanılan alt programı içermektedir.

ASP.NET Uygulamalarında DCOM Kullanma

DCOM componentleri ve COM componentlerinin kullanımları arasında neredeyse fark yok ama ufak bir ayrıntıya dikkat etmek gerekiyor.

Önce DCOM componentimizi COM componentinde olduğu gibi projemize dahil edelim.

Solution Exploerer dan Reference üzerine sağ tıklayıp Add Reference seçeneğini tıklayalım.



Açıklan Add Reference Menüsünden Aşağıdaki adımları izleyelim :

1. COM Sekmesine tıklayın
2. Listeden DCOM componentimizi bulup seçeleim
3. Select tuşuna basarak seçtiğimiz componentim Selected Component penceresine geçmesini sağlayalım
4. Ok deyip projemize geri dönelim



Solution Exploerer a tekrar baktığımızda Componentimizin Reference bölümüne eklendiğini görüyoruz.



Artık componentimizin instance'ını yarattıp dilediğimiz kullanabiliriz.

ESTPAYCOMLib.paymentClass myDCOM = new ESTPAYCOMLib.paymentClass();

Projemizi Çalıştırdığımızda bizi "Access Denied" içerikli bir hata mesajı karşılayabilir. Bunun nedeni DCOM componentlerinin aslında başka bir makinede host edilen asıl COM+ component'ine ulaşmamızı sağlayan bir proxy durumunda olmasıdır.

Asıl COM+ componenti başka bir sunucuda bulunmaktadır ve DCOM componenti ise proxy bu asıl COM+ componentini tüm fonksiyonlarını kullanmamıza olanak tanır. Biz sonuçta DCOM u kullanırız fakat bütün işlemler sunucuda bulunan COM+ componentinde icra edilir.

Peki "Access Denied" hatası almamızın sebebi nedir ? ASPX uzantılı ASP.NET sayfaları sayfaları sistemde bulunan ASP.NET user ı tarafından çalıştırılmaktadır. ASP.NET user ına Full Control yetkisi verseniz dahi DCOM componentlerini oluşturup kullanmak için yeterli yetkiye sahip değildir.

Bu problemi aşmak için projemizin Web.Config dosyasını açıp şu satırları eklememiz yeterli olacaktır :



Bu XML satırı uygulamanın o anda kullanılan user'ının security ayarlarını windows authentication düzeyinde sağlar. Eğer o andaki kullanıcı yetkileri domain dışından gelecekse kodumuza username ve password özelliklerinide eklememiz gerekir.



Tüm bunların dışında hala DCOM component'leri oluşturmakta sorun yaşıyorsak Component Service ten DCOM componentin kullanabilecek userları atamamız gerekir. Bunun için Run dan dcomcnfg komutunu çalıştırdığımızda açılacak olan Component Service den ilgili DCOM componentini bulup sağ tıklyarak özelliklerine girilir.



Özelliklerde Security sekmesine tıklayın. Sırasıyla Launch Permission, Access Permision ve Configration Permission tablarından customize radio butonunu seçip Edit butonu ile DCOM componentini kullanacak kullanıcıları ekleyin, ve Allow yetkisi verin.



Bunların sonucunda DCOM componenetiniz sağlıklı bir şekilde çalışıyor olacaktır.

ASP ile Güncel Haber Ekleme

Aslında şu anda yazacağımız kodlarda , şu ana kadar öğrendiğiniz muhtemel ASP bilgilerinin dışında pek fazla yeni bir şey yok.Ancak yine büyük bir olasılıkla ilk defa karşılaşacağınız DateDiff fonksiyonu ile ASP ile güncelliği yakalayacağız.Bu gerçekten de güncellik konusunda işimizi oldukça kolaylaştıran bir fonksiyon.Size tüm samimiyetim ile söylüyorum ki bu fonksiyon ile tanıştıktan sonra ASP'yi seçtiğim için gerçekten seviniyorum.

Aşağıda haber_ekle.asp dosyasının içeriği verilmiştir.

<%
@ Language="VBScript" codepage=1254 %>

<% Option Explicit %>

<html>

<head>

<title>ASP ile Güncel Haber Ekleme</title>

</head>

<body>

<form action="haber_isle.asp" method="get">

<b>Haber Başlığı : </b><input type="textbox"
name="haber_basligi"><br>

<br><b>Haber : </b><br><textarea rows="10"
cols="50" name="haber"></textarea><br><br>

<input type="submit" value="Gönder">

</form>

</body>

</html>

Bu dosyamızda sadece formumuzu oluşturuyoruz ve formumuzu işleyecek sayfanın adresini belirtiyoruz.Dolayısıyla daha fazla açıklama yapmamıza gerek yok.

Aşağıda haber_isle.asp dosyasının içeriği verilmiştir.


<%
@ Language="VBScript" codepage=1254 %>

<% Option Explicit %>

<html>

<head>

<title>ASP ile Güncel Haber Ekleme</title>

</head>

<body>

<% ' Değişkenlerimizi tanımlıyoruz.

dim tarih,haber_basligi,haber,fso,text_dosyasi,text_getfile

' Değişkenlerimize haber_ekle.asp deki formlara girilen bilgilerin
değerlerini kaydediyoruz.


tarih=date()

haber_basligi=Request.QueryString("haber_basligi")

haber=Request.QueryString("haber")

' Formlardan aldığımız değerlerin boş olup olmadığını kontrol ediyoruz.Doldurulmamış
olan form öğeleri varsa

' bir önceki sayfaya geri dönerek doldurulmamış formların doldurulması
söyleniyor.Eğer herşey tam olarak doldurulmuş ise kodlara devam ediliyor.


if haber_basligi="" then

Response.Write "Lütfen haber başlığı <a href=haber_ekle.asp>giriniz</a>
!"

else

if haber="" then

Response.Write "Lütfen haber <a href=haber_ekle.asp>giriniz
!"

else

'
FileSystemObject
'i oluşturuyoruz ve onu fso değişkenine atıyoruz.


set fso=Server.CreateObject("Scripting.FileSystemObject")

' Eğer "C:\" de haberler.txt diye bir dosya yok ise böyle
bir text dosyası oluşturuyoruz.Yoksa kodlara devam ediliyor.


if fso.FileExists("C:\haberler.txt") = False then

set text_dosyasi=fso.CreateTextFile("C:\haberler.txt")

' Daha sonra text dosyasına başka şekilde izinler verip açacağımız
için dosyayı kapıyoruz.


text_dosyasi.close

set text_dosyasi=nothing

else

end if

' Text dosyamızı "File Nesnesi" için açıp bunu text_getfile
değişkenine atıyoruz.


set text_getfile=fso.getfile("C:\haberler.txt")

' İşte şimdi esas yapacağımız işe , can alıcı noktaya geldi sıra.Datediff()
fonksiyonu yardımıyla dosyamızın en son değiştiriliş tarihi ile bugünkü
tarihi karşılaştırıyoruz.Değer sıfıra eşitse yani dosyamız en son olarak
bugün güncellenmişse 8 (ekleme.) iznini vererek açıyoruz.Eğer sıfıra
eşit değilse yani güncel değilse 2(yazma.) iznini vererek açıyoruz.


if datediff("d",text_getfile.DateLastModified,tarih) = 0 then

set text_dosyasi=fso.OpenTextFile("C:\haberler.txt",8,0)

else

set text_dosyasi=fso.OpenTextFile("C:\haberler.txt",2,0)

end if

' Tüm bu yorucu kontrollerden sonra formlardan aldığımız değişkenleri
text dosyamıza nacizane bir tasarım ile ekliyoruz.


text_dosyasi.Writeline "<b>"

text_dosyasi.Writeline haber_basligi&"</b><br><br>"

text_dosyasi.Writeline haber&"<br><br>"

text_dosyasi.Writeline "<b>Haber tarihi : </b>"

text_dosyasi.Writeline tarih&"<br><br><br>"

' Bundan sonra işimiz bitiyor.Yorucu kodların ardından bir iş başarmanın
mutluluğuyla keyifleniyoruz.Ama asla oluşturduğumuz nesneleri kapatmayı
unutmayalım.Şimdiden düzenli olmak gerekiyor :)))))


text_dosyasi.close

set text_dosyasi=nothing

set text_getfile=nothing

set fso=nothing

end if

end if

%>

</body>

</html>


Bu dosyamız tabiri caizse scriptin başrol oyuncusu , esas oğlanı , jönü.Yani herşeyi yapan kodlar bu sayfada gizli.Kodu yorumları ile okuyunca kodu anlamış olacağınıza eminim.DateDiff() fonksiyonunun kullanılışını böyle bir örnekte gördünüz.Ancak her türlü ayrıntısıyla DateDiff() fonksiyonu anlatan bir yazıyı yakında yazacağım.Ona da bakmanızı tavsiye ederim.

Aşağıda haberler.asp dosyasının içeriği verilmiştir.


<%
@ Language="VBScript" codepage=1254 %>

<% Option Explicit %>


<% ' Bundan sonra yazacağımız kodları ara belleğe alıyoruz.

Response.Buffer=True %>

<html>

<head>

<title>ASP ile Güncel Haber Ekleme</title>

</head>

<body>

<% dim fso,text_dosyasi

set fso=Server.CreateObject("Scripting.FileSystemObject")

' Dosyamızı 1(okuma.) iznini vererek açıyoruz.


set text_dosyasi=fso.OpenTextFile("C:\haberler.txt",1,0)

' While döngüsü ile text_dosyasi text_dosyasi.AtEndOfStream olmadığı
sürece ekrana text dosyasının satırlarını yazdırıyoruz.


while not text_dosyasi.AtEndOfStream

Response.Write text_dosyasi.Readline

wend

' Ara belleğe aldığımız içeriği sayfaya gönderiyoruz.

Response.Flush

text_dosyasi.close

set text_dosyasi=nothing

set fso=nothing

%>

</body>

</html>


Bu naçizane dosyamız içeriğini formlar ile doldurduğumuz haberler.txt dosyasının içeriğini ekrana yazdırıyor.

27 Ağustos 2010 Cuma

Reporting Services 2005'de Rapor Oluşturma

Bir önceki makalede size SQL Server Reporting Services (SSRS) ile ilgili genel bir bilgi verip, nasıl kurulacağını anlattım. Bu makalede ise size örnek bir rapor SSRS’de nasıl oluşturulur, deploy(publish-yayınlanır) edilir, ve görüntülenir bunu göreceğiz. Öncelikli olarak mutlaka SQL Server Reporting Services hizmetinin açık olduğundan emin oldun. Bunun için Reporting Services Configuration (Başlat/Programlar/Microsoft SQL SERVER 2005/Configuration Tools dizininden ulaşabilirsiniz.) aracında Server Status bölümü çalışmıyorsa Start butonuna tıklayarak çalıştırın.




Şu anda sistem çalışmamaktadır.



Sistem çalışır hale gelmiştir.

Şimdi sıra geldi örnek bir rapor oluşturmaya. Bunun için Visual Studio 2005’i açın, File/New/Project’e tıklayın. Açılan pencerede Business Inteligence Projects’i seçtiğiniz zaman hemen sağda Visual Studio Installed Templates bölümü çıkar. Bu bölümden Report Server Project’i seçin ve ismini (ben aspnedirRAPOR olarak veriyorum) istediğiniz şekilde yazın.



ve ok'e tıklayın

Ben bu rapor örneğinde AdverntureWorks veritabanı ile çalışacağım. AdventureWorks veritabanının http://www.microsoft.com/downloads/details.aspx?FamilyId=E719ECF7-9F46-4312-AF89-6AD8702E4E6E&displaylang=en adresinden indirebilirsiniz.

İlk olarak raporu hangi veritabanından çekeceksek bununla ilgili veri kaynağını (DataSource) tanımlamalıyız. Bunun için Solution Explorer bölümünden Shared Data Sources’a sağ tıklayın ve Add New Data Source’ı seçin.



Açılan pencerede veri kaynağımızın ismini ve Tipini belirliyoruz. Ben veri kaynağının ismini AdventureWorks olarak yazdım. Siz rapor çekmek istediğiniz veritabanının ismini yazabilirsiniz.



Connection string’i el ile yazabileceğiniz gibi, Edit butonuna tıklayarak önünüze gelen sihirbaz yardımıyla da yapabilirsiniz. Burada size sihirbazla nasıl yapılacağını anlatacağım. Şimdi Edit butonuna tıklıyoruz.

İlk olarak Server ismini giriyoruz bu ismin ne olduğunu bilmiyorsanız, SQL Server Management Studio’u açın ve orda bağlı bulunduğunuz veritabanının hangi sunucu isminde kayıtlı olduğunu bulun. Bendeki örnekte sunucu ismi SEKANET olarak geçmektedir.



Database Server ismini şekildeki gibi görebilirsiniz. Benim server'ımın ismi SEKANET olarak geçmektedir.

İster windows Authentication ile isterseniz SQL server Authentication ile sunucuya bağlanabilirsiniz. Ben bu örnekte SQL server authentication’u tercih ettim. Kullanıcı adı ve şifresini girdikten sonra kullanılacak veritabanını seçin ve doğru bir ayar yaptığınızı test etmek için Test Connection butonuna tıklayın. Eğer ayarları doğru yaptıysanız Test connection succeeded mesajını göreceksiniz. Burda size tavsiyem Save My Password seçeneğini de seçmeniz. Böylece raporu görüntülemek istediğinizde sürekli olarak veritabanına bağlanmak için kullanıcı adını ve şifresini girmek zorunda kalmazsınız.



Rapor Oluşturma

Veri kaynağımızı yarattıktan sonra sıra geldi yeni bir rapor dosyası oluşturmaya. Bunun için Solution Explorer bölümündeki Reports’a sağ tıklayın ve Add New Report deyin.



Yeni rapor ekle dedikten sonra karşınıza bir sihirbaz çıkar. Bu sihirbazdaki ilk ekranı Next diyerek geçin. Bu adımda size hangi veri kaynağından rapor almak istediğinizi soracaktır. Aynı proje içerisinde birden fazla veri kaynağı oluşturabileceğiniz için böyle bir seçim yapmanız gerekir.



Veri kaynağınızı seçin ve Next butonuna basın. Bu adımda ise raporu oluşturacak sorguyu yazıyoruz.




Ve Next’e tıklayarak bu ekranı geçiyoruz.

Bir sonraki ekranda ise Tabular’ı seçip Finish butonuna tıklayın.



Şimdilik burda yer alan diğer bölümlerin ne işe yaradığını anlatmayacağım.

En son ekranda ise bize oluşturduğumuz raporun ismini soracak. Ben örnek olarak SalesTerritory adını girdim.



Ve son olarak Finish deyip raporumuzu tamamlıyoruz. Raporumuz tamamlandıktan sonra Visual Studio .NET ekranında default olarak raporun taslak hali gelir. Bu ekranda raporun başlığından, oluşacak verilerin tasarımına kadar her şeyi belirleyebilirsiniz.



Data kısmı bizim raporun oluşması için kullandığımız sorguyu içerir.



Hatırlarsanız bu sorguyu rapor oluşturma sihirbazında yazmıştık. Buradan sorgunuzu değiştirebilirsiniz.

Son olarak da raporumuzun çıktısını görebileceğimiz Preview tabına tıklayın. Aşağıdaki gibi bir görüntü elde edersiniz.



Raporu Yayınlama (Publish-Deploy)

Peki oluşturduğumuz raporu web uygulamasında nasıl göstereceksiniz? İlk önce yarattığımız raporu build edeceğiz. Daha sonra raporun üstüne sağ tıklayıp seçeneklerder Deploy’u tıklayıp raporu sisteme atacağız. Fakat bunun için öncelikle deployment ayarlarını yapmalıyız.

Solution Explorer’daki projenin yazılı olduğu yere sağ tıklayıp Properties seçeneğini tıklayın karşınıza gelen pencerede şu ayarları yapın.



TargetServerURL kısmını yukarıdaki gibi http://localhost/ReportServer olarak girin. Burdaki önemli nokta web sunucunuzun ismi ne olursa olsun mutlaka ReportServer isminin yazılması gereğidir. TargetReportFolder ise deploy edeceğimizi raporu hangi dizin altına kopyalayacağımızı belirtir. Ben örnek olarak aspnedirRAPOR ismini girdim. Bu girdiğim ismi Report Server’ın web uygulamasında da yaratmamız gerekir. Bunu yapmak için öncelikle http://localhost/Reports yazarak web uygulamasına girin.



New Folder’a tıklayın ve gelen ekrana aspnedirRAPOR ismini yazın ve OK’e tıklayın



Daha sonra Visual Studio .NET’e geri dönün ve oluşturduğunuz raporun üstüne sağ tıklayın ve Deploy seçeneği ile raporunuzu aspnedirRAPOR dizinine atın.

Tekrardan http://localhost/Reports uygulamasını tarayıcınızın yardımıyla açın. aspnedirRAPOR linkine tıkladığınızda oluşturduğumuz raporun orada olduğunu görebilirsiniz. Şimdi sıra geldi bu raporu görüntülemeye bunun için rapora bir kere tıklamanız yeterli.

Makalenin boyutunun büyük olduğuna aldanmayın ve korkmayın, yaptığımız işlem oldukça basittir. Zaten bu adımlardan çoğunu ikinci veya daha fazla rapor oluşturduğunuzda yapmayacaksınız. Sadece Add New Report deyip adımları raporu oluşturacaksınız.

URL Rewrite Nasıl Yapılabilir?

URL rewrite yapmak için 1 den fazla yol olduğunu söylemek isterim.Bu yüzden makalenin başlığını "nasıl yapılır" değil "nasıl yapılabilir" olarak değiştirdim. URL Rewrite tekniği kısaca açıklamak gerekirse, sitemize ait URL lerin arama motorları için daha anlamlı ve şık hale getirmek amaçlı bir çalışmadır.Bu makalede IIS 6.0 ve IHttpHandlerFactory Interface'ini kullanarak şık URL ler yapacağız.

www.domain.com/makale.aspx?id=456 ( klasik URL )
www.domain.com/url-rewrite-teknigi-nasil-yapilabilir/456.article ( anlamlı bir url )

1.Uygulama
Uygulama tarafında yapmamız gereken öncelikle .makale uzantısı ile gelecek isteklerin çalıştırılacağı bir Interface'i ( IHttpHandlerFactory ) implemente eden bir kod yazmak. Aşağıdaki class ( www.domain.com/url-rewrite-teknigi-nasil-yapilabilir/456.makale ) URL ine cevap veren kod bloğudur.

public class myHandler : IHttpHandlerFactory
{
public myHandler()
{ // // TODO: Add constructor logic here // }

#region IHttpHandlerFactory Members
public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
{
// s1 ve s2 bize / ve . nın string içindeki indexlerini getiriyor. www.domain.com/url-rewrite-teknigi-nasil-yapilabilir/456.article
int s1 = context.Request.RawUrl.LastIndexOf("/");
int s2 = context.Request.RawUrl.LastIndexOf(".");

// s1 ve s2 indexleri arasında kalan string ifadeyi okuyalım
string sID = context.Request.RawUrl.Substring(s1 + 1, s2 - s1 -1);

//HttpContext ine ait context Nesnesinin RewritePath metodunu kullanarak
context.RewritePath(context.Request.RawUrl + string.Format("?id={0}", sID));

// Asıl işimizi yapacak olan sayfayı, PageParser sınıfının aşağıdaki metodu ile ilgili parametrelerle istiyoruz ve döndürüyoruz.
return PageParser.GetCompiledPageInstance("~/default.aspx", pathTranslated, context);
}

Web.config




...


2.IIS Ayarları
IIS 6.0 da uygulamanın properties ekranına gelip Configuration tıkladığımızda, karşımıza yeni extension ekleyebileceğimiz bir ekran çıkıyor. Bu ekranda Add diyerek .article extension ını ekleyebiliriz. Tabi executable seçeneğine C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll yazmayı unutmayalım. Çünkü bu extension da, tıpkı aspx gibi çalışacağından, bu uzantıdan gelen istekleri de aspnet_isapi.dll karşılayacak.



Ve işte uygulamamız çalıştı



Uploaded with ImageShack.us

RESOURCES VE LOCALIZATION

CLR , herhangi bir uygulama ile kaynakları paketlemek ve yayınlamak için bir mekanizmayı destekler. Kaynakları yönetmek ve erişmek için sunduğu sınıflar System.Resources ve System.Globalization ‘dur.

.NET Uygulamalarında Resources :

Uygulamalar, menü ikonları, menü başlıkları, vs çok sayıda image ve string kullanır. Bu string ve image ‘leri doğrudan kaynak koda dahil etmek pek iyi bir fikir değil. Değişiklik yapmak için kodu tarayıp adını değiştirmek zorunda kalmadan hepsini dosyalara koymak ve tek bir yerden değiştirmek daha esnektir.

•.NET Framework ve CLR buna destek veriyor : Her string, image ve diğer tip datayı buraya koyabiliriz. Uygulama binary ‘lerin içine derlenir ve başka deployement adımlara gerek kalmaz.
•Resources tanımlamaları .resx dosyalarında tanımlanır ve XML dosyalardır. String değerler ya da harici dosyalar için referanse içerirler. Bu string ve referanse edilmiş dosyalar, uygulama assembly ‘lerine embedded olarak derlenir.
•Resources ‘in kullanılabileceği birincil konu “localization”. Resources ‘i kullanarak, control property ‘leri için (mesela Label ‘in text ‘i) farklı kaynak dosyaları kullanabiliriz. Bunu uygulamanın destekleyeceği her culture için bir resource sayfası ile gerçekleştirebiliriz.
Her Resources dosyası key / value çiftleri içerir. Bu çiftler localized property ‘lerin ilgili culture ‘lerine çevrilirken kullanılır. Çalışma Zamanında, CLR İlişkili .resx dosyalarından uygun olanını yükler ve kontrol property ‘lerine set eder.

Web Uygulaması Localization :

Uygulamanın destekleyeceği her culture için kaynaklar yaratılır. Culture – Spesific Information belirtilmediği sürece default – culture ‘den okur.

CLR culture – spesific resources bulmak için davranış tanımlar. Buna göre, her kaynak set ‘i resorces file ‘ın adının ilk parçası doğrultusunda bir base name tanımlamak zorundadır. İsmin 2. parçası ise culture ‘ı tanımlar. Eğer belirtilmezse default culture kullanılır.

Örnek Uygulama : (Web Sayfalarında Localization Kullanımı)

Control Name Control ID Control Text
Label lblAnasayfa Anasayfa
DropDownList ddlLanguage Text Value
Türkçe Tr-tr
English En-us


DropDownList ‘in AutoPostBack özelliğini true yapın.
Yukarıdaki tabloda bulunan bilgilere göre Web Form oluşturunuz ve gerekli bilgileri ekleyiniz

Kod kısmında InitializeCulture() override edelim.

protected override void InitializeCulture()
{
string lang = Request["ddlLanguage"];
if (string.IsNullOrEmpty(lang))
kultur = "auto";
//Seçtiğimiz Dille İlgili Bilgilerin Yüklenmesi İçin Culture Dili Belirtiyoruz.
this.Culture = lang;
//Kullanacağımız Resources Dosyasının Adını Belirtiyoruz. Örn : Anasayfa.aspx.en-us.resx
this.UICulture = lang;base.InitializeCulture();
}

Localleşirme işlemini yapmak için Tools > Generate Local Resources tıklayın. İşlem tamamlandıktan sonra projemize App_LocalResources eklenmiştir ve WebFormAdı.Uzantısı. resx adında bir dosya vardır. Solution Explorer ‘dan projemizi kontrol ediniz ve dosyayı açınız çıkan sonuç aşağıdaki gibidir ben kendi Web Form ‘mumun adını Anasayfa.aspx verdim.



Şimdi gelelim english ayarlarını ayarlamaya.

App_LocalResources ‘a > Add New Item > Resource File seçiniz.
Adını WebFormAdı.Uzantısı.ddlLanguagedekiEngValuesi.resx (Anasayfa.aspx.en-us.resx) olarak verin. Anasayfa.aspx.resx ‘deki bütün alanları kopyalayıp Anasayfa.aspx.en-us.resx yapıştırın. Value ‘leri aşağıdaki gibi değiştirin.

.NET Uygulamalarında Flash Animasyon Dosyaları İle Haberlesmek

Bu yazımda .NET ile geliştirilen windows forms uygulamalarında swf dosyaları ile nasıl iletişim kurulacağını anlatmaya çalışacağım.

Macromedia flash animasyon dosyaları tasarım aşamasında .fla dosya uzantısını kullanır. Dağıtım ve yayınlama aşamasında çıktı olarak .swf dosya uzantısını alır.
.swf animasyon dosyaları web sayfalarında kullanılabileceği gibi windows uygulamalarında ActiveX teknolojisi aracılığı ile kullanılabilir.

İlk olarak yeni bir windows application uygulaması açıp uygulamamız içersine Shockwave Flash Object kontrolünü ekliyoruz. Action Script ve bu kontrolün FsCommand metodunu kullanarak flash dosyaları ile socket tabanlı iletişim kurabilmekteyiz.

Örnek uygulamada action script örnekleri en basit düzeyde ele alınmıştır. Profesyonel uygulamalarda action script ve .net entegrasyonu konusunda çok güzel çalışmalar ortaya çıkarılabilir.

Flash dosyasının oluşturulması

TextInput1 ve TextInput2 isimlerinde 2 adet TextInput kontrolü ve bir Buton ekliyoruz.

Layer1 içersine değişken tanımlaması yapıyoruz.

var dotnetGelenDeger = "" ;

Sahneye bir movie clip ekliyoruz. Aşağıdaki kodu movie clip içersine yazıyoruz.

onClipEvent (enterFrame)
{
_root.TextInput2.text = _root.dotnetGelenDeger;
}


Bu kod bir timer olarak düşünülebilir. dotnetGelenDeger isimli tanımladığımız değişkenin durumunu sürekli kontrol ediyor ve TextInput2 kontrolüne yazıyor.

Buton kontrolünün görevi ise TextInput1 kontrolü içindeki bilgiyi .NET içersine gönderiyor.
Bu buton altında yer alan kod


on(click){ fscommand("TextInput1_Degeri",_root.TextInput1.text);}

TextInput1_Degeri : Gönderilen parametre adı.
_root.TextInput1.text : Gönderilen değer. Bizim kullandığımız TextInput1 kontrolünün text değeri.

Windows Forms uygulamasının yapısı

private void Form1_Load(object sender, System.EventArgs e)
{
//swf dosyası konumu belirleniyor ve açılıyor.
axShockwaveFlash1.Movie = Application.StartupPath + "\\Ornek.swf";
axShockwaveFlash1.Play();
}
private void axShockwaveFlash1_FSCommand(object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEvent e) { if (e != null && sender != null) {
//Flash içerisinden gönderilen parametre if(e.command == "TextInput1_Degeri")
label1.Text = "Flash içerisinden " + e.args + " geldi";
//Gönderilen parametre değeri e.args }
}
//Flash içerisindeki dotnetGelenDeger değişkenine değer atama işlemi
private void button1_Click(object sender, System.EventArgs e) { axShockwaveFlash1.SetVariable("dotnetGelenDeger",textBox1.Text); }


Uygulamanın ekran görüntüsü


.NET 'te Şifreleme Sınıflarını Kullanmak

.NET platformu, kriptografik işlemler için kullanılabilecek zengin sınıflar içerir. .NET Platformunda kriptografik sınıfların çoğu, Windows Cryptographic Service Providers (Windows kriptografik servis sağlayıcılar) için yönetilen bir pakettir.

Hash Algoritmalarını Kullanmak :

Bir hash algoritması, uzunluğu belli olmayan bir dizenin içeriğini benzersiz şekilde şifreleyerek bir değer üretir.Hash değerleri bir dosya içindeki değişiklikleri tespit etmek için kullanışlıdır. Dosyanın durumunun herhangi bir anda fotoğrafını çekme imkanı sunar. Bu Sayede bir önceki hash değerleri ile dosyanın o andaki hash değerlerini karşılaştırarak dosyada değişiklik yapılmışmı yapılmamışmı öğrenebilirsiniz.

.NET platformu içindeki sınıflar, aşağıdaki hash algoritmalarını kullanmaktadır.

•MD5 - 128-bit hash değeri üretmektedir. MD5CryptoServiceProvider sınıfı tarafından uygulanmaktadır.

•SAH1 - 160-bit hash değeri üretmektedir. SHA1CryptoServiceProvider ve SHA1Managed sınıfları tarafından uygulanmaktadır.
•SHA256 - 256-bit hash değeri üretmektedir. SHA256CryptoServiceProvider ve SHA256Managed sınıfları tarafından uygulanmaktadır.
•SHA384 - 384-bit hash değeri üretmektedir. SHA384CryptoServiceProvider ve SHA384Managed sınıfları tarafından uygulanmaktadır.
•SHA512 - 512-bit hash değeri üretmektedir. SHA512CryptoServiceProvider ve SHA512Managed sınıfları tarafından uygulanmaktadır.
Not : MD5 en hızlı fakat en az güvenli algoritmadır. Her SHA algoritması daha güvenlidir ama daha falza hesaplama gerektirmektedir.

ÖRNEK:

static byte[] ByteDonustur(string deger)
{
char[] arrayChar = deger.ToCharArray();
byte[] arrayByte = new byte[arrayChar.Length]; for (int i = 0; i < arrayByte.Length - 1; i++) arrayByte[i] = Convert.ToByte(arrayChar[i]); return arrayByte; } static void Main(string[] args) { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] deger = ByteDonustur("ABCDEFG"); byte[] sonuc = md5.ComputeHash(deger); Console.WriteLine(BitConverter.ToString(sonuc)); Console.ReadLine(); } İşleminden çıkan sonucun değeri.

Burada dikkat edilmesi gereken hususlara gelecek olursak ComputeHash() Metoduna bir dizeyi doğrudan geçiremezsiniz. ByteDonustur() Metodu kullanılarak dize ComputeHash() verilmeden önce byte dizisine dönüştürülmektedir.ComputeHash() metodu tarafından geri döndürülen byte dizisi BitConverter sınıfı ile dizeye geri dönüştürülmektedir.

SİMETRİK ŞİFRELEME ALGORİTMALARI

Bir veriyi simetrik bir veri algoritması ile şifrelediğinizde gönderici ve alıcının aynı şifre çözücü anahtara sahip olmak zorundadır. .NET platformundaki sınıflar aşağıdaki simetrik algoritmaları desteklemektedir.


•DES - Birleşik Devletler Veri Şifreleme Standartı (Data Encryption Standart) : Bu algoritma DESCryptoServiceProvider sınıfı tarafından uygulanmaktadır.


•Triple DES - DES algoritması sıralı şekilde üç farklı şifreleme anahtarı ile uygulanır. Bu algoritma TripleDESCryptoServiceProvider sınıfı tarafından uygulanmaktadır.


•RC2 - RC2 Blok Şifresi (Block Cipher). Bu algoritma RC2CryptoServiceProvider sınıfı tarafından uygulanmaktadır.


•Rijndael - İleri Düzey Şifreleme Standartı tarafından kullanılan algoritmadır. Bu algoritma RijndaelManaged sınıfı tarafından uygulanmaktadır.
Örnek : SimetrikWrite.cs class SimetrikWrite
{
const string desKey = "12345678";
const string desIv = "ABCDEFGH";
static byte[] ByteDonustur(string deger)
{
char[] arrayChar = deger.ToCharArray();
byte[] arrayByte = new byte[arrayChar.Length] for (int i = 0; i < arrayByte.Length; i++) arrayByte[i] = Convert.ToByte(arrayChar[i]); return arrayByte; } static void Main(string[] args) { byte[] arrayDESKey = ByteDonustur(desKey); byte[] arrayDESIV = ByteDonustur(desIv); byte[] arrayInput = ByteDonustur("Merhaba Dünya"); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); //Formun en üstünde desKey ve desIv isimli iki tane sabit var. DESCryptoServiceProvider sınıfı ile veriyi //şifrelediğinizde hem gizli bir anahtar hem de bir ilk değer vektörü sağlamalısınız çünkü yarattığınız dosyadaki //şifreyi çözmek istediğinizde ihtiyaç duyacaksınız. Bu dizilere istediğiniz 8 karakter dizesini atayabilirsiniz. ICryptoTransform cEncryptor = des.CreateEncryptor(arrayDESKey, arrayDESIV); CryptoStream cStream = new CryptoStream(new FileStream("c:\\simetrik.text", FileMode.Create, FileAccess.Write), cEncryptor, CryptoStreamMode.Write); cStream.Write(arrayInput,0,arrayInput.Length); cStream.Close(); Console.ReadLine(); }} Örnek : SimetrikRead.cs class SimetrikRead { //Bu sabitlerin değeri SimetrikWriter Dosyasındaki desKey ve desIv sabitleri ile uyuşmalıdır. const string desKey = "12345678"; const string desIv = "ABCDEFGH"; static byte[] ByteDonustur(string deger) { char[] arrayChar = deger.ToCharArray(); byte[] arrayByte = new byte[arrayChar.Length]; for (int i = 0; i < arrayByte.Length; i++) arrayByte[i] = Convert.ToByte(arrayChar[i]); return arrayByte; } static void Main(string[] args) { byte[] arrayDesKey = ByteDonustur(desKey); byte[] arrayDesIv = ByteDonustur(desIv); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); ICryptoTransform cDecryptor = des.CreateDecryptor(arrayDesKey,arrayDesIv); CryptoStream cStream = new CryptoStream(new FileStream("C:\\simetrik.text", FileMode.Open), cDecryptor, CryptoStreamMode.Read); Console.WriteLine(new StreamReader(cStream).ReadToEnd()); Console.ReadLine(); }} ASİMETRİK ŞİFRELEME KULLANMAK Simetrik şifreleme algoritması kullandığımız zaman, uygulamayı kullananların aynı ortak şifre çözücü anahtara sahip olmaları gerekir. Asimetrik şifreleme algoritması kullandığınız zaman veriyi şifrelemek ve çözmek için kullanılan anahtar farklıdır. Asimetrik şifreleme algoritmaları bir anahtar çifti kullanır. Eğer veriyi bir anahtar ile şifrelediyseniz çözmek için diğer anahtarı kullanırsınız. .NET platformundaki sınıflar aşağıdaki asimetrik algoritmaları desteklemektedir. •DSA - Dijital İmza Algoritması(Digital Signature Algorithm - Birleşik Devletler Hükümetinin Dijital Doğrulama Standartı). DSACryptoServiceProvider sınıfı tarafından uygulanmaktadır. •RSA - Bu Algoritma, RSACryptoServiceProvider sınfı tarafından uygulanmaktadır. Her iki metodta AsymmetricAlgorithm sınıfında uygulanmaktadır. Bu yüzden aynı metod ve özelliklerin bir çoğunu paylaşmaktadırlar. Sınıflardan herhangi birisini yaratırsanız, genel ve özel anahtarları otomatik olarak üretilir.Genel veya özel anahtara ToXmlString ya da ExportParameters metotları ile erişebilirsiniz. ToXmlString metodu, genel ve özel anahtarları XML dizesinde tutar. Aşağıdaki örnekte DSACryptoServiceProvider sınıfını yaratıp özel ve genel anahtarlarını görüntülemektedir. DSACryptoServiceProvider dsa = new DSACryptoServiceProvider(); Console.Write("Özel Anahtarlar : "); //Özel Anahtarı Görüntülemek İçin true Console.WriteLine(dsa.ToXmlString(true)); Console.Write("Genel Anahtarlar : "); //Genel Anahtarı Görüntülemek İçin false Console.WriteLine(dsa.ToXmlString(false)); İşlemin sonucunda aşağıdakine benzer bir çıktı üretecektir.

Örnek : AsimetrikWrite.cs
class AsimetrikWrite
{
static void Main(string[] args)
{ byte[] dizi = {1,2,3,4,5,6,7} RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] sonucEncrypt = rsa.Encrypt(dizi,false);
for(int i = 0; i < sonucEncrypt.Length; i++) Console.Write(sonucEncrypt[i] + " "); }} Çıktı Sonucu Aşağıdaki Gibi Olmalıdır.




class AsimetrikRead { static void Main(string[] args) { byte[] dizi = {1,2,3,4,5,6,7}; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); byte[] sonucEncrypt = rsa.Encrypt(dizi,false); for(int i = 0; i < sonucEncrypt.Length; i++) Console.Write(sonucEncrypt[i] + " "); Console.WriteLine("\n\n"); byte[] sonucDecrypt = rsa.Decrypt(sonucEncrypt,false); for(int i = 0; i < sonucDecrypt.Length; i++) Console.Write(sonucDecrypt[i] + " "); Console.ReadLine(); }} Decrypt İşleminin Sonucu Aşağıdaki Gibi Olmalıdır.
Bing'ı Seviyoruz. :)
Google'ı Seviyoruz. :)