C# - Állomány feltöltése web szervizen keresztül

forráskód letöltése
A web szervizek általában adatot szoktak szolgáltatni. Ez viszont nem jelenti azt, hogy nem készíthetnénk olyan web szervizt, mely inkább fogadja az adatokat, sem mint küldi. És ha már fogadja az adatot, akkor ez az adat miért ne lehetne akár egy egész állomány.
Mellékelt példában egy olyan web service-t készítünk, melynek függvényével képesek vagyunk feltölteni egy tetszőleges típusú és méretű állományt a web szervizt futtató szerverre.
A mellékelt példa megnyitása előtt hozzon létre egy UploadFile nevű webes megosztású könyvtárat! (Intézőben jobb gomb az UploadFile mappán, Tulajdonságok menüpont, majd a Webmegosztás lapon engedélyezzük a megosztást.)
A futtatásához szükségessé válhat az alapértelmezésben a C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\CONFIG könyvtárban lévő machine.config állományban a processModel bejegyzésnél a userName attribútum system értékre történő változtatása. Ezek után indítsuk újra a gépet. A system felhasználóval futtatva a rendszerünket, magasabb privilégiumokat kap alkalmazásunk, míg a machine user esetén az ASPNET felhasználóval történik a futtatás, mely alacsonyabb jogokkal rendelkezik.
A web szerviz elkészítése
Készítünk egy UploadFile nevű függvényt, mely két paramétert vár. Az elsőben kell megadnunk egy állomány nevet és elérési útvonalat. A web szervizt futtató gépen ez az állomány kerül létrehozásra és így ide kerül a feltöltött állomány. A második paraméterben egy bájtokat tartalmazó tömböt adunk át, melyben az állomány bájtjai kapnak helyet.
    [WebMethod]
    public string UploadFile(string filename, byte[] file)
    { 
A kapott tömböt egy memória stream-re mentjük, majd létrehozzuk a fizikai állományt.
        MemoryStream ms = new MemoryStream(file);
        FileStream fs = new FileStream(filename, FileMode.Create);
A létrejött új állományba pedig egyszerűen beleírjuk a memória stream tartalmát.
        ms.WriteTo(fs);
        ms.Close();
        fs.Close();
        return "Az állomány feltöltése sikeres volt!";
        ...
A teszt alkalmazás elkészítése
A Web Service elkészülte után fordítsuk le azt, majd hozzunk létre egy Windows-os alkalmazást. Szükségünk lesz egy proxy osztályra, melyen keresztül a Web Service-t könnyedén elérhetjük. Ehhez a WSDL.EXE parancssori alkalmazás segít bennünket. Ha kiadjuk az alábbi utasítást, akkor létrejön egy Service1.cs forráskód, melyben adott lesz a Web Service eléréséhez szükséges objektum.
wsdl http://localhost/UploadFile/Service1.asmx?wsdl
A localhost helyett természetesen más is állhat attól függően, hogy a Web Service hol lett publikálva. A WSDL könnyebb eléréséhez használjuk a Visual Studio.NET Command Prompt-ot.
Ezek után egy állomány feltöltése a web szervizen keresztül a következőképpen zajlik: megnyitunk egy állományt a FileStream osztállyal és beolvassuk azt egy bájtokat tartalmazó tömbbe.
    private void button1_Click(object sender, System.EventArgs e)
    {
      FileStream fs = File.Open("c:\\autoexec.bat", FileMode.Open, FileAccess.Read);
      byte[] b = new byte[fs.Length];
      fs.Read(b, 0, Convert.ToInt32(fs.Length));
Létrehozunk egy új példányt a web szervizből és az UploadFile függvényt meghívva átadjuk a bájtokat tartalmazó tömböt.
      Service1 s = new Service1();
      label1.Text = s.UploadFile("c:\\_autoexec.bat", b);
      fs.Close();
    }     
A teszt alkalmazás futtatása előtt ellenőrizze, hogy a C: meghajtón van-e autoexec.bat állomány. Ha nincs, akkor változtassa meg a forráskódot egy tetszőleges létező állományra.
A példa kipróbálása után a C: meghajtón lévő autoexec.bat kerül feltöltésre a web service-t futtató számítógépre, ahol létrejön egy _autoexec.bat állomány.