Mar.15

Developer Days 2008

Dit jaar zullen de Developer Days plaatsvinden op 22 en 23 mei in de RAI in Amsterdam. Meer hierover is te vinden op de website van Microsoft. Ook dit jaar wordt het evenement weer gecombineerd met het MIX event.

Mar.14

IIS v6 (Windows 2003) en gecomprimeerde communicatie – Deel II

compression.JPGIn deel I was te lezen hoe je IIS 6 kunt configureren zodat er gecomprimeerd communicatie plaatsvindt. Vooral bij webservice implementaties kan dit leiden tot een reductie van de traffic van 90%. Bij beschikbaarheid van slechts een beperkte bandbreedte is het dus zeker handig na te gaan of gecomprimeerde communicatie een optie is. In deel II (en tevens het laatste deel) probeer ik te beschrijven hoe je gebruik kunt maken met een .NET webservice client van een webserver die gecomprimeerde communicatie toestaat. Standaard ondersteund .NET dit niet. Er zal dus wat moeten worden gedaan om te zorgen dat de client gecomprimeerde communicatie gaat gebruiken.

Om te beginnen is het library SharpZibLib noodzakelijk. Dit library gaat zorgdragen voor de decompressie van de te ontvangen data van een bepaalde webservice. De webservice client moet aan de server aangeven dat hij overweg kan met gecomprimeerde data. Daarom moet er in de http-header van de SOAP-request de key “Accept-Encoding” worden meegegeven met als waarden de type encodings die kunnen worden geaccepteerd, in dit geval gzip en deflate. Om te zorgen dat dit makkelijk te implementeren is in verschillende clients is het niet handig deze code op te nemen in de webservice proxyclass. De hieronder beschreven oplossing houdt daar rekening mee.

Onderstaande class verzorgt de decompressie van data:

Deze class is een overerfde van de WebResponse class. Deze class kunnen we vervolgens gebruiken in elke overerfde van een webservice client proxy class zoals hieronder beschreven. De overerfde van de proxy class maken we simpelweg aan op de volgende manier:

snoei.net.webservices.MyWebService is een door .NET gegenereerde proxy class. In bovenstaande overerfde wordt gezorgt dat automatisch bij het aanroepen van de webmethods in proxy class, in de soapheader wordt meegegeven dat de client overweg kan met compressie. Bij de ontvangst van de data wordt gecomprimeerde dan automatisch gedecomprimeerd. Als er geen compressie is ondersteund door de webserver dan functioneert de code ook gewoon correct.

Compressie kan bijzonder handig zijn in situaties met beperkte bandbreedte en overwegend communicatie van data. Kijk eens in de log files van IIS daar zijn de verschillen tussen communicatie zonder en met compressie goed te zien.

Feb.22

IIS v6 (Windows 2003) en gecomprimeerde communicatie – Deel I

Om optimaal gebruik te kunnen maken van de verbinding naar je IIS webserver is het handig om eens te kijken naar hoe de webserver communiceert. Standaard communiceert de IIS server v6 zonder de communicatie te comprimeren. Aangezien over het algemeen plaatjes niet meer hoeven te worden gecomprimeerd omdat vooral formaten zoals gif, jpeg en png zijn geoptimaliseerd zodat er geen bitje te veel over de lijn gaat is het comprimeren alleen relevant voor de ASCII die heen en weer wordt gestuurd. Situaties waarbij vooral ASCII (lees html, xml etc) wordt gecommuniceerd zijn vooral webservice implementaties. Hierbij worden nauwelijks plaatjes gecommuniceerd en met name heel veel XML. Het mooie is dat ASCII heel goed te comprimeren is.

In de komende 2 artikelen van alles om gecomprimeerde communicatie tussen webservice server en client met IIS 6 voor elkaar te krijgen. In dit eerste deel uitleg over hoe IIS server te configureren om te zorgen dat compressie wordt geaccepteerd. Dit is niet zomaar een kwestie van een paar vinkjes zetten, maar ook het aanpassen van de IIS Metabase.

In de praktijk werkt compressie eigenlijk als volgt. Een client doet een request naar een webserver en geeft in de hostheader aan dat een gecomprimeerde reactie van de webserver wordt geaccepteerd en geeft aan met welke compressiemethode de client overweg kan. Ondersteund de webserver 1 van de gegeven compressiemethoden dan zal het antwoord van de webserver gecomprimeerd worden teruggestuurd naar de client met in de hostheader de aanduiding welke compressie is toegepast. De mate van compressie is in de webserver in te stellen.

Compressie inschakelen

  1. Start de Internet Information Services Snap-in
  2. Klik met de rechtermuisknop op de “Web Sites” > Properties
  3. Kies de Service tab.
  4. Zet Compress Application Files aan.
  5. Zet Compress Static Files aan.
  6. Controleer of de directory aangegeven bij “Temporary Directory” bestaat en lees- en schrijfrechten geeft aan de Internet Guest = IUSR_[COMPUTERNAME].
  7. Zet de max. directory size waarde op een redelijke waarde.

IIS6Comp2.jpg

Web Extensie toevoegen
Om te zorgen dat compressie qua beveiliging is toegestaan moet de compressie extensie worden toegevoegd.

  1. Klik met de rechtermuisknop op de “Web Service Extensions” > “Add new Web Service Extension”.
  2. Geef een duidelijke extensienaam bijv “HTTP Compression”.
  3. Kies Add > “C:WINDOWSsystem32inetsrvgzip.dll”.
  4. Zet “Set extension status to allowed” aan.

IISComp1.jpg

IIS v6 MetaBase aanpassen

  1. Stop IIS
  2. Open het metabase bestand met een editor zoals Notepad via “c:windowssystem32inetsrvmetabase.xml”.
  3. Zoek naar “
  4. Voeg binnen het element “HcScriptFileExtensions” (Dus niet “HcFileExtensions”) van beide compressiemethoden de extensies “aspx” en “asmx” toe en eventueel “php”. Houdt de bestaande uitlijning aan om te zorgen dat het metabase bestand niet corrupt raakt.
  5. Pas vervolgens de waarde van “HcDynamicCompressionLevel” aan. De waarde staat op “0”, maak er “9” van. Deze waarde geeft de mate van compressie aan. Een test overzicht van Chris Adams (Microsoft) toont aan dat een compressie van 9 prima is, maar 10, de hoogste waarde, de CPU erg zwaar belast. Terwijl de compressie bijna even goed is.
  6. Start IIS

IIS v6 is nu klaar voor gebruik wat betreft compressie. Nu is het nog zaak een .NET webserviceclient te implementeren die overweg kan met compressie. Meer hierover in deel II.
IIS6Comp3.jpg

Zonbu – Deel II – Drivers en oplossen van problemen

In mijn vorige post had ik het over de Zonbu. Onlangs kwam ik het probleem tegen dat Windows XP op de Zonbu, als er geen monitor aan wordt gehangen, de monitor poort uitschakeld. Wat daar de oorzaak van is, is onduidelijk. Opnieuw opstarten helpt en de monitor reageert helemaal niet meer, de oplossing is na opnieuw opstarten een BIOS reset uitvoeren. Op deze pagina is te lezen hoe een BIOS reset kan worden uitgevoerd (zonder beeldscherm). Daarna doet het beeldscherm het weer.

Voor eigenaars van een Zonbu met WIFI (WLAN) kunnen hier de drivers worden gedownload. Het is aan te raden ook de VIA Falcon IDE driver te installeren. Laatstgenoemde zorgt ervoor dat UDMA problemen met diverse flashkaartjes niet meer optreden. De Windows XP heeft op de Zonbu problemen met bijvoorbeeld de Sandisk Extreme III kaartjes zonder deze driver.

Een goedkope groene ASP.NET mini-server

kikker.jpgDe laatste jaren ben ik enigszins gefocused op het vinden van een PC met veel processorkracht en een laag energieverbruik. Zo heb ik een jaar of 5 a 6 geleden een jaar lang een Pentium 133Mhz PC als (Microsoft personal) webserver operationeel gehad voor het hosten van mijn ASP website. Door deze actie bleek de energierekening dat jaar Hfl. 300,- hoger te zijn dan anders. Een rede om dat ding maar weer uit te zetten en op zoek te gaan naar een goedkope hoster. Vergeleken met de huidige PC’s is zo’n Pentium 133Mhz qua energieverbruik kinderspel. Tegenwoordig gebruikt een beetje fatsoenlijke PC al gauw 150 tot 200 Watt. Als zo’n PC 365 dagen aan staat kost dat +/- € 300,- per jaar aan energie.

Kortom de rede van mijn focus is een machine waar IIS met ASP.NET op kan worden gehost. Af toe bekruipt mij het gevoel, zeker in deze tijd met een liefde voor al wat “groen” is, dat er zuinigere oplossingen moeten bestaan zonder al te veel performance in te hoeven leveren. Op zo’n moment ga ik weer op jacht en tegenwoordig vindt je dan opvallend veel energiezuinige, goedkope pc-achtige oplossingen die er qua performance best mogen wezen.

Een paar voorbeelden:

zonbu.jpgOnlangs heb ik dan eindelijk de onderste uit bovenstaande lijst, een Zonbu Mini aangeschaft, de best uitgeruste mini-computer die ik kon vinden. Dit apparaat wordt geleverd met een optimaal voor deze machine getunede Linux variant waarbij de opslag van data plaatsvindt op het web en het OS draait op een Compact Flash kaart in het apparaat zelf.

Via 1 van de 6 USB poorten heb ik met en externe DVD-speler Windows XP op het apparaat geinstalleerd. Na de installatie had ik vooral driver-problemen. Het was even zoeken maar uiteindelijk vond ik op de website van de originele Taiwanese!! fabrikant de juiste drivers . De Flash kaart is 4Gb groot en na installatie van het .NET framework 3.0 is er nog 2.2Gb over aan opslagcapaciteit. Het apparaat draait vooralsnog als een zonnetje. Is niet noemenswaardig langzaam, is stil er zitten namelijk geen bewegende delen in, is klein en verbruikt nauwelijks energie.

Kortom, prima in te zetten als IIS server voor .NET applicaties. Ja, en ik snap ook wel dat je niet moet proberen een 100.000 bezoekers per dag met dat ding te bedienen, maar zet je je eigen blog er op en nog wat leuk ander speelgoed dan zal dat echt geen problemen opleveren. Het is wel aan te raden een (energiezuinige) NAS te gebruiken voor data-opslag. Het is zelfs mogelijk om een IDE harddisk aan te sluiten, je zal echter even moeten puzzelen om de harddisk in de behuizing te plaatsen. Een externe USB-drive is natuurlijk ook een optie.

En dat allemaal met een energieverbruik dat neerkomt op een kostenpost van € 15,- per jaar, tenminste, als ie het hele jaar moet draaien.

Kijk ook eens naar:

Dec.10

Developer Days 2007 gemist?

devdays.gifBen je de Developer Days 2007 bewust of onbewust misgelopen. Kijk dan eens op de website van Microsoft. Microsoft heeft webcasts van alle sessies van de DevDays op de website gezet.

Alle belangrijke onderwerpen komen aan bod zoals Windows Communication Foundation (de opvolger van Webservices), Windows Presentation Foundation (de opvolger van WinForms) maar ook onderwerpen zoals Lego Mindstorm in combinatie met Microsoft Robotics Studio of het nieuwe Silverlight.

Nov.26

Visual Studio 2008 beschikbaar

19 november 2008 is voor MSDN subscribers de Visual Studio 2008 RTM beschikbaar gekomen. Ook Express editions en Trials zijn nu te downloaden vanaf de site van Microsoft. Een hoop interessante nieuwe verbeteringen zijn in VS 2008 doorgevoerd zoals standaard LINQ, Windows Presentation Foundations, Windows Communication Foundation en Windows Presentation Foundation ondersteuning.

vs2008ts.jpg

Nov.09

Gratis SMS-en en bellen naar vaste nummers

sms.jpgEr zijn genoeg gratis diensten op internet beschikbaar waar mee naar mede-internetgebruikers kan worden gebeld. Het bellen naar vaste telefoonnummers is echter een ander verhaal. Een van die diensten is VoipBuster. Met VoipBuster kun je door middel van een zogenaamde SIP account via een softphone (software die m.b.v. een geluidskaart een telefoon simuleert) bellen naar vaste nummers. VoipBuster gaf in het verleden zelfs nummers uit aan gebruikers zodat je als gebruiker ook gebeld kon worden via een vast nummer. De dienst VoipBuster maakt onderdeel uit van een Duits bedrijf die onder diverse namen ongeveer dezelfde diensten aanbiedt met steeds verschillende voorwaarden. Bij de een is bellen naar vaste nummers aan een max. tijd verbonden bij een ander is dat onbeperkt, bij de volgende is het versturen van SMS gratis etc… De dienst die gratis SMS aanbiedt is VoipWise. Het mooie is dat deze dienst netjes kan worden geintegreerd in bijvoorbeeld een .NET applicatie. Via een http-get kunnen SMS-jes gratis worden verstuurd. Er is overigens wel een Fair Use Policy aan gekoppeld, het is niet duidelijk wat de policy in houdt.

De telefonieaccount van deze providers kan prima worden gebruikt in combinatie met een Asterisk server. Asterisk is een open source software PABX (private branch exchange) oftewel telefooncentrale. Installeer deze op een PC en je hebt een professionele bedrijfstelefooncentrale tot je beschikking met daarin volledig configureerbare belmenu’s (IVR), voicemail, queues, call recording etc… Lijkt het je leuk om daar eens mee te experimenteren dan kan ik je aanraden TrixBox (een voorgebakken Linux variant) eens te installeren op een oude pc of Virtuele Machine van VMWare of zelfs via de Virtual PC van Microsoft. Via de AGI interface van de Asterisk server kun je C# applicaties integreren in de PABX.

Wil je een vast SIP nummer zodat mensen je via het vaste net kunnen bellen met het netnummer van je eigen woonplaats kijk dan eens op http://www.budgetphone.nl. Voor € 10,- per jaar krijg je de beschikking over je eigen vaste nummer.

Oct.17

De zwarte doos, tracen voor luilakken

Tracing is een manier om informatie te loggen over de werking van applicatiecode. Een soort van “zwarte doos” voor software. In de System.Diagnostics namespace zijn een aantal klassen opgenomen waarmee tracing en debugging informatie kan worden gelogd naar een bestand, eventlog of welke ander outputdevice of datasource ook. Dit gebeurd via zogenaamde listeners. Tracing is met name bedoeld voor applicaties die in release mode zijn gecompileerd. Debug wordt echter alleen gebruikt voor het loggen van gegevens in debug mode.

Bovenstaande code schrijft standaard alle debug regels naar het “output” venster van Visual Studio. Dit komt omdat er een default listener actief is voor het wegschrijven van deze informatie naar dit window.
output.png
Het is mogelijk een nieuwe listener te activeren die deze informatie naar (bijv.) een tekstbestand schrijft. Naast deze globale informatie waarover je veel meer kunt vinden op het web is het handig te weten dat tracemessages in 4 niveaus kunnen worden verdeeld:

  • Verbose (level: 4)
  • Info (level: 3)
  • Warning (level: 2)
  • Error (level: 1)

Verbose is het meest gedetaileerde niveau waarop wordt gelogd. Error is het minst gedetaileerde niveau. Je kunt voor een lopende applicatie bepalen welk soort tracemessages moeten worden gelogd. Kiezen we voor “Warning” dan worden zowel “Warning” als “Error” message gelogd. Kiezen we voor Verbose dan worden alle messages gelogd etc… Uiteraard wordt bij level 0 niets gelogd.

Automatiseren van de logging

Vooral bij tracing wil je een aantal standaardgegevens opnemen voor elk tracemessage. Praktische informatie die ik bij elke gelogde regel zou willen hebben is:

  • Datum/Tijd
  • Gebruikersnaam waaronder de applicatie draait.
  • Gegevens van de methode waarin de trace wordt weggeschreven.

.. en het logbericht natuurlijk. Het is natuurlijk onhandig als je bij elk logbericht al die gegevens keer op keer moet meegeven.

De oplossing hiervoor is de zelfbouw TraceManager class. Om deze te kunnen gebruiken moet er het volgende gebeuren. In de app.config of web.config van de applicatie moet de volgende Xml worden opgenomen:

Met deze switch wordt aangegeven op welk level moet worden gelogd. Vervolgens wordt met de volgende regel de TraceManager geinitialiseerd:

De tracemanager gaat alle logregels wegschrijven naar een bestand met de naam c:testtrace.log.
Met de volgende code loggen we een tracebericht:

Dit bericht resulteert in de volgende gegevens in het testtrace.log bestand:

Zie hier… er is een klein wondertje gebeurt. De applicatie heeft via een kijkje in de callstack en een stukje reflection de methode vastgesteld waarin de tracemessage is aangemaakt. Op deze manier is tracen een makkie geworden.

Maar hoe werkt deze “zwarte” TraceManager doos?

De datum en de gebruiker vaststellen is niet zo heel ingewikkeld. (Geen zorgen trouwens je kunt de code downloaden via de link onder aan dit artikel ;-).)Het vasstellen van de aanroepende methode heeft wat meer voeten in aarde. Het ophalen van deze gegevens heeft alles te maken met de callstack. De callstack is een hierarchische lijst van methodes die elkaar hebben aangeroepen. We hebben in de file program.cs de methode Main() deze roept een methode Print() aan en die roept weer de methode PrintFirstLine() aan. De callstack is bij het aanroepen van de methode PrintFirstLine() hierarchisch:
Main() (stackframe 2)
> Print() (stackframe 1)
> > PrintFirstLine() (stackframe 0)

MethodBase is een object uit de System.Reflection namespace en bevat informatie over een methode (metadata). Als we echter een TraceMessage.WriteVerbose(…) methode plaatsen binnen de PrintFirstLine() methode dan zal deze stackframe 0 worden en PrintFirstLine() stackframe 1 etc… Daarom willen we het eerste stackframe ophalen wat GEEN methode is van de TraceManager class. Dat doen we met de volgende code:

LET OP! Mocht je dus in de toekomst besluiten de naam van de TraceManager te veranderen. Dan moet je de hier niet vergeten mee te wijzigen anders werkt de code niet meer. (Dit is overigens intelligenter op te lossen met een stukje reflection maar daar ben ik nog niet aan toegekomen) Bovenstaande functie retourneert informatie over de methode die de (bijv.) TraceManager.WriteVerbose(…) methode aanroept.

Met onderstaande code kunnen vervolgens de gegevens als naam van de methode, parameters en return type worden opgehoest:

Kortom tracen voor luilakken. Je loopt nu tegen het probleem aan dat je eigenlijk niet meer weet wat je als daadwerkelijke message mee moet geven aangezien zo wat alles al wordt gelogd ;-).

Vooruit downloaden maar.. en veel plezier er mee!
TestApp.zip

Sep.11

Nederlandse tijd en datum opvragen op buitenlandse server

Begin_CEST_Transparent.pngStel je wilt de Nederlandse tijd en datum weergeven onafhankelijk van het systeem waar je software op draait. Onderstaande class “nlDateTime” biedt dan een oplossing. De code houd rekening met DST (Daylight Saving Time = zomertijd).

In feite wordt de door het systeem geretourneerde tijd eerst omgezet naar UTC (Universal Time Coordinated) ook wel GMT genaamd. Vervolgens wordt er vastgesteld of we in europese zomertijd of wintertijd leven. Zomertijd gaat in op de laatste zondag van maart. Wintertijd gaat in op de laatste zondag van oktober.