Jussi Seppälä's profile.NET kehitystäPhotosBlogLists Tools Help
    October 03

    WCF ja sessiot

    Windows Communication Foundation (WCF) tarjoaa mahdollisuuden hyödyntää sessiopohjaisia yhteyksiä. Erityisesti kun käytetään transaktioita (transactionFlow), suositellaan käytettäväksi myös ReliableSession-määritystä. Tällöin sessioita luonnollisesti käytetään. 
     
    Asiakaspuolella hyödynnetään usein ChannelFactory:ä, jolla tarvittavan proxy-luokan voi helposti luoda. Tässä on kuitenkin yksi huono puoli: se ei tarjoa Close() -metodia, jolla session voisi sulkea kun pyyntö on suoritettu. Tässä tapauksessa sessio vapautetaan vasta kun Timeout tapahtuu. (Oletusarvo taitaa olla 10 minuuttia.) Tällä tietysti voi olla huomattavia vaikutuksia resurssien käyttöön ja sessioiden varaamiseen. Session timeoutin voi toki myös määritellä esim. konfiguraatiotiedostossa binding-elementin receiveTimeout-attribuutilla.
     
    Em. tapa on huono, koska se ei vapauta käyttämättömiä resursseja heti kun mahdollista. Oikeampi tapa toimia olisi sulkea sessio heti kun sitä ei enää tarvita. Mainio tapa toteuttaa tämä on hyödyntää geneeristä ClientBase-luokkaa. (http://msdn2.microsoft.com/en-us/library/ms576141.aspx) Käytännössä sitä käytetään niin, että luodaan uusi luokka, joka kytketään palvelun tarjoamaan rajapintaan:
     
    esim.
    private class MyProxy : ClientBase<IMyService>, IMyService
     
    Tämän jälkeen ko. proxy-luokka toteuttaa rajapinnan metodit suunnilleen seuraavasti:
     
    public string HelloWorld()
    {
       return base.Channel.HelloWorld();
    }
     
    Kun tällaista proxy-luokkaa käytetään asiakassovelluksessa, niin nyt tarjolla on Close() -metodi, jolla session voi sulkea. Helpoin tapa on kuitenkin käyttää proxy-luokkaa Using-lohkon sisällä, jolloin Close() -metodia ei tarvitse erikseen kutsua.
     
    esim.
     
    using (MyProxy proxy = new MyProxy("configname"))
    {
        return proxy.HelloWorld();
    }