C# - Webszerver és a felhasználó közötti kapcsolat aktuális sebességének mérése

forráskód letöltése
Hozzunk létre most egy olyan webes alkalmazást, mely képes arra, hogy megállapítsa, hogy webszerverünk és az adott felhasználó között aktuálisan mekkora a sávszélesség, vagyis hány kB tölthető le másodpercenként. Ehhez készítünk egy teszt oldalt, melyet a felhasználónak le kell töltenie, és így meg tudjuk határozni azt, hogy mennyi volt a letöltés ideje és annak sebessége.
Az így megállapított sebesség persze állandóan változó lesz, akkor is ha ugyanaz a szerver és ugyanaz a kliens között mérjük, mivel a sebesség nagyban függ azokon az internetes szervereken, melyeken áthalad a web oldalunk a saját szerverünk és a kliens között.
Mellékelt példa megnyitása előtt szükséges egy DownloadSpeed 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 megvalósítást a következő módon végezzük el: készítünk egy web oldalt, melyre elhelyezünk egy viszonylag nagyméretű képet. Amikor a felhasználó letölti ezt az oldalt, akkor tároljuk az aktuális időpontot a Session-re. Az oldalt úgy készítjük el, hogy amint az letöltődött, szimulálja a Button1 nyomógombra történő kattintást. Ekkor egy újabb kérés indul el szerverünk felé, ahol alkalmazásunkban létrejön a Button1-hez tartozó Click esemény. Ekkor ismét eltároljuk a Session-re az aktuális időpontot. E két időpontból és az első web oldal méretéből már számítható az eredmény.
Ez az eredmény valamelyest eltér a tényleges letöltési sebességtől, mivel a szerverünk irányába kétszer történik kérés a Button1 nyomógomb Click eseménye miatt. Ennek a második kérésnek az időtöbblete viszont elhanyagolható, mivel az első web oldal letöltésénél lévő nagyméretű kép miatt nagyságrenddel több idő szükséges annak eléréséhez.
Az első web oldal Load eseményénél tároljuk el a kezdeti időpontot, abban az esetben, ha még nem történt meg a nyomógombra való kattintás. Az időpont tárolásához a DateTime osztály Now property-jének Ticks property-jében lévő értéket használjuk fel, mely 1. év január 1-től eltelt időt adja 100 ns időközben számlálva.
    private void Page_Load(object sender, System.EventArgs e)
    {
      if (!IsPostBack)
      {
        Session.Add("startTime", DateTime.Now.Ticks);
      }
    }
A WebForm1 HTML kódjában végzünk el egy változtatást, annak érdekében, hogy a lap letöltődése után szimulálva legyen a Button1 nyomógombra történő kattintás. Ehhez a BODY elemben létrehozunk egy onload eseményt, melyben meghívjuk a Button1 nyomógomb Click függvényét, amely egyenértékű a nyomógombra történő kattintással.
  <body MS_POSITIONING="GridLayout" onload="document.all.Button1.click()">
Amikor létrejön a Click esemény, akkor eltároljuk az aktuális pillanat értékét, és átirányítjuk a felhasználót a WebForm2-re, ahol kiszámítjuk az eredményt.
    private void Button1_Click(object sender, System.EventArgs e)
    {
      Session.Add("endTime", DateTime.Now.Ticks);
      Response.Redirect("WebForm2.aspx");
    }
Itt lekérdezzük két változóba a kezdő és befejező időpontot, majd kiszámítjuk ezek különbségét.
    private void Page_Load(object sender, System.EventArgs e)
    {
      long start = (long)Session["startTime"];
      long end = (long)Session["endTime"];
      long time = end - start;
Először kiírjuk a letöltés idejét másodpercben.
      Label1.Text = "Letöltés ideje másodpercben: " + ((double)time/10000000).ToString();      
      if (time == 0)
      {
        Label2.Text = "Letöltés sebessége nem mérhető";
      }
      else
      {
Majd ezt követően kiszámítjuk a letöltés sebességét. Ehhez ismernünk kell a letöltött oldal méretét, mely jelen példánknál 75028 bájt. Mivel az eredményt kB/s-ban szeretnénk megadni, így ezt az értéket átszámítjuk kB-ra, mely 73.26953125 lesz.
        double d = 73.26953125 / ((double)time / 10000000);    
        Label2.Text = "Letöltés sebessége kB/s-ben: " + d.ToString();
      }
    }