C# - Képek letöltése a Microsoft WSE segítségével

forráskód letöltése
Képek mozgatására a szerver és a kliens-alkalmazás közt számtalan módszer létezik. Amennyiben WebService alkalmazás egy metódusának segítségével szeretnénk egy képet letölteni a klienshez, akkor is van választási lehetőségünk. A Microsoft, WSE (Web Services Enhancements for Microsoft .NET) nevet viselő csomagjának segítségével még azt a fáradságot is megspórolhatjuk, hogy a szerviz által szolgáltatott bájtfolyam értelmezését elvégezzük. Helyette használhatjuk a csomag egy speciális névterét.
Mellékelt példa megnyitása előtt szükséges egy WSEImageService nevű virtuális könyvtár létrehozása, mely a példa könyvtárára mutat. Ehhez nyissa meg a mellékelt mappa Tulajdonság ablakát és itt a Webmegosztás lapon engedélyezze a mappa megosztását olvasási és parancsfájlok futtatási jogával.
A szerviz alkalmazás futtatása előtt gondoskodnunk kell arról, hogy a Web szerver virtuális mappájában engedélyezzük a névtelen hozzáférést.
A mellékelt példa használatához telepítenünk kell a Microsoft WSE 1.0 csomagot. Ennek elvégzéséhez olvassa el a Kezdeti lépések című fejezetet.
Kezdeti lépések
A Microsoft által elkészített csomag a Web Services Enhancements for Microsoft .NET nevet viseli, és cikkünk írásakor a következő Webcímen volt elérhető, mely természetesen megváltozhatott: http://msdn.microsoft.com/webservices/building/wse/default.aspx.
Letöltve az állományt (Web Services Enhancements 1.0 for Microsoft .NET.msi) telepítenünk kell a .NET Framework alá. Az öntelepítő állomány erről gondoskodik, a használható .DLL állomány (Microsoft.Web.Services.dll), és a kapcsolódó dokumentáció alapértelmezésben a következő mappába kerül: %winroot%:\Program Files\Microsoft WSE\v1.0.2312\.
A telepített assembly bekerül a globális assembly-listába, így amikor referenciaként megadjuk alkalmazásainkban, akkor a globális palettáról kell kiválasztanunk, nem pedig valamilyen alternatív mappából.
WebService megvalósítása
A mellékelt Windows kliens segítségével a szerviz alkalmazás Image alkönyvtárában található képállományok nevét egy listába gyűjtjük, majd a lista mellett elhelyezett PictureBox kontrolban megjelenítjük a kiválasztott képet úgy, hogy lekérjük a szerver mappájából.
A WSE csomag névtereinek eléréséhez referenciaként mind a kliens, mind a szerver-alkalmazásokban meg kell adni a Microsoft.Web.Services.dll állományt. Ehhez válasszuk a Project - Add reference menüpontot, majd a megjelenő ablakban a .NET lapon keressük elő a Microsoft.Web.Services.dll elemet.
A forráskód elején meg kell adnunk a hivatkozást a Microsoft.Web.Services és Microsoft.Web.Services.Dime névterekre:
using Microsoft.Web.Services;
using Microsoft.Web.Services.Dime;
A szerviz két metódussal rendelkezik. A GetImageList metódus egy karakterlánc tömbben visszaadja az image mappában megtalálható állományok neveit.
[WebMethod]
public string[] GetImageList()
{
  string[] iList;
Kigyűjtjük a mappa állományait:
  iList = Directory.GetFiles(this.Server.MapPath("Images"));
Majd a nevüket áttesszük egy másik tömbbe, melyet visszaad a metódus:
  ...
  for(int i=0;i<iList.Length;i++)
  {
    FileInfo fi = new FileInfo(iList[i]);
    nameList[i] = fi.Name;        
  }
  return nameList;
}
A másik metódus (Getimage) a paraméterként kapott állománynevet felhasználva megkeresi a mappában a fizikai állományt, majd SOAP csatolt fájlként hozzáadja a visszatérő bájtfolyamhoz.
[WebMethod]
public void GetImage(string fname)
{
  string attfile = this.Server.MapPath("Images\\" + fname);
Létre kell hozni egy SoapContext objektumot, melynek segítségével kezelhetjük a SOAP üzeneteket:
  SoapContext rContext = HttpSoapContext.ResponseContext;
Létre kell hoznunk a csatolt állomány objektumát, melyben specifikálnunk kell az állomány típusát:
  DimeAttachment attachment = new DimeAttachment("image/gif", TypeFormatEnum.MediaType,attfile);
Majd fel kell fűzni a csatolt állományok listájára:
  rContext.Attachments.Add(attachment);
}
Proxy osztály készítése
A Visual Studio.NET beépített eszköze segítségével készíthetünk egy kliens proxy-t az alkalmazáshoz, melynek segítségével könnyen kapcsolat teremthető a szerviz metódusa és a hívó kliens program segítségével.
A %winroot%:\Program Files\Visual Studio.NET\FrameworkSDK\Bin mappában található program segítségével egy - a szerviz osztályával azonos nevű, .cs kiterjesztésű – állomány generálható, melyet a kliens projektbe felveszünk. Az ImageService.cs állomány a következőképpen generálható parancssorból:
wsdl /out: ImageService.cs http://localhost/WSEImageService/ImageService.asmx
A proxy osztály ősosztályának nevét meg kell változtatnunk, hiszen a WebServicesClientProtocol osztályból kell származtatni.
public class ImageService : WebServicesClientProtocol
{
  ...
}
Ezt követően meg kell adnunk a proxy osztály állományának elején is a szükséges referenciát:
using Microsoft.Web.Services;
Ha a proxy osztályt Web Referenciával akarjuk létrehozni, akkor a keletkező metódusok visszatérési értékeinek típusai nem egyeznek meg a szerviz metódusainak visszatérési típusaival.
Kliens-alkalmazás elkészítése
A program forráskódjának elején itt is el kell helyezni a hivatkozásokat a névterekre:
using Microsoft.Web.Services;
using Microsoft.Web.Services.Dime;
A program inicializációja után meg kel hívnunk a Web szerviz metódusait, hogy betöltsük a névlistát a ListBox-ba, és megjelenítsük az első elemet. Ehhez példányosítanunk kell a proxy osztályt:
private ImageService svc;
...
svc = new ImageService();
Le kell kérdezni a névlistát, majd betölteni a kontrolba:
string[] iList = svc.GetImageList();
for(int i=0;i<iList.Length;i++)
{
  listBox1.Items.Add(iList[i]);
}
A kép betöltésekor, valamint listából történő választáskor meg kell hívni a szerviz metódusát:
svc.GetImage(listBox1.SelectedItem.ToString());
Majd ki kell olvasni a csatolt állományt, és be kell tölteni a PictureBox-ba:
if (svc.ResponseSoapContext.Attachments.Count == 1)
{
  pictureBox1.Image = new Bitmap(svc.ResponseSoapContext.Attachments[0].Stream);
}
A csatolt állományok száma nagyobb is lehet mint egy, azonban itt csak egy állományt tudunk felhasználni, így ellenőriznünk kell a mennyiséget.
Web.confg állomány módosítása
A szerviz alkalmazásunkat konfigurálnunk kell annak érdekében, hogy helyesen értelmezze a kliens kéréseit. A <system.web></ system.web > elemeken belül be kell illesztenünk a következő sorokat:
<webServices>
  <soapExtensionTypes>
    <add type="Microsoft.Web.Services.WebServicesExtension,Microsoft.Web.Services,Version=1.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35" priority="1" group="0"/>
  </soapExtensionTypes>
</webServices>
Egyetlen lényeges elvárás ezzel kapcsolatban, hogy a type attribútumban megadott karakterlánc egy sorban legyen megadva. Ellenkező esetben a lap nem töltődik be.