<?xml version="1.0" encoding="utf-8"?>
<feed xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xml:lang="nl-nl" xmlns="http://www.w3.org/2005/Atom">
  <title>RichardSoeteman.NET</title>
  <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/" />
  <link rel="self" href="http://www.richardsoeteman.net/SyndicationService.asmx/GetAtom" />
  <icon>favicon.ico</icon>
  <updated>2008-08-03T09:30:04.3442149+02:00</updated>
  <author>
    <name>Richard Soeteman</name>
  </author>
  <subtitle />
  <id>http://www.richardsoeteman.net/</id>
  <generator uri="http://www.dasblog.net" version="1.9.6264.0">DasBlog</generator>
  <entry>
    <title>Debug Visualizers voor niet serializable typen</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/PermaLink,guid,ce0c1abb-fa66-400e-aaa6-59c9c979e782.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,ce0c1abb-fa66-400e-aaa6-59c9c979e782.aspx</id>
    <published>2008-08-03T09:27:53.7070000+02:00</published>
    <updated>2008-08-03T09:30:04.3442149+02:00</updated>
    <category term="Visual Studio" label="Visual Studio" scheme="http://www.richardsoeteman.net/CategoryView,category,Visual%2BStudio.aspx" />
    <content type="html">&lt;p&gt;
We kennen allemaal de kracht van een debug visualizer, even snel de data van een dataset
bekijken, selecteer de juiste visualizer in Visual Studio en een mooi debugger dialog
window wordt getoond met daarin je complete datastructuur en data. Het maken van een
debugger visualizer is ook redelijk simpel. Voor wie dat nog nooit heeft gedaan raad
ik aan &lt;a title="How Do I: Create a Debugger Visualizer?" href="http://www.richardsoeteman.net/ct.ashx?id=ce0c1abb-fa66-400e-aaa6-59c9c979e782&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fvs2005%2fcc527465.aspx"" target=_blank&gt;deze
video&lt;/a&gt; eens te bekijken.
&lt;/p&gt;
&lt;p&gt;
Het nadeel van deze video en andere tutorials die over dit onderwerp gaan is dat ze
altijd een serializable object gebruiken. Nu zijn je eigen objecten vaak wel serializable,
maar er zijn ook heel veel objecten niet serializable en soms wil je daar echt een
visualizer voor hebben. Probeer je deze objecten toch te gebruiken krijg je de volgende
foutmelding te zien.
&lt;/p&gt;
&lt;p&gt;
&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=186 alt=NonSerializableErrorMessage src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/DebugVisualizersvoorNonSerializableobjec_E7C1/NonSerializableErrorMessage_3.jpg" width=453 border=0&gt;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Een aantal maanden geleden werkte ik op een project waar intensief gebruik werd gemaakt
van querystring- en formulierdata en wilde hiervoor een Visualizer maken. Ik werd
direct geconfronteerd met bovenstaande foutmelding en besloot wat dieper in de materie
te duiken. Middels onderstaand code voorbeeld zal ik uitleggen wat er gebeurd.
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre&gt;&lt;span class=lnum&gt; 1: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; System.Diagnostics;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 2: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; System.Web.UI;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 3: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; Microsoft.VisualStudio.DebuggerVisualizers;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 4: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 5: &lt;/span&gt;[assembly: DebuggerVisualizer(&lt;span class=kwrd&gt;typeof&lt;/span&gt;(PageErrorVisualizer.PageErrorVisualizer), &lt;span class=kwrd&gt;typeof&lt;/span&gt;(VisualizerObjectSource),
Target = &lt;span class=kwrd&gt;typeof&lt;/span&gt;(Page), Description = &lt;span class=str&gt;"PageErrorVisualizer
Visualizer"&lt;/span&gt;)]&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 6: &lt;/span&gt;&lt;span class=kwrd&gt;namespace&lt;/span&gt; PageErrorVisualizer&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 7: &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 8: &lt;/span&gt; &lt;span class=rem&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 9: &lt;/span&gt; &lt;span class=rem&gt;/// The Visualizer for type System.Web.UI.Page&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 10: &lt;/span&gt; &lt;span class=rem&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 11: &lt;/span&gt; &lt;span class=kwrd&gt;public&lt;/span&gt; &lt;span class=kwrd&gt;class&lt;/span&gt; PageErrorVisualizer
: DialogDebuggerVisualizer&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 12: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 13: &lt;/span&gt; &lt;span class=rem&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 14: &lt;/span&gt; &lt;span class=rem&gt;/// Shows the object in the visualizer
form&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 15: &lt;/span&gt; &lt;span class=rem&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 16: &lt;/span&gt; &lt;span class=kwrd&gt;protected&lt;/span&gt; &lt;span class=kwrd&gt;override&lt;/span&gt; &lt;span class=kwrd&gt;void&lt;/span&gt; Show(IDialogVisualizerService
windowService, IVisualizerObjectProvider objectProvider)&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 17: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 18: &lt;/span&gt; Page page = (Page)objectProvider.GetObject();&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 19: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 20: &lt;/span&gt; &lt;span class=rem&gt;//Initialize the Visualizer Form
and Show the data&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 21: &lt;/span&gt; &lt;span class=kwrd&gt;using&lt;/span&gt; (VisualizerForm frm
= &lt;span class=kwrd&gt;new&lt;/span&gt; VisualizerForm())&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 22: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 23: &lt;/span&gt; frm.ShowVisualizer(pageData);&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 24: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 25: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 26: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 27: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;











.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;style type=text/css&gt;











.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
Wanneer je een debug visualizer maakt zal je in het Assembly attribuut moeten aangeven
dat we een DebuggerVisualizer aan het maken zijn en verwacht de volgende gegevens:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Het object type van de Visualizer die we gaan gebruiken 
&lt;li&gt;
Het object type van de VisualizerObjectSource die we willen gebruiken 
&lt;li&gt;
Het object type waar we een visualizer voor willen maken 
&lt;li&gt;
De omschrijving die in Visual studio wordt getoond wannneer we de visualizer selecteren 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Het VisualizerObjectSource object dat standaard in visual studio zit bleek de boosdoener.
In het standaard&amp;nbsp; VisualizerObjectSource object wordt er vanuit gegaan dat een
object serializable is, wat dus niet altijd het geval is en daarmee de oorzaak van
bovenstaande foutmelding. Nu kunnen we van deze klasse afleiden. Eén van de methoden
die we kunnen overschrijven is de methode GetData. Getdata verwacht het object waar
we een visualizer voor willen maken en de stream waar de data ingeplaatst mag worden. 
&lt;/p&gt;
&lt;p&gt;
Onderstaand voorbeeld toont een versimpelde vorm van&amp;nbsp; de klasse die ik gebruikt
heb. In GetData cast ik het target object naar een page object en creëer ik een instantie
van PageData object. Het PageData object is een eigen gemaakt serializable object
dat de benodigde waarden kan vasthouden.&amp;nbsp; Hier kan ik vervolgens de benodigde
data op plaatsen.&amp;nbsp; Uiteindelijk vervang ik het Page object in target door mijn
eigen PageData object en de base functionaliteit zorgt ervoor dat het PageData object
netjes serialized wordt en in de visualizer gebruikt kan worden. 
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre&gt;&lt;span class=lnum&gt; 1: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; System.Data;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 2: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; System.Web;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 3: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; Microsoft.VisualStudio.DebuggerVisualizers;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 4: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 5: &lt;/span&gt;&lt;span class=kwrd&gt;namespace&lt;/span&gt; WebVisualizers.ObjectSource&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 6: &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 7: &lt;/span&gt; &lt;span class=rem&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 8: &lt;/span&gt; &lt;span class=rem&gt;/// Specialized ObjectSource for
System.Web.UI.Page&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 9: &lt;/span&gt; &lt;span class=rem&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 10: &lt;/span&gt; &lt;span class=rem&gt;/// &amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 11: &lt;/span&gt; &lt;span class=rem&gt;/// This class is needed because
the System.Web.UI.Page is not serializable and IVisualizerObjectProvider expects it
to be serializable&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 12: &lt;/span&gt; &lt;span class=rem&gt;/// In the GetData Method System.Web.UI.Page
will be turned into something that is Serializable&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 13: &lt;/span&gt; &lt;span class=rem&gt;/// &amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 14: &lt;/span&gt; &lt;span class=kwrd&gt;public&lt;/span&gt; &lt;span class=kwrd&gt;class&lt;/span&gt; WebPageObjectSource
: VisualizerObjectSource&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 15: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 16: &lt;/span&gt; &lt;span class=rem&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 17: &lt;/span&gt; &lt;span class=rem&gt;/// Takes a Page object get Data
from it and store it into PageData&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 18: &lt;/span&gt; &lt;span class=rem&gt;/// Replace the target object wit
PageData and call the base functionality&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 19: &lt;/span&gt; &lt;span class=rem&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 20: &lt;/span&gt; &lt;span class=rem&gt;/// &amp;lt;param name="target"&amp;gt;System.Web.UI.Page&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 21: &lt;/span&gt; &lt;span class=rem&gt;/// &amp;lt;param name="outgoingData"&amp;gt;Output
stream (PageData)&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 22: &lt;/span&gt; &lt;span class=kwrd&gt;public&lt;/span&gt; &lt;span class=kwrd&gt;override&lt;/span&gt; &lt;span class=kwrd&gt;void&lt;/span&gt; GetData(&lt;span class=kwrd&gt;object&lt;/span&gt; target,
System.IO.Stream outgoingData)&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 23: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 24: &lt;/span&gt; &lt;span class=kwrd&gt;if&lt;/span&gt; (target != &lt;span class=kwrd&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 25: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 26: &lt;/span&gt; Page page = (Page)target; ;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 27: &lt;/span&gt; PageData pageData = &lt;span class=kwrd&gt;new&lt;/span&gt; PageData();&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 28: &lt;/span&gt; &lt;span class=rem&gt;//Fill Pagedata based on page object&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 29: &lt;/span&gt; &lt;span class=rem&gt;//example pageData.Add(page.Session)&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 30: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 31: &lt;/span&gt; &lt;span class=rem&gt;//Replace target with PageData
object&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 32: &lt;/span&gt; target = pageData;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 33: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 34: &lt;/span&gt; &lt;span class=rem&gt;//Call Base functionality&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 35: &lt;/span&gt; &lt;span class=kwrd&gt;base&lt;/span&gt;.GetData(target, outgoingData);&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 36: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 37: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class=lnum&gt; 38: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;










.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
Op deze manier kunnen we dus voor elk gewenst object een Debug Visualizer maken, mits
we in een eigen VisualizerObjectSource klasse ervoor zorgen dat het object in target
vervangen wordt door een serializable object wat de benodigde data vasthoudt.&amp;nbsp;
De code die ik in deze blogpost heb gebruikt, maakt deel uit van &lt;a title=Webvisualizers href="http://www.richardsoeteman.net/ct.ashx?id=ce0c1abb-fa66-400e-aaa6-59c9c979e782&amp;amp;url=http%3a%2f%2fwww.codeplex.com%2fwebvisualizers"" target=_blank&gt;het
WebVisualizer project&lt;/a&gt; wat ik enige tijd geleden op codeplex heb geplaatst. De
volledige source code van dit project is &lt;a title="Webvisualizers source code" href="http://www.richardsoeteman.net/ct.ashx?id=ce0c1abb-fa66-400e-aaa6-59c9c979e782&amp;amp;url=http%3a%2f%2fwww.codeplex.com%2fwebvisualizers%2fSourceControl%2fListDownloadableCommits.aspx"" target=_blank&gt;hier
te downloaden&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=ce0c1abb-fa66-400e-aaa6-59c9c979e782" /&gt;</content>
  </entry>
  <entry>
    <title>LinkedIn groep Microsoft Certified Professionals - Netherlands</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/PermaLink,guid,1ca311e2-8c5b-4e39-8593-60479f6c1ad2.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,1ca311e2-8c5b-4e39-8593-60479f6c1ad2.aspx</id>
    <published>2008-01-02T20:37:06.1633643+01:00</published>
    <updated>2008-01-02T20:37:29.3975906+01:00</updated>
    <content type="html">&lt;p&gt;
&lt;a href="http://www.richardsoeteman.net/ct.ashx?id=1ca311e2-8c5b-4e39-8593-60479f6c1ad2&amp;amp;url=http%3a%2f%2fwww.richardsoeteman.net%2fcontent%2fbinary%2fWindowsLiveWriter%2fLinkedIngroepMicrosoftCertifiedProfessio_11A60%2fMCP(rgb)_2.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="56" alt="MCP(rgb)" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/LinkedIngroepMicrosoftCertifiedProfessio_11A60/MCP(rgb)_thumb.jpg" width="116" align="left" border="0" /&gt;&lt;/a&gt; Onlangs
was ik via &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=1ca311e2-8c5b-4e39-8593-60479f6c1ad2&amp;amp;url=http%3a%2f%2fwww.linkedin.com%2f"" target="_blank"&gt;LinkedIn&lt;/a&gt; lid
geworden van een Microsoft Certified Professionals groep. Nadat mijn aanmelding goedgekeurd
was viel het me op dat er voornamelijk scandinavische namen voorkwamen in de ledenlijst.
Vanochtend werd me duidelijk wat de reden hiervoor was. Ze hadden de naam omgedoopt
van &amp;quot;Microsoft Certified Professionals&amp;quot;&amp;#160; naar&amp;#160; &amp;quot;Microsoft
Certified Professionals - Denmark&amp;quot;. Voor mij had het dus geen zin om hier lid
van de zijn. Het idee van deze groep sprak me destijds wel aan, daarom heb ik de groep
&amp;quot;Microsoft Certified Professionals - Netherlands&amp;quot; op LinkedIn aangemeld. 
&lt;br /&gt;
&lt;br /&gt;
Mocht je Microsoft gecertificeerd zijn en interesse hebben om deel te nemen kan je
je aanmelden via &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=1ca311e2-8c5b-4e39-8593-60479f6c1ad2&amp;amp;url=http%3a%2f%2fwww.linkedin.com%2fe%2fgis%2f48593%2f305EBE483FB4"" target="_blank"&gt;deze
link&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=1ca311e2-8c5b-4e39-8593-60479f6c1ad2" /&gt;</content>
  </entry>
  <entry>
    <title>AdventureWorksLT Database</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/PermaLink,guid,54362434-54dc-4c67-8072-795a65216621.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,54362434-54dc-4c67-8072-795a65216621.aspx</id>
    <published>2007-12-25T10:25:19.4018411+01:00</published>
    <updated>2007-12-25T10:25:35.5892375+01:00</updated>
    <content type="html">&lt;p&gt;
Voor demo en test doeleinden maak je veelal gebruik van de &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=54362434-54dc-4c67-8072-795a65216621&amp;amp;url=http%3a%2f%2fcodeplex.com%2fSqlServerSamples"" target="_blank"&gt;AdventureWorks&lt;/a&gt; of &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=54362434-54dc-4c67-8072-795a65216621&amp;amp;url=http%3a%2f%2fwww.microsoft.com%2fdownloads%2fdetails.aspx%3fFamilyID%3d06616212-0356-46A0-8DA2-EEBC53A68034%26displaylang%3den"" target="_blank"&gt;Norththwind&lt;/a&gt; database.
Lekker simpel en gevuld met data.&amp;#160; Onlangs heb ik een nieuwe laptop aangeschaft
dus mocht ik weer op zoek naar de AdventureWorks database. De Adventureworks database
is verhuisd naar &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=54362434-54dc-4c67-8072-795a65216621&amp;amp;url=http%3a%2f%2fcodeplex.com%2f"" target="_blank"&gt;CodePlex&lt;/a&gt; en
daar kwam ik een light versie van Adventureworks tegen. Deze verschilt in de volgende
opzichten van zijn grotere broer.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Het ontwerp is ge-denormaliseerd zodat er minder joins nodig zijn&lt;/li&gt;
&lt;li&gt;
De database is slechts gevuld met 7MB aan data in plaats van&amp;#160; 183MB in de volledige
versie&lt;/li&gt;
&lt;li&gt;
In plaats van 5 schema's in Adventureworks bestaat de light versie uit 1 schema plus
een dbo schema&lt;/li&gt;
&lt;li&gt;
De database bestaat uit 12 tabellen in plaats van 70 in de volledige versie&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Kortom ideaal voor Demo doeleinden. &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=54362434-54dc-4c67-8072-795a65216621&amp;amp;url=http%3a%2f%2fwww.codeplex.com%2fMSFTDBProdSamples%2fWiki%2fView.aspx%3ftitle%3dAWLTDocs%26referringTitle%3dHome"" target="_blank"&gt;Klik
hier&lt;/a&gt; voor meer informatie en download.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=54362434-54dc-4c67-8072-795a65216621" /&gt;</content>
  </entry>
  <entry>
    <title>Website ajaxload.info</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/PermaLink,guid,c585a539-d64b-4674-abf8-f06aa6ffdad3.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,c585a539-d64b-4674-abf8-f06aa6ffdad3.aspx</id>
    <published>2007-12-17T20:53:39.0325571+01:00</published>
    <updated>2007-12-17T20:55:02.6101472+01:00</updated>
    <content type="html">&lt;p&gt;
Als Web ontwikkelaar ben je er een paar keer per jaar naar op zoek, zo'n mooie loading
image om de gebruiker te vertellen dat hij/zij nog even mag wachten. Vanmiddag was
het weer zover en kwam toen de site &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=c585a539-d64b-4674-abf8-f06aa6ffdad3&amp;amp;url=http%3a%2f%2fwww.ajaxload.info%2f"" target="_blank"&gt;ajaxload.info&lt;/a&gt; tegen.
Via deze site is het mogelijk zo'n afbeelding te genereren. Een aanrader!
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="36" alt="ajax-loader" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/AjaxLoad.Info_DDA1/ajax-loader_3.gif" width="36" border="0" /&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=c585a539-d64b-4674-abf8-f06aa6ffdad3" /&gt;</content>
  </entry>
  <entry>
    <title>Best Pratice: Treat warnings as errors</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/PermaLink,guid,0a0a01ad-2ab7-4cec-9bdf-8ed548b1277c.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,0a0a01ad-2ab7-4cec-9bdf-8ed548b1277c.aspx</id>
    <published>2007-12-13T15:34:59.2999900+01:00</published>
    <updated>2007-12-13T15:35:19.1903604+01:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Vaak kom ik op projecten waar al enige tijd op ontwikkeld is. Wanneer je Visual Studio
opent en je bij de lijst met warnings bekijkt blijkt deze vaak vol te staan met de
meest uiteenlopende meldingen. Veel van deze warnings zijn naar mijn mening gewoon
errors en de rest slordigheid. Veel developers verschuilen zich achter het argument
"Dit lossen we aan het eind van het project op", iets wat zelden gebeurd. 
</p>
        <p>
Momenteel ben ik werkzaam op een project wat nieuw gestart is en besloot dit meteen
af te kappen. In Visual studio kan je bij de properties van het project opgeven dat
warnings als errors beschouwd moeten worden. Door dit de doen dwing je jezelf (en
anderen) de meldingen op te lossen, omdat anders je project niet build.
</p>
        <p>
          <a href="http://www.richardsoeteman.net/ct.ashx?id=0a0a01ad-2ab7-4cec-9bdf-8ed548b1277c&amp;url=http%3a%2f%2fwww.richardsoeteman.net%2fcontent%2fbinary%2fWindowsLiveWriter%2fBestPraticeTreatwarnigsaserrors_CE02%2fTreatwarningsaserrors_2.jpg">
            <img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="548" alt="Treatwarningsaserrors" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/BestPraticeTreatwarnigsaserrors_CE02/Treatwarningsaserrors_thumb.jpg" width="948" border="0" />
          </a>
        </p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=0a0a01ad-2ab7-4cec-9bdf-8ed548b1277c" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Certificaat perikelen deel II</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/PermaLink,guid,986654ed-c122-4718-90ec-76743b1570ef.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,986654ed-c122-4718-90ec-76743b1570ef.aspx</id>
    <published>2007-07-09T09:07:05.3059213+02:00</published>
    <updated>2007-07-09T09:07:05.3059213+02:00</updated>
    <category term="Algemeen" label="Algemeen" scheme="http://www.richardsoeteman.net/CategoryView,category,Algemeen.aspx" />
    <content type="html">&lt;p&gt;
&amp;nbsp;Een aantal weken terug heb ik het al eens gehad over &lt;a title="problemen met Certificaten" href="http://www.richardsoeteman.net/ct.ashx?id=986654ed-c122-4718-90ec-76743b1570ef&amp;amp;url=http%3a%2f%2fwww.richardsoeteman.net%2fPermaLink%2cguid%2c1d54f40a-4373-4fea-846a-d50c884b9d52.aspx"" target=_blank&gt;problemen
met Certificaten&lt;/a&gt;. Deze problemen leken opgelost te zijn totdat ik de applicatie
in&amp;nbsp;acceptatie ging zetten en direct de foutmelding "The request failed with HTTP
status 403: Forbidden. " te zien kreeg.&amp;nbsp;Via google kreeg ik vele resultaten echter
was er geen van toepassing op mijn situatie.&amp;nbsp;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Mijn&amp;nbsp;ASP.NET pagina roept een externe Webservice aan welke via HTTPS gehost wordt.&amp;nbsp;&amp;nbsp;Wanneer
ik een certificaat mee wil sturen werkt dit correct in mijn development webserver
echter gehost via IIS werkt dit in het geheel niet. Het gevolg is een van onderstaande
foutmeldingen:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
The request failed with HTTP status 403: Forbidden. 
&lt;li&gt;
The request was aborted: Could not create SSL/TLS secure channel 
&lt;li&gt;
The underlying connection was closed: An unexpected error occurred on a send.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Het eerste waar je aan denkt is rechten. Dit bleek in mijn geval ook deels de oorzaak
te zijn.&amp;nbsp;&amp;nbsp;Om de rechten op het certificaat te controleren heb je de tool &lt;a title=WinHttpCertCfg href="http://www.richardsoeteman.net/ct.ashx?id=986654ed-c122-4718-90ec-76743b1570ef&amp;amp;url=http%3a%2f%2fmsdn2.microsoft.com%2fen-us%2flibrary%2faa384088.aspx"" target=_blank&gt;WinHttpCertCfg&lt;/a&gt; nodig.
&amp;nbsp;&amp;nbsp;Middels deze tool kan je per certificate store (Local_Machine of Current_User&amp;nbsp;)
bekijken&amp;nbsp;hoe de rechten voor een bepaald certificaat zijn ingesteld.
&lt;/p&gt;
&lt;p&gt;
Current_User: "C:\Program Files\Windows Resource Kits\Tools\"winhttpcertcfg -l -c
"CURRENT_USER\Root" -s "[naam van het certificaat]"&lt;br&gt;
De volgende accounts dienen hier rechten op te hebben:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Ingelogde gebruiker 
&lt;li&gt;
NT Authority\System&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Local_Machine : "C:\Program Files\Windows Resource Kits\Tools\"winhttpcertcfg -l -c
"LOCAL_MACHINE\Root" -s "[naam van het certificaat]"&lt;br&gt;
De volgende accounts dienen hier rechten op te hebben:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Ingelogde gebruiker 
&lt;li&gt;
NT Authority\System 
&lt;li&gt;
ASP.NET Account / network service account (Windows 2003)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
In mijn geval had het ASP.NET account nog geen rechten. Het instellen van de rechten
doe je ook met de WinhttpCertcfg tool. Gebruik &amp;nbsp;hiervoor onderstaande parameters:
&lt;/p&gt;
&lt;p&gt;
"C:\Program Files\Windows Resource Kits\Tools"\winhttpcertcfg -g -c "LOCAL_MACHINE\ROOT"
-S "[naam van het certificaat]" -A "ASP.NET"
&lt;/p&gt;
&lt;p&gt;
Na het toevoegen van de rechten kreeg ik echter nog steeds dezelfde foutmelding. In
mijn geval had de systeembeheerder het certificaat ook in de verkeerde certificaat
repository geïnstalleerd. Met de winhttpcertcfg tool kom je hier niet achter. Deze
kijkt namelijk niet naar de locatie waar het certificaat geïmporteerd is.&amp;nbsp; Middels&amp;nbsp;certificaten.msc
te vinden onder systeembeheer heb ik vervolgens het certificaat geïmporteerd in onderstaande
nodes. 
&lt;/p&gt;
&lt;p&gt;
&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=509 src="http://www.richardsoeteman.net/content/binary/certificaatlocaties.jpg" width=782 border=0&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Tip: Er bestaat een mogelijkheid om deze certificaten te copy/pasten. Gebruik
deze optie niet met certificaten waarin een private key is opgenomen, deze wordt namelijk
niet mee gekopieerd en geeft dus weer andere problemen.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Vervolgens de rechten voor ASP.NET account weer ingesteld en toen werkte alles naar
behoren. Uiteindelijk een simpele oplossing van een probleem dat me een goede dag
gekost heeft.&amp;nbsp;
&lt;/p&gt;
&lt;h3&gt;Resources:
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a title="WinHttpCertCfg.exe, a Certificate Configuration Tool" href="http://www.richardsoeteman.net/ct.ashx?id=986654ed-c122-4718-90ec-76743b1570ef&amp;amp;url=http%3a%2f%2fmsdn2.microsoft.com%2fen-us%2flibrary%2faa384088.aspx"" target=_blank&gt;WinHttpCertCfg.exe,
a Certificate Configuration Tool&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a title="How to call a Web service by using a client certificate for authentication in an ASP.NET Web application" href="http://www.richardsoeteman.net/ct.ashx?id=986654ed-c122-4718-90ec-76743b1570ef&amp;amp;url=http%3a%2f%2fsupport.microsoft.com%2fkb%2f901183"" target=_blank&gt;How
to call a Web service by using a client certificate for authentication in an ASP.NET
Web application&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a title="Kerry D. Wong - Using X509 Certificate with Web Service in ASP.Net" href="http://www.richardsoeteman.net/ct.ashx?id=986654ed-c122-4718-90ec-76743b1570ef&amp;amp;url=http%3a%2f%2fwww.kerrywong.com%2fPermaLink%2cguid%2cb2b16516-9ab9-4ba8-bc22-74ab020ddc81.aspx"" target=_blank&gt;Kerry
D. Wong - Using X509 Certificate with Web Service in ASP.Net&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a title="Working with Certificates" href="http://www.richardsoeteman.net/ct.ashx?id=986654ed-c122-4718-90ec-76743b1570ef&amp;amp;url=http%3a%2f%2fwww.aspnetpro.com%2fnewsletterarticle%2f2006%2f10%2fasp200610mb_l%2fasp200610mb_l.asp"" target=_blank&gt;Working
with Certificates&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=986654ed-c122-4718-90ec-76743b1570ef" /&gt;</content>
  </entry>
  <entry>
    <title>Bepalen positie van een DOMElement met de Microsoft AJAX Library</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/PermaLink,guid,a7f51055-e3ae-47fd-b206-a57baa1c587d.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,a7f51055-e3ae-47fd-b206-a57baa1c587d.aspx</id>
    <published>2007-07-04T09:09:55.7535911+02:00</published>
    <updated>2007-07-04T09:09:55.7535911+02:00</updated>
    <category term="ASP.NET AJAX" label="ASP.NET AJAX" scheme="http://www.richardsoeteman.net/CategoryView,category,ASP.NET%2BAJAX.aspx" />
    <content type="html">&lt;p&gt;
&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=240 src="http://www.richardsoeteman.net/content/binary/popup.jpg" width=274 align=right border=0&gt;Gisteren
liep ik tegen een bug aan in IE6 waarbij selectboxen door mijn kalender modal dialog
heen schijnen. Dit is te verhelpen door de selectboxen te verbergen als de kalender
getoond wordt. Uiteraard wil je dit alleen doen voor selectboxen die daadwerkelijk
door de modal dialog heen gaan schijnen. Het bepalen van de&amp;nbsp;absolute positie
van de selectboxen en de modal dialog is dus benodigd. &amp;nbsp;Even googelen levert
veel resultaat op. Dit zijn echter veelal creatieve oplossingen zoals &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=a7f51055-e3ae-47fd-b206-a57baa1c587d&amp;amp;url=http%3a%2f%2fforums.asp.net%2fp%2f1127738%2f1779505.aspx"" target=_blank&gt;deze&lt;/a&gt;,
waarvan het veelal niet duidelijk is of ze andere browsers dan IE ondersteunen. Ik
besloot ook even te kijken in de documentatie van de &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=a7f51055-e3ae-47fd-b206-a57baa1c587d&amp;amp;url=http%3a%2f%2fajax.asp.net%2fdocs%2fClientReference%2fGlobal%2fdefault.aspx"" target=_blank&gt;Microsoft
AJAX Library&lt;/a&gt;&amp;nbsp; en was blij verast toen ik zag dat mijn gewenste functionaliteit
is opgenomen in deze Library. Zelfs in twee vormen:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.richardsoeteman.net/ct.ashx?id=a7f51055-e3ae-47fd-b206-a57baa1c587d&amp;amp;url=http%3a%2f%2fajax.asp.net%2fdocs%2fClientReference%2fSys.UI%2fDomElementClass%2fSysUIDomElementGetLocationMethod.aspx"" target=_blank&gt;getLocation&lt;/a&gt;
&lt;br&gt;
getlocation bepaald de absolute positie van het DOMElement.
&lt;/p&gt;
&lt;pre&gt;&lt;span style="COLOR: #0000ff"&gt;function&lt;/span&gt; determinePosition(){ &lt;span style="COLOR: #0000ff"&gt;var&lt;/span&gt; domElement
= $get('domelement'); &lt;span style="COLOR: #0000ff"&gt;var&lt;/span&gt; position = Sys.UI.DomElement.getLocation(domElement) &lt;span style="COLOR: #0000ff"&gt;&lt;font color=#000000&gt; &lt;/font&gt;alert&lt;/span&gt;('X:'
+ position.x + ' Y:' + position.y ); }&lt;/pre&gt;
&lt;p&gt;
&lt;a href="http://www.richardsoeteman.net/ct.ashx?id=a7f51055-e3ae-47fd-b206-a57baa1c587d&amp;amp;url=http%3a%2f%2fajax.asp.net%2fdocs%2fClientReference%2fSys.UI%2fDomElementClass%2fSysUIDomElementGetBoundsMethod.aspx"&gt;getBounds&lt;/a&gt;
&lt;br&gt;
getBounds bepaald de absolute positie van het DOMElement en bepaald tevens de hoogte
en breedte van het element.&amp;nbsp;Bij het bepalen van de hoogte en breedte wordt tevens
rekening gehouden met de border en padding van dit element.
&lt;/p&gt;
&lt;pre&gt;&lt;span style="COLOR: #0000ff"&gt;function&lt;/span&gt; determinePosition(){ &lt;span style="COLOR: #0000ff"&gt;var&lt;/span&gt; domElement
= $get('domelement'); &lt;span style="COLOR: #0000ff"&gt;var&lt;/span&gt; bounds = Sys.UI.DomElement.getBounds(domElement) &lt;span style="COLOR: #0000ff"&gt;alert&lt;/span&gt;('X:'
+ bounds.x + ' Y:' + bounds.y + ' Height:' + bounds.height + ' Width:' + bounds.width);
}&lt;/pre&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=a7f51055-e3ae-47fd-b206-a57baa1c587d" /&gt;</content>
  </entry>
  <entry>
    <title>ASP.NET AJAX Library cheat sheets</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/PermaLink,guid,ca17291f-3ef8-4cd4-9791-185cb9bd7b42.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,ca17291f-3ef8-4cd4-9791-185cb9bd7b42.aspx</id>
    <published>2007-07-02T09:23:29.9306304+02:00</published>
    <updated>2007-07-02T09:23:29.9306304+02:00</updated>
    <category term="ASP.NET" label="ASP.NET" scheme="http://www.richardsoeteman.net/CategoryView,category,ASP.NET.aspx" />
    <content type="html">&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Cheat sheets zijn echt handige hulpmiddelen om snel je informatie te vinden. Voor
de ASP.Net AJAX Library zijn o.a. de volgende cheat sheets beschikbaar: 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a title=http://aspnetresources.com/downloads/MS%20Ajax%20Client%20Life-Cycle%20Events.pdf href="http://www.richardsoeteman.net/ct.ashx?id=ca17291f-3ef8-4cd4-9791-185cb9bd7b42&amp;amp;url=http%3a%2f%2faspnetresources.com%2fdownloads%2fMS%2520Ajax%2520Client%2520Life-Cycle%2520Events.pdf"" target=_blank&gt;Microsoft
ASP.NET AJAX Client Life Cycle&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.richardsoeteman.net/ct.ashx?id=ca17291f-3ef8-4cd4-9791-185cb9bd7b42&amp;amp;url=http%3a%2f%2faspnetresources.com%2fblog%2fms_ajax_cheat_sheets_batch2.aspx"" target=_blank&gt;Library
bestaande uit:&lt;/a&gt; 
&lt;ul&gt;
&lt;li&gt;
Domelement class 
&lt;li&gt;
Domevent class 
&lt;li&gt;
String, object, number, date, boolean,array en&amp;nbsp;error&amp;nbsp;extensions&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;a href="http://www.richardsoeteman.net/ct.ashx?id=ca17291f-3ef8-4cd4-9791-185cb9bd7b42&amp;amp;url=http%3a%2f%2fcodebetter.com%2fblogs%2fjay.kimble%2farchive%2f2007%2f02%2f20%2fMS-Ajax-ClientScript-Cheat-Sheets-_2800_by-me_2900_.aspx"" target=_blank&gt;Client
script API&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=ca17291f-3ef8-4cd4-9791-185cb9bd7b42" /&gt;</content>
  </entry>
  <entry>
    <title>Webservice via SSL</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/PermaLink,guid,1d54f40a-4373-4fea-846a-d50c884b9d52.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,1d54f40a-4373-4fea-846a-d50c884b9d52.aspx</id>
    <published>2007-05-21T15:51:57.5850000+02:00</published>
    <updated>2007-05-21T15:52:22.1944490+02:00</updated>
    <content type="html">&lt;p&gt;
Okay het is maandag, nooit mijn beste dag dus een vage foutmelding komt meestal op
dit soort dagen voor. Zo ook vandaag. Ik heb een webservice&amp;nbsp;draaien,&amp;nbsp;hiervoor&amp;nbsp;heb
ik een proxy klasse gemaakt zodat ik hem vanuit code kan gebruiken. Tamelijk standaard
allemaal.&amp;nbsp;Deze&amp;nbsp;service heb ik getest op meerdere servers en&amp;nbsp;draaien
perfect. Vanochtend kreeg ik&amp;nbsp;een bugmelding dat de webservice op 1 server een
foutmelding gaf. De&amp;nbsp;volgende foutmelding wordt getoond &amp;nbsp;"The underlying
connection was closed: Could not establish trust relationship for the SSL/TLS secure
channel. "&amp;nbsp;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Eerst maar eens een SSL Site geconfigureerd in mijn lokale IIS, zodat ik dit probleem
ook lokaal kan reproduceren en debuggen. &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=1d54f40a-4373-4fea-846a-d50c884b9d52&amp;amp;url=http%3a%2f%2fmsdn2.microsoft.com%2fen-us%2flibrary%2fms751408.aspx"" target=_blank&gt;Via
deze link&lt;/a&gt; vind je de info hoe je dit&amp;nbsp;snel kan doen. Toen ik mijn lokale site
startte viel me direct op dat ik het beveiligingswaarschuwing dialoogscherm te zien
kreeg. 
&lt;/p&gt;
&lt;p&gt;
&lt;img height=303 src="http://www.richardsoeteman.net/content/binary/CropperCapture[13].Jpg" width=382&gt;
&lt;/p&gt;
&lt;p&gt;
Deze waarschuwing wordt uiteraard ook getoond als je de webservice opvraagt, hier
moest het probleem wel ergens liggen. Eigenlijk wil kunnen opgeven dat ik standaard
door wil gaan. M.a.w. ik vertrouw het certificaat van de website altijd. De allereerste
post die ik over dit onderwerp tegenkwam was &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=1d54f40a-4373-4fea-846a-d50c884b9d52&amp;amp;url=http%3a%2f%2fweblogs.asp.net%2fjan%2farchive%2f2003%2f12%2f04%2f41154.aspx"" target=_blank&gt;een
blogpost van Jan Tielens&lt;/a&gt;.&amp;nbsp; De methode die hij beschrijft is obsolete in .NET
2.0. In .NET 2.0 moet je gebruik maken van&amp;nbsp;de &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=1d54f40a-4373-4fea-846a-d50c884b9d52&amp;amp;url=http%3a%2f%2fmsdn2.microsoft.com%2fen-us%2flibrary%2fsystem.net.servicepointmanager.servercertificatevalidationcallback.aspx"" target=_blank&gt;ServicePointManager.ServerCertificateValidationCallback
Property&lt;/a&gt;. Feitelijk maak je een CallBack functie die wordt aangeroepen door de
ServicePointManager wanneer een request via HTTPS wordt gedaan.
&lt;/p&gt;
&lt;p&gt;
Onderstaand de callback in VB.Net. Deze retourneert altijd true. M.a.w. ik vertrouw
het certificaat.&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="COLOR: #0000ff"&gt;Function&lt;/span&gt; ValidateCertificate(&lt;span style="COLOR: #0000ff"&gt;ByVal&lt;/span&gt; sender &lt;span style="COLOR: #0000ff"&gt;As&lt;/span&gt; &lt;span style="COLOR: #0000ff"&gt;Object&lt;/span&gt;, &lt;span style="COLOR: #0000ff"&gt;ByVal&lt;/span&gt; certificate &lt;span style="COLOR: #0000ff"&gt;As&lt;/span&gt; X509Certificate, &lt;span style="COLOR: #0000ff"&gt;ByVal&lt;/span&gt; chain &lt;span style="COLOR: #0000ff"&gt;As&lt;/span&gt; X509Chain, &lt;span style="COLOR: #0000ff"&gt;ByVal&lt;/span&gt; sslPolicyErrors &lt;span style="COLOR: #0000ff"&gt;As&lt;/span&gt; SslPolicyErrors) &lt;span style="COLOR: #0000ff"&gt;As&lt;/span&gt; &lt;span style="COLOR: #0000ff"&gt;Boolean&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="COLOR: #0000ff"&gt;True&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #0000ff"&gt;End&lt;/span&gt; &lt;span style="COLOR: #0000ff"&gt;Function&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Onderstaande regel registreert de callback op ServicePointManager. 
&lt;br&gt;
&lt;br&gt;
ServicePointManager.ServerCertificateValidationCallback = &lt;span style="COLOR: #0000ff"&gt;New&lt;/span&gt; RemoteCertificateValidationCallback(&lt;span style="COLOR: #0000ff"&gt;AddressOf&lt;/span&gt; ValidateCertificate)
&lt;/p&gt;
&lt;p&gt;
Wanneer verificatie van het certificaat vereist is wordt nu ValidateCertificate aangeroepen
wat altijd true terug geeft en werkt de webservice nu op alle servers. Uiteindelijk
toch nog een goede maandag
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=1d54f40a-4373-4fea-846a-d50c884b9d52" /&gt;</content>
  </entry>
  <entry>
    <title>Preloaden van ASP.NET AJAX Updatepanel</title>
    <link rel="alternate" type="text/html" href="http://www.richardsoeteman.net/PermaLink,guid,294db11a-e923-48bd-8e21-54f1d6d22a3b.aspx" />
    <id>http://www.richardsoeteman.net/PermaLink,guid,294db11a-e923-48bd-8e21-54f1d6d22a3b.aspx</id>
    <published>2007-05-18T09:36:16.7900255+02:00</published>
    <updated>2007-05-18T09:36:16.7900255+02:00</updated>
    <content type="html">&lt;p&gt;
Tijdens mijn presentatie op &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=294db11a-e923-48bd-8e21-54f1d6d22a3b&amp;amp;url=http%3a%2f%2fwww.code-camp.nl%2f"" target="_blank"&gt;Code-Camp&lt;/a&gt; werd
door &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=294db11a-e923-48bd-8e21-54f1d6d22a3b&amp;amp;url=http%3a%2f%2fwww.dotned.nl%2fblogs%2fpeter_schipper%2fdefault.aspx"" target="_blank"&gt;Peter
Schipper&lt;/a&gt; de vraag gesteld hoe je ervoor kon zorgen dat Update Panels tijdens het
laden van het eerste request voor een pagina direct afgaan. Dit zodat de gebruiker
ook tijdens het eerste request niet lang hoeft te wachten voordat de pagina geladen
is. Het antwoord op deze vraag had ik niet direct paraat en met het antwoord "hier
kom ik nog op terug" sloot ik mijn sessie af. Peter is hier echter verder mee gegaan
en heeft hier een uitgebreide blogpost over geschreven die ik jullie niet wil onthouden.&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.richardsoeteman.net/ct.ashx?id=294db11a-e923-48bd-8e21-54f1d6d22a3b&amp;amp;url=http%3a%2f%2fwww.dotned.nl%2fblogs%2fpeter_schipper%2farchive%2f2007%2f05%2f16%2f461.aspx"" target="_blank"&gt;Naar
blogpost "Preloading ASP.Net AJAX UpdatePanel"&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=294db11a-e923-48bd-8e21-54f1d6d22a3b" /&gt;</content>
  </entry>
</feed>