Web Service ve Generic Handler Dosyalarında Session Kullanımı

Bir çok kez ihtiyacım olan ve her seferinde de unuttuğum bir konuyu buraya yazayım dedim, böylece hem elimin altında olsun hem de başka arayanlar olursa yardımı dokunsun istedim; Web Service (.asmx) ve Generic Handler (.ashx) dosyalarında Session kullanımı.

Konuya dönecek olursak, Web Service`lerde Session kullanabilmek için yapmamız gerekenler şöyle;

Yeni bir Web Service dosyası oluşturduğunuzda, dosyanızda aşağıdaki gibi “Hello World” adında hazır bir fonksiyon yer alır.

<WebMethod()> _
Public Function HelloWorld() As String
Return “Hello World”
End Function

Bu fonksiyon içerisinde Session kullanabilmek için tek yapmanız gereken şöyle; “<WebMethod()>_” yazan yeri “<WebMethod(EnableSession:=True)> _” veya “<WebMethod(True)> _” şeklinde değiştirmeniz yeterli olacaktır. Bu değişikliği Web Service dosyanızda yer alan ve içerisinde Session kullanmak istediğiniz tüm fonksiyonlara uygulamanız gerekli.

Generic Handler dosyalarında ise durum biraz daha farklı. Burada fonksiyonlara değil tüm Class bazında Session kullanımını aktif yapıyoruz. O da şu şekilde yapılıyor;

Yeni bir Generic Handler dosyası oluşturduğunuzda, dosyanız aşağıdaki gibi bir yapıya sahip olur;

Public Class Handler : Implements IHttpHandler

Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
context.Response.ContentType = “text/plain”
context.Response.Write(“Hello World”)
End Sub

Generic Handler dosyanızda Session kullanabilmek için yapmanız gereken ise şöyle; “Public Class Handler : Implements IHttpHandler” yazan yeri “Public Class Handler : Implements IHttpHandler, IRequiresSessionState” olarak değiştirerek IRequiresSessionState`i dosyanıza implement etmeniz yeterli olacaktır.

Bu şekilde Web Service ve Generic Handler dosyalarımızda Session kullanımını etkinleştirmiş olduk, umarım yardımı dokunur.

Web Service ve Generic Handler Dosyalarında Session Kullanımı” üzerine 15 düşünce

  1. Generic Handler dosları için IRequiresSessionState yapıldıgında sadece Explorerde çalışıyor diğer tarayıcılarda iş görmüyor…

  2. Umarım ben yanılıyorumdur. Hiç test ettinizmi firefox, crome yada opera ile.

    Jquery kullanarak Generic Handler dosyası aracılıgı ile resim upload eden bir sistem hazırlarken en son çareyi Generik Handlere kullanıcının id değerini sessionla alamadığım için data şeklinde göndererek çözmüştüm. İlk olarak explorerde çalışan sayfa diğer tarayıcılarda test ettiğimde çalışmadığını frkedince böyle yapmıştım. Nasıl yapabilirim diye araştırma yaparken burayı bulmuş burda anlatılanlarıda daha öncesinde zaten uygulamıştım. Bence sizde bir test etmelisiniz…

  3. Senin yorumun üzerine “acaba” diyerek denedim tüm tarayıcılarda.
    Bu son yorumun üzerine “Javascript/jQuery” ile bir alakası olabilir mi diye düşünüyorum ama hiç ihtimal vermiyorum hala çünkü ilk yorumda da dediğim gibi yazıda bahsedilen session, server tarafında saklanan bir şey.

    Fırsat bulabilirsem “Javascript/jQuery” ile de denerim.

  4. Şimdi bu yorumunuzdan sonra
    Public Class Handler : Implements IHttpHandler, IRequiresSessionState

    yaparak tekrar deneyeceğim. :)

  5. Denedim :(

    Public Class Upload : Implements IHttpHandler, IRequiresSessionState

    Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
    Dim msj As String = “”
    ‘System.Threading.Thread.Sleep(1000)
    Try
    Dim strUserId As String = context.Request.Form(“uid”)
    ‘Dim strUserId As String = context.Session(“UserId”)
    Catch ex As Exception
    End Try
    End Sub

    Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
    Get
    Return False
    End Get
    End Property
    End Class

    Session satırındaki strUserId tanımını kullanacak olursam Firefoz sessionu okumuyor. Benim firefoxtamı bi sorun var acaba :)

  6. Merhaba,
    http://www.uploadify.com/ bu sitedeki upload script’i ile upload denemeleri yaptıgımda, IE ile testler başarılı olurken, FF, Crome, Opera ile yapılan testlerin başarısız oluduğunu gördüm. Sorunun session ile ilgili olduğunu tespit ettim. FF,Crome, Opera tarayıcılarında session her defasında null değer alıyor. Nedeni olarak da kullandığım upload script’inin flash ile post işlemini gerçekleştirmesi. Flash ile yapılan post işleminde session bilgileri FF, Crome, Opera gibi tarayıcılarda null olarak değer alıyor.

    Web.config içerisine aşağıdaki satırı eklediğinizde sorun ortadan kalkıyor, ancak bu kez web adresi satırına session id’si yazılıyor.

    Bilgilerinize.

  7. Bende ne kadar araştırma yaptıysam başarılı olamadım.Örneğin kullanıcı girişi yaptıkdan sonra handler dosyasından bunu okumaya(oluşturduğum sessionu) ama olmuyor okadar site gezdim herkes başına şunu ekle olur.Olmuyor rica etsem tam bir açıklama yapabilecek var mı?

  8. Ben Web.Config’e aşağıdaki satırı ekleyerek kendi sorunumu çözümledim. Belki sizlere de faydası dokunabilir.

    Web.Config

    Bilgilerinize

  9. Yorumları yazdığım bu ekranda bazı kodlar engellediğinden ilk mesajımda gönderdiğim çözüm satırı gösterilmemiş. Aşağıda yazdığım satırların sonuna küçük () işaretlerini eklemeyi untumayın :)

    sessionState mode=”InProc” cookieless=”true” /

    İyi çalışmalar

  10. Uploadify ile FF, Opera, Crome tarayıcılarında session kullanabilmek için şöyle bir yöntem de kullanabilirsiniz.

    1 – MasterPage dosyanızın head tagları arasına aşağıdaki satırları ekleyin (blog üzerindeki filtrelemelerden dolayı bazı işaretler gizleniyor, haberiniz olsun)
    script type=”text/javascript”
    var auth = “”;
    var ASPSESSID = “”;
    /script

    2- Upload işlemini üslenecek .ashx dosyanızın içeriği şöyle
    public class UploadScreenShots : IHttpHandler, IRequiresSessionState
    {
    public void ProcessRequest(HttpContext context)
    {

    bool isUploded = false;

    try
    {
    // Burada ne yapmak istiyorsanız onu yapın :)
    List photoList = GetUploadedFiles(context, imageType);

    }
    catch
    {

    }

    if (isUploded)
    {

    context.Response.ContentType = “text/html”;
    context.Response.Write(“1”);
    }
    else
    {
    context.Response.ContentType = “text/html”;
    context.Response.Write(“0″);
    }
    }

    public List GetUploadedFiles(HttpContext context, ImageType imageType)
    {
    List photoList = new List();

    foreach (string file in context.Request.Files)
    {
    HttpPostedFile hpf = context.Request.Files[file];
    if (hpf.ContentLength == 0)
    continue;
    var contentType = hpf.ContentType;
    var data = new Byte[hpf.ContentLength];
    hpf.InputStream.Read(data, 0, hpf.ContentLength);

    UploadImages photo = new UploadImages();
    photo.ID = Guid.NewGuid();
    photo.FileData = data;
    photo.ContentType = contentType;
    photo.FileName = hpf.FileName;
    photo.FileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(hpf.FileName);
    photo.FileExtention = System.IO.Path.GetExtension(hpf.FileName).ToLower();
    photo.CreatedDate = DateTime.Now;
    photoList.Add(photo);
    }

    return photoList;
    }

    public bool IsReusable
    {
    get
    {
    return false;
    }
    }
    }

    3- Upload işleminini yapacak (javascript) .js dosyamız ve aspx tarafındaki html kontrolümüz

    input id=”FileUploadRgb” type=”file” /

    // File Upload for RGB
    $(‘#FileUploadRgb’).uploadify({
    ‘uploader’: ResolveUrl(‘~/sitemanager/assets/js/jqplugin/uploadify/uploadify.swf’),
    ‘script’: ResolveUrl(‘~/sitemanager/handler/UploadImage.ashx’),
    ‘cancelImg’: ResolveUrl(‘~/sitemanager/assets/js/jqplugin/uploadify/cancel.png’),
    ‘folder’: ResolveUrl(‘~/uploads’),
    ‘auto’: true,
    ‘fileExt’: ‘*.jpg;*.jpeg;*.gif;*.png’,
    ‘fileDesc’: ‘Web Image Files (.JPG, .GIF, .PNG)’,
    ‘buttonText’: getLocalizedString(“UploadBrowseTitle”),
    ‘scriptData’: { ‘ImageType’: 0, ‘ASPSESSID’: ASPSESSID, ‘AUTHID’: auth }, // ek parametre gönderimi Request.Form ile alınabiliyor, // parametre 0 ise Rgb image upload ediliyor
    //’multi’: true, // çoklu dosya gönderimi aktif/pasif
    //’queueSizeLimit’: 3, // çoklu dosya gönderiminde max seçilebilecek dosya sayısı
    //’simUploadLimit’: 2, // aynı anda (simüle edilecek) gönderim yapılacak dosya sayısı
    ‘sizeLimit’: 2048000, // upload edilebilecek max dosya boyutu (byte cinsinden) suan 2MB
    //’width’: 250 // upload flash’ının genişliği
    //’wmode’: ‘transparent’, // flash transparan özelliği
    ‘onComplete’: function (event, ID, fileObj, response, data) {
    //alert(‘There are ‘ + data.fileCount + ‘ files remaining in the queue.’);

    // resmin ekrana basıldığı satır
    $(“#spnMessage”).html(“mesaj : ” + data.fileCount);
    $(“#imgRgb”).attr(“src”, ResolveUrl(“~/sitemanager/handler/showimage.ashx?ImageType=0&ts=” + TimeStamp()));
    $(“#imgRgb”).show();
    }
    });

  11. selam,
    4-5 saattir tırmalıyorum, şöyle bir durum var
    handler’a IRequiresSessionState ekledim
    uploadify ile dosya yükleyip dosya adını session’a atıyorum, handler’ın kendi içinde son yok kullanıyorum ama handler’dan gelen cevaba göre javascriptle bir sonraki adıma geçiyorum ve buradaki aspx sayfasında session’a erişemiyorum nesne dispose olmuş görünüyor, bakmadığım yer kalmadı çözemedim, öneriniz var mı?

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir