2010. február havi bejegyzések

IIS Manager hibaüzenet nélkül bezáródik

Épp az Application Warm-Up Module konfigurációját matattam az egyik projektünkben, amikor arra lettem figyelmes, hogy az IIS Manager mindenféle hibaüzenet nélkül eltűnik, ha a megpróbálom megnyitni benne ennek a modulnak a beállító ablakát. Az volt az érdekes, hogy csak ennél az alkalmazásnál csinálta, más alkalmazásoknál nem volt vele ilyen probléma.

Az Application Warm-Up modul még csak bétában van, ezért gyorsan szétnéztem a fórumon, hogy van-e ezzel kapcsolatban valami, mert emlékeztem, hogy a telepítése után a konfiguráció visszatöltésével kapcsolatban is van egy bug, hátha ez egy másik. Nem találtam semmit sem a fórumban, sem a Google-lel, ezért kénytelen voltam jobban utánajárni.

Az Application Logban találtam egy IIS-IISManagertől származó bejegyzést 13-as EventID-val:

IISMANAGER_CRASH

IIS Manager terminated unexpectedly.

Exception:ResourceName:
Microsoft.Web.Management.Server.WebManagementServiceException: Filename: \?W:DevelopmentTFSLexSolutionWebweb.config
Error:
—> System.Runtime.InteropServices.COMException (0x8007000D): Filename: \?W:DevelopmentTFSLexSolutionWebweb.config
Error:

   at Microsoft.Web.Administration.Interop.AppHostWritableAdminManager.GetAdminSection(String bstrSectionName, String bstrSectionPath)
   at Microsoft.Web.Administration.Configuration.GetSectionInternal(ConfigurationSection section, String sectionPath, String locationPath)
   at Microsoft.Web.Administration.Configuration.GetSection(String sectionPath)
   at Microsoft.Web.Management.AppWarmup.AppWarmupModuleService.GetWarmupEnabled()
   — End of inner exception stack trace —

Látszik, hogy próbálta kiolvasni az alkalmazás web.configjából a modulhoz tartozó egyik beállítást (enabled/disabled), de nem sikerült neki. Hogy miért nem, az nem derül ki, a HRESULT 0x8007000D nem éppen beszédes. A KB942055 szerint ez a hibakód jön akkor is, ha a “related configuration data for the page is invalid”. Itt már komolyan gyanakodtam, hogy talán mégis én szúrtam el valamit 🙂

Alaposabban megnézve kiderült, hogy csak ezzel az egy alkalmazással van gond, a többi alkalmazásnál ugyanezen a szerveren nincs gond az IIS Managerrel, tehát itt lehet valami hiba a web.configban. Csakhogy a web.config ide vonatkozó részét másoltam, mégpedig az URL Rewrite modultól, mert mindkét modulnak aránylag hosszú a konfig szekciója, ezért mindkettőt külső fájlba akartam tenni. Az URL Rewrite modulnál ez így működik is:

  <rewrite>
    <rules configSource="urlrewrite.config" />
  </rewrite>

Az Application Warm-Up modulnál ugyanez a forma nem jött be, végül ez lett a helyes szintakszis, amivel az IIS Manager is megbékélt:

  <httpWarmup configSource="warmup.config" />
 

Database Manager

Database Manager bővítmény az IIS Managerben A dinamikus webalkalmazások szinte állandó velejárója az adatbázis, melynek időnként szükségessé válik karbantartása, sémájának módosítása vagy esetleg a benne tárolt adatok közvetlen lekérdezése. Mindez olyan funkcionalitás, amely általában nem része a webalkalmazásnak és közvetlen hozzáférést igényel az adatbázishoz.

A Database Manager egy szabadon letölthető bővítmény az IIS 7-hez, amely az IIS Manager felhasználói felületébe beépülve biztosítja ezeket az adatbáziskezelési funkciókat. A ­Database Manager teljesen integrálódik az IIS üzemeltetési és konfigurációs sémájába, így lehetővé teszi, hogy a webalkalmazás tulajdonosai minimális jogosultságokkal, a Web Management Service segítségével akár távolról is felügyelhessék adatbázisaikat és közvetlenül férhessenek hozzá a bennük tárolt adatokhoz.

A Database Manager telepítés után kiolvassa az adott mappa szintjén elérhető konfigurációs fájlokból a connectionString beállításokat, majd megjeleníti a táblákat és a tárolt eljárásokat. A bővítmény segítségével az alábbi műveletek végezhetőek el az adatbázisokon:

  • Táblák létrehozása, törlése és a tábla szerkezetének módosítása.
  • Elsődleges kulcsok, indexek és idegen kulcsok létrehozása és törlése.
  • Adatok szerkesztése.
  • Lekérdezések futtatása.
  • Tárolt eljárások kódjának megtekintése.

Demó

A demóban bemutatjuk, hogyan hozhatunk létre táblákat és hogyan futtathatunk ad-hoc lekérdezéseket az IIS 7 Database Manager bővítményének segítségével.

Demo: IIS 7 Database Manager A lejátszáshoz kattints a képre!

Letöltés: Database Manager.wmv (13:25, 57,4 MB)

Első lépések

A Database Manager nem része az IIS 7-nek, külön bővítményként kell letölteni a www.iis.net oldalról. Telepítés után az IIS Manager középső paneljén alul jelenik meg a hozzá tartozó ikon. Először célszerű egy olyan mappában megnyitni, amelyben már található web.config állomány, amely hivatkozik egy olyan adatbázisra, amelyhez van hozzáférési jogosultságunk.

Jó tudni

A Database Manager provider alapon készült, azaz kiterjeszthető és ezáltal tetszőleges adatbázis motoron futó alkalmazás kezelhető vele, akár távolról is. Ehhez mindössze egy .NET-es szerelvényt kell készíteni, melyben egy saját osztályt kell származtatni a Microsoft.Web.Managment.DBManager absztrakt osztályból.

További információk

 

Foglaltság lekérdezése az Exchange-ből

Az Exchange Web Services (EWS) segítségével tetszőleges klienssel kapcsolódhatunk az Exchange Serverhez és lekérdezhetjük a felhasználóink naptárát.

Mivel szabványos SOAP-os webszolgáltatásról van szó, az első lépés természetesen a WSDL fájl elérése, ami itt található:

http://SERVER/EWS/services.wsdl

Erre adjunk referenciát Visual Studioban (a SERVER helyére beírva az Exchange Serverünk FQDN-jét) és közben figyeljünk a http/https alkalmazására. Ha ez megvan, egy ExchangeServerBinding objektumon keresztül kapcsolódhatunk a szolgáltatáshoz:

  ExchangeServiceBinding binding = new ExchangeServiceBinding();
  binding.Credentials = CredentialCache.DefaultCredentials;
  binding.Url = @"http://SERVER/EWS/exchange.asmx";

Fontos, hogy mindenképpen hitelesíteni kell magunkat, alapértelmezés szerint anonymous felhasználó nem fér hozzá a webszolgáltatáshoz. A foglaltság lekérdezéséhez számos paramétert át kell adnunk a kérésben, például azt, hogy a cél felhasználó naptárának mely időszakára vagyunk kíváncsiak. Szerintem a legegyszerűbb egy hétfőtől péntekig tartó időszakot megadni:

  Duration duration = new Duration();
  duration.StartTime = this._firstDay;    // E hét hétfője
  duration.EndTime = this._firstDay.AddDays( 5 );

Ezen a webszolgáltatáson keresztül többféle formátumban is lekérdezhetjük a felhasználó naptárát. Nekünk most arra van szükségünk, hogy az előbb megadott időszakban, fél órás bontásokban (interval), mikor szabad vagy mikor foglalt az illető:

  FreeBusyViewOptionsType options = new FreeBusyViewOptionsType();
  options.TimeWindow = duration;
  options.RequestedView = FreeBusyViewType.FreeBusyMerged;
  options.RequestedViewSpecified = true;
  options.MergedFreeBusyIntervalInMinutes = 30;
  options.MergedFreeBusyIntervalInMinutesSpecified = true;

Meg kell adnunk azt is, hogy kinek a naptára érdekel minket (Free/Busy time Read jogosultsággal kell bírnunk a naptárához), itt több felhasználót is felsorolhatunk MailboxData objektumok formájában:

  MailboxData mailbox = new MailboxData();
  mailbox.AttendeeType = MeetingAttendeeType.Required;
  mailbox.Email = new EmailAddress();
  mailbox.Email.Address = "felhasználó@example.com";

A legfájdalmasabb rész a kérő időzónájához tartozó összes paraméter megadása. A Central European Standard Time zónához tartozó értékeket kibogarásztam a registry-ből, de persze akár változhat is:

  SerializableTimeZone timeZone = new SerializableTimeZone();
  timeZone.Bias = -60;
  timeZone.StandardTime = new SerializableTimeZoneTime();
  timeZone.StandardTime.Bias = 0;
  timeZone.StandardTime.DayOfWeek = "Sunday";
  timeZone.StandardTime.DayOrder = 5;
  timeZone.StandardTime.Month = 10;
  timeZone.StandardTime.Time = "03:00:00";
  timeZone.DaylightTime = new SerializableTimeZoneTime();
  timeZone.DaylightTime.Bias = -60;
  timeZone.DaylightTime.DayOfWeek = "Sunday";
  timeZone.DaylightTime.DayOrder = 5;
  timeZone.DaylightTime.Month = 3;
  timeZone.DaylightTime.Time = "00:00:00";

Ha ez mind megvan, összerakhatjuk őket egyetlen objektumba:

  GetUserAvailabilityRequestType request = new GetUserAvailabilityRequestType();
  request.TimeZone = timeZone;
  request.FreeBusyViewOptions = options;
  request.MailboxDataArray = new MailboxData[] { mailbox };

Végül meghívhatjuk a webszolgáltatás GetUserAvailabilty függvényét:

  GetUserAvailabilityResponseType response = binding.GetUserAvailability( request );

A válaszban többféle formában is megtaláljuk, hogy mikor foglalt és mikor szabad az illető. Egy szabad/foglalt naptár rajzolásához talán a legegyszerűbb, ha a response.FreeBusyResponseArray[ 0 ].FreeBusyView.MergedFreeBusy stringet vizsgáljuk: ez pontosan annyi karakterből áll, ahány intervallumot kértünk a szervertől és minden esetben 0 jelzi, ha még szabad az az intervallum. Az egyes értékek előbb egy napon belül mennek végig az intervallumokon, majd utána jön a következő nap.

Dual boot VHD-ból kék halállal

Mint korábban már írtam róla, sikerült megoldanom, hogy a Windows 7-em mellett VHD-ból tudjak Windows Server 2008 R2-t bootolni. Ez működött is szépen, ám a minap a szerver indítása közben kék halál fogadott.

Annyira meglepett (ugye azok a régi szép Win’95-ös idők :)), hogy eltartott egy darabig, amíg a sok szöveg között megtaláltam a hibaüzenetet:

An initialization failure occurred while attempting to boot from a VHD.  The volume that hosts the VHD does not have enough free space to expand the VHD.

Olvasgatás után kiderült, hogy a VHD-ból indított operációs rendszer az indítása során lefoglal magának annyi helyet a diszken, amennyi a VHD maximális mérete. Nálam a VHD csak 8 GB-ot foglalt a diszken, de létrehozáskor meghagytam a default 127 GB-os maximális méretet, mondván, hogy a dinamikus diszk nőhet, ahogy akar, ami nem is okozott gondot egészen addig, amíg volt legalább 127 GB szabad hely, amire induláskor rátehette a mancsát. Mikor a másik oprendszer alól telepakoltam a diszket, emez eldobta magát kék halállal.

Nosza elő a Disk Management MMC-t Windows 7 alatt, Attach VHD, jobb klikk a köteten és Shrink Volume:

Disk Management MMC: Shrink Volume

Ez szépen össze is nyomta a kötetet, amitől azonban a VHD nem lett kisebb, csak éppen lett a végén egy rakás “unallocated” terület. De ennek a szerencsétlennek azt is le kell foglalnia bootoláskor, mert ha nem, akkor kék marad. Keresgéltem, de sehol nem találtam Shrink VHD opciót, végül az ingyenes vmToolkit VHD Resizer eszközzel sikerült megoldani a problémát.

Van erre beépített eszköz?