C# - Sikertelen erőforrás-letöltés jelzése a rendszergazdának SMS-üzenetben

forráskód letöltése
Cikkünkben egy olyan ASP.NET alkalmazást készítünk, amely egy SMS-üzenetben tájékoztatja az alkalmazást futtató szerver rendszergazdáját abban az esetben, ha a Web-alkalmazás letölthető erőforrásai közül a felhasználó megpróbálja a gépére menteni ezek valamelyikét, de a művelet az erőforrás hiánya, vagy elérhetetlensége miatt nem sikerült. Az SMS-üzenet elküldésnek feltétele egy megfelelő e-mail cím valamelyik mobilszolgáltatónál.
Mellékelt példa megnyitása előtt szükséges egy LoadError 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 mellékelt LoadError.xml állományban meg kell adni a kiszolgáló szerver címét és az e-mail címet a megfelelő tag-ek között.
A Web-szervereken futó alkalmazások képesek arra, hogy böngészőből érkező kéréseket kiszolgálják, az erőforrásokat letöltsék a kliens számítógépre. A különböző típusú böngészők a szervertől érkező HTML adatfolyamokat jelenítik meg, illetve lehetővé teszik, hogy az egyes protokollok felhasználásával állományok kerüljenek a szerverről a kliens gépre.
A felhasználónak elegendő az erőforrás URL-jét megadni a böngésző címsorában ahhoz, hogy a művelet végrehajtódjon. A kérést a szerveralkalmazás feldolgozza, a kérés URL-je alapján meghatározza az erőforrás fizikai helyét, majd a megfelelő csatorna felhasználásával eljuttatja a klienshez a kért erőforrást. A mellékelt alkalmazás erőforrásait a következőképpen lehetne elérni az alkalmazás mappájának /resources alkönyvtárából:
http://localhost/LoadError/resources/Samplefile.zip
Ekkor a Web-alkalmazás virtuális könyvtára által hivatkozott fizikai mappából a Samplefile.zip állomány egy nyugtázó beleegyezés után letöltődik a kliens számítógépre. Példánkban azt az esetet modelleztük, amikor a kért állomány, illetve erőforrás nem érhető el, és erről tájékoztatni szeretnénk az oldal adminisztrátorát egy SMS-ben.
A mellékelt példában ezt úgy oldottuk meg, hogy az erőforrás hiánya esetén automatikusan betöltődő hibaoldalt felülírtuk egy saját oldallal, amely egyrészt a felhasználót tájékoztatja az erőforrás elérhetetlenségéről, valamint betöltődésekor elküldi az üzenetet.
Az erőforrások hiányát a szerver egy 404-es kóddal azonosított hibaként jelzi, amely hibakódra mi egy saját kezelőt „telepítettünk”. Ehhez az alkalmazás Web.config állományának hibakezelésre vonatkozó alapértelmezett beállításait kell módosítani. Az hibakezelést a <customErrors> bejegyzésben kell konfigurálni, annak is a mode attribútumának beállításával. Ennek alapértelmezett értéke „RemoteOnly”, mely azt jelenti, hogy csak a távoli számítógépekről érkező kérések kapnak hiba esetén testre szabott hibaoldalt, egyébként a szabvány oldal jelenik meg.
Ezt a bejegyzést kell lecserélnünk az alábbira:
<customErrors mode="On">
  <error statusCode="404" redirect="/LoadError/Error.aspx"/>
</customErrors>
Az <error> albejegyzés statusCode attribútuma jelzi, hogy milyen kódú hibát akarunk testre szabott oldallal kezelni, a redirect attribútum pedig azt, hogy az oldalnak – mely jelen esetben az Error.aspx nevet viseli – mi a neve.
Az oldal betöltődéskor végrehajtódó műveleteket a Page_Load eseménykezelő metódusban helyezzük el. Elsőként gondoskodunk arról, hogy a megfelelő üzenet jelenjen meg az Error.aspx oldalon. A kért erőforrás virtuális elérési útvonalát jelenítjük meg a következőképpen: először meghatározzuk, hogy a kérés milyen URL-re irányult.
string url = Request.Url.ToString();
Uri localUrl = new Uri(url);
Majd összeállítjuk a karakterláncot:
string message = "http://" + localUrl.Host + Request.QueryString["aspxerrorpath"].ToString();
Label3.Text = message;
A rendszergazdának küldendő SMS elküldéshez egy belső metódust használunk, melynek SendMessageToAdmin a neve, és paraméterként adjuk át a küldő Webhely nevét, valamint az elküldendő üzenetet.
string from = localUrl.Host;
SendMailToAdmin(from,message + " nevű állomány nem elérhető!");
A localUrl.Host értéke helyi számítógép Web-szerverén futtatva az alkalmazást LOCALHOST lesz. Az elküldendő üzenetnek a tárgy-mezőjét töltjük fel a letölthetetlen állomány elérési útvonalát tartalmazó karakterlánc értékkel. A SendMessageToAdmin metódus tehát:
private void SendMailToAdmin(string from, string subject)
{
Egy XmlDocument objektumba beolvassuk a mellékelt XML állományt, majd létrehozunk egy MailMessage objektumot a küldendő üzenethez:
  XmlDocument xmlDoc = new XmlDocument();
  xmlDoc.Load(Server.MapPath("LoadError.xml"));
  MailMessage mm = new MailMessage();
  SmtpMail.SmtpServer = xmlDoc.DocumentElement["SmtpServer"].InnerText;
  mm.From = from;
  mm.To = xmlDoc.DocumentElement["AdminMailAddress"].InnerText;
  mm.Subject = subject;
  try
  {
A küldéshez az SmtpMail osztály Send metódusát használjuk:
    SmtpMail.Send(mm);
  }
  catch
  {}
}
A megfelelő szolgáltatónál megtalálható e-mail fiókba eljuttatott levél érkezéséről a szolgáltató elküldi az SMS-üzenetet.
A rendszergazda mobilján megjelenő SMS szövege a következő lesz, amennyiben a Samplefile.zip állomány nem elérhető az alkalmazás mappájában:
http://localhost/LoadError/resources/Samplefile.zip nevű állomány nem elérhető!