Bu
yazımda sizlere Xml Web Servisleri ve ASPdotNET ile basit bir dosya transfer
uygulamasi yapmaya çalışacağız. İşe veritabanımızı oluşturmayla başlayalım :
1- ) SQL server da CsharpNedir adinda yeni bir veritabani olusturalim.
2- ) Olusturdugumuz bu veritabaninda ;
Yukardaki
şekilde bir tablo oluşturduktan sonra Kayıt etme işlemi için aşağıdaki
Stored Procedure'umuzu yazalım
3-)
CREATE
Procedure sp_DosyaYukle
(
@Adi nvarchar(100),
@Turu nvarchar(50),
@Boyut int,
@Dosya image
)
AS
INSERT INTO tbl_Dosya(Adi,Turu,Boyut,Dosya)
VALUES (@Adi,@Turu,@Boyut,@Dosya)
GO |
Yukardaki
saklı yordamda ikkat ettiyseniz Tarih alanını yazmadım çünkü
zaten kayit eklendiğinde mevcut bir tarih girilceği için yani her kayıtta
bunu tabloyu olustururken varsayilan(default) değer olarak getdate() fonksiyonunu
yazdim. Böylece program içinde ikinci bir defa kayıt etme işlemi
ile uğraşmak zorunda kalmayacağım.
Yukardaki şekilde veritabanımız oluşturduktan sonra sıra web servisimizi yazmaya
geldi. VS.NET editörümüzde C# dili ile bir web servisi projesi
açalım. Projemizin adini CsharpNedir olarak verelim;
Daha
sonra sql server sunucusuna erişim yapabilmek için web.config dosyasında
tanımladığımız baglantı cümlesi anahtar kelimesine erişim yapabilmek için.
using
System.Configuration
isimuzayını(namespace) ve sql server üzerine islem yapabilmek için
ise
using System.Data.SqlClient
isimuzayını(namespace) ini referans olarak belirleyelim.
Şimdi
veritabanina kayit eklemek için kullanacağımız metodumuzu yazalım.
[WebMethod(Description="Veritabanina
dosya yükleme yapabileceğiniz metod.")]
public string DosyaYukle(string
Adi,string Turu,int Boyut,byte[]
Dosya)
{
string IslemSonucu
= string.Empty;
SqlConnection baglanti = new
SqlConnection(strCon);
SqlCommand komut = new
SqlCommand();
komut.CommandText = "sp_DosyaYukle";
komut.CommandType = CommandType.StoredProcedure;
komut.Connection = baglanti;
baglanti.Open();
#region sqlparametre
lerin doldurulmasi
komut.Parameters.Add(new SqlParameter("@Adi"
,SqlDbType.NVarChar,100
ParameterDirection.Input,false,0,0,"",DataRowVersion.Proposed,Adi));
komut.Parameters.Add(new SqlParameter("@Turu"
,SqlDbType.NVarChar,50
ParameterDirection.Input,false,0,0,"",DataRowVersion.Proposed,Turu));
komut.Parameters.Add(new SqlParameter("@Boyut"
,SqlDbType.Int,4
ParameterDirection.Input,false,0,0,"",DataRowVersion.Proposed,Boyut));
komut.Parameters.Add(new SqlParameter("@Dosya"
,SqlDbType.Image,16
ParameterDirection.Input,false,0,0,"",DataRowVersion.Proposed,Dosya));
#endregion
try
{
komut.ExecuteNonQuery();
baglanti.Close();
return
IslemSonucu = "Kayit yapilmistir";
}
catch(Exception ex)
{
return
IslemSonucu = "Hata olustur : " + ex.Message;
}
} |
Yukaridaki fonksiyon ile veritabanına kayıt yapıldı veya yapılmadıysa olusan
hatayı string olarak göndürebilmesi için string türünde
tanımladım. Niçin string olarak tanımladığımı konumuzun ilerleyen bölümünde
açıklayacağım. Simdi metodumuzu inceleyelim. Veritabanımıza yükleyecegimiz
dosyamızın adını, türünü, boyutunu ve dosyamızı kayıt edebilceğimiz
parametrelerimizi yazdık. Daha sonra fonksiyon içinde sqlconnection sınıfından
bir baglantı nesnesi kurduk daha sonra sqlcommand ile veritabanımızda belirttiğimiz
bir storedprocedure'u işlem yapabilmek için
komut.CommandText = "sp_DosyaYukle";
komut.CommandType = CommandType.StoredProcedure;
komut.Connection = baglanti;
Yukarıdaki SqlCommand nesnemizden türettigimiz komut nesnemizin CommandText
özelliğine kullanmak istediğimiz stored procedure'umuzun adını, CommandType
özelligine ise StoredProcedure, Text veya TableDirect türünü
belirtiyoruz. Biz StoredProcedure kullandığımiz için StoredProcedure
seçeneğini kullandık.
Ve
kayıt işlemlerimizi yapmak için komut nesnemize parametre olarak alanlarımızı
ve değerlerimizi yazıyoruz. Kayıt etme fonksiyonumuz bittikten sonra bilgileri
görmek için geriye dataset döndürecek bir fonksiyon daha
yazıyoruz.
[WebMethod(Description
= "Kaydettiginizi veritabanina eklediginiz verileri dataset olarak
islem yapabilirsiniz")]
public DataSet DosyaGoster()
{
SqlConnection baglanti = new
SqlConnection(strCon);
baglanti.Open();
SqlDataAdapter dataadapter = new
SqlDataAdapter("SELECT Adi,Boyut,Tarih FROM tbl_Dosya",baglanti);
DataSet dset = new
DataSet("tbl_Dosya");
dataadapter.Fill(dset,"tbl_Dosya");
baglanti.Close();
return dset;
} |
Şekil – 1
Yukarıdaki
metod ile tbl_Dosya tablosundaki tüm kayitlari dset dataset nesnemize yüklüyoruz.
Bu şekilde servisimiz bittikten sonra(Sekil - 1) projemize bir adet asp.net
projesi ekleyelim. Projemizin adını CsharpNedirWebUI olarak belirleyelim.
Sayfa üzerinde kullanacağımız kontroller;
1 – 1 adet Label nesnesi
2 – 1 adet HtmlFile nesnesi
3 – 1 adet Buton nesnesi
4
– 1 adet Datagrid nesnesi (Sekil – 2 )
Şekil – 2
Yukarıdaki
gibi nesnelerimizi form üzerine yerleştiriyoruz. Daha sonra projemize Solution
explorer penceresinden Add WebReferance diyerek web servisimizi referans veriyoruz.
(Şekil – 3)
Şekil – 3
Yukaridaki
şekilde işaretlemiş oldugum yerlerde ilk önce CsharpNedirWebUI projemize
Add WebReferance veriyoruz ben CsharpNedirWebServisi oalrak verdim
daha sonra 2. seçenek te ise bu servisi proje içinde kullanabilmek
için projemin adi “.” Referans verdiğim servisin adı şeklinde referans
veriyorum yani
using CsharpNedirWebUI.CsharpNedirWebServisi;
şeklinde verdikten sonra;
proje içinde Servise erişim yapabilmek için
private DosyaTransferServisi servisim = null ;
şeklinde sayfa içinde her yerde kullanılabilir türde servisim nesnesini
tanımlıyoruz.
Sayfa içinde kullanılacak Alert metodu için ;
public
void
Alert(string text)
{
AddStartupScript("OnClick", "alert(\""
+ text + "\");");
}
private
void
AddStartupScript(string name, string
script)
{
script = "";
this.Page.RegisterStartupScript(name,
script);
}
|
Servisimizde
kayıt ekleme fonksiyonunu string olarak tanımlamamdaki sebep proje içinde
bu servisi kullanırken bir alert ile veya messagebox ile geriye sonucu uyarı
seklinde göstermesini saglamaktı.
Şimdi kaydet butonuna tıkladığımızda yazacağımız servisimize gidecek parametrelerimizi
yazalım;
private
void btnKaydet_Click(object
sender, System.EventArgs e)
{
servisim = new
DosyaTransferServisi();
if(flDosya.PostedFile != null)
{
HttpPostedFile
dosyalar = flDosya.PostedFile;
string
dosyaAdi = dosyalar.FileName;
string
turu = dosyalar.ContentType;
int
boyut = dosyalar.ContentLength;
byte[]
dosya =new byte[boyut];
dosyalar.InputStream.Read(dosya,0,boyut);
string sonuc
= servisim.DosyaYukle(System.IO.Path.GetFileName(dosyaAdi),turu,boyut,dosya);
Alert(sonuc);
}
}
|
Yukarıdaki metodumuzu yazdığımızda servisim.DosyaYukle fonksiyonuna flDosya
nesnesinden seçtigimiz dosyanın, Adi,Tipi,Boyutu ve Dosya olarak belirttiğim
değişkenlere atayarak bunu servis fonksiyonuna gönderiyorum. Gönderme
işlemi sırasında servis işleniyor ve geriye dönebilecek iki sonuç string
olarak tanımladığım değişkenime geliyor. Daha sonra bu sonuç değişkenini Alert
metodunda kullanarak "kayıt edildi" veya "kayıt edilmedi"
şeklinde bir uyarı alıyorum.
Yazım
burada bitmiştir. Kısaca ne yaptığımızı açıklayacak olursak;
1- ) Web servislerini her yerde kullanabilirsiniz.
2-
) Web servislerine windows uygulamalarından erişim yaparken varsayılan olarak
httpGet ve httpPost metodları kapalı olarak gelir. Bunu aşmanın yolu web.config
dosyasında
tanımlamasını yapmamız gerekiyor ama microsoft bunu tavsiye etmiyor.
Sorularınız için mail adresimden irtibata geçebilirsiniz.
Örnek kaynak dosyalarını indirmek
için tıklayın.
Eray Çakır
[email protected]
Makale:
Web Servisleri ile Dosya Transferi Yapmak XML ve Web Servisleri Eray Çakır
|