<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Michiel van Otegem, IT Composer - Development</title>
    <link>http://michiel.vanotegem.nl/</link>
    <description />
    <language>en-us</language>
    <copyright>Michiel van Otegem</copyright>
    <lastBuildDate>Mon, 05 Jul 2010 10:25:18 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.1.8102.813</generator>
    <managingEditor>michiel@aspnl.com</managingEditor>
    <webMaster>michiel@aspnl.com</webMaster>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=c88e5ffd-0600-4bff-8c83-44b41265b345</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,c88e5ffd-0600-4bff-8c83-44b41265b345.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,c88e5ffd-0600-4bff-8c83-44b41265b345.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=c88e5ffd-0600-4bff-8c83-44b41265b345</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A recurring theme in web programming is calling a function periodically and/or at
a specific date and time. This has two aspects:
</p>
        <ul>
          <li>
Calling a function on a scheduled basis 
</li>
          <li>
Making sure time-outs don't interfere</li>
        </ul>
        <p>
          <strong>Calling a function on a scheduled basis</strong>
          <br />
To be able to call a function on your web app, you first need an endpoint (a URL)
that you can call to kick the function off. In ASP.NET you can do this in several
ways:
</p>
        <ol>
          <li>
Create a page that calls the function. 
</li>
          <li>
Create a handler (ASHX) that calls the function (more efficient than a page). 
</li>
          <li>
Create a WCF service that allows calls with HTTP GET, as discussed in <a href="http://sasibhushan.com/Blog/post/WCF-Using-HTTP-GET.aspx">this
blog post by Sasi Suryadevara</a>.</li>
        </ol>
        <p>
With your endpoint in place, you can use the Windows Task Scheduler to invoke
the function at any given time and at intervals as low as one minute. With the Windows
Task Scheduler you have several options again:
</p>
        <p>
Create a VB Script that calls the URL, as discussed in <a href="http://weblogs.asp.net/steveschofield/archive/2006/09/28/Schedule-a-task-to-call-a-webpage-using-Task-scheduler_2E00_.aspx">this
blog post by Steve Schofield</a>.
</p>
        <p>
Create a PowerShell script that calls the URL (same as option 1, but more modern).
</p>
        <p>
Have the Windows Task Scheduler open Internet Explorer and open the specified URL
(e.g. <font face="Courier New">C:\PROGRA~1\INTERN~1\iexplore.exe  -extoff http://www.google.com</font>,
which starts IE without extensions). If you do this, you also need to specify that
the Task Scheduler closes IE after 1 minute, which you can do in the Settings tab
of the task (Windows 2003), or in the Trigger configuration (Windows 2008), as
shown below.
</p>
        <p>
          <img border="0" src="http://michiel.vanotegem.nl/content/binary/task1minute.png" />
          <br />
          <em>Task Settings in Windows 2003</em>
        </p>
        <p>
          <img border="0" src="http://michiel.vanotegem.nl/content/binary/trigger.png" />
          <br />
          <em>Trigger configuration in Windows 2008</em>
        </p>
        <p>
Note: In Windows 2008 the dropdowns governing duration and interval show 30 minutes
as lowest value. You can in fact change this to 1 minute by editing the text.
</p>
        <p>
          <strong>Making sure time-outs don't interfere</strong>
          <br />
A web based call is bound to time-out after a few minutes. If you task takes longer
than that, this may abort the call depending on how you programmed it, and what webserver
settings are used with regards to disconnected clients. To ensure a time-out does
not interfere, you can spawn a new thread and have it call the function. That way
the thread handling the request can return a response to the client, and the function
is carried out regardless. One issue that may arise there is that the function itself
hangs or takes too long. You may want to add logic to ensure that it's aborted after
a certain time, and add logging to notify you of this, and possibly also ensure that
the function can only be run by one caller at a time.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=c88e5ffd-0600-4bff-8c83-44b41265b345" />
      </body>
      <title>Periodically calling a function in your web app</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,c88e5ffd-0600-4bff-8c83-44b41265b345.aspx</guid>
      <link>http://michiel.vanotegem.nl/2010/07/05/PeriodicallyCallingAFunctionInYourWebApp.aspx</link>
      <pubDate>Mon, 05 Jul 2010 10:25:18 GMT</pubDate>
      <description>&lt;p&gt;
A recurring theme in web programming is calling a function periodically and/or at
a specific date and time. This has two aspects:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Calling a function on a scheduled basis 
&lt;li&gt;
Making sure time-outs don't interfere&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Calling a function on a scheduled basis&lt;/strong&gt;
&lt;br&gt;
To be able to call a function on your web app, you first need an endpoint (a URL)
that you can call to kick the function off. In ASP.NET you can do this in several
ways:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Create a page that calls the function. 
&lt;li&gt;
Create a handler (ASHX) that calls the function (more efficient than a page). 
&lt;li&gt;
Create a WCF service that allows calls with HTTP GET, as discussed in &lt;a href="http://sasibhushan.com/Blog/post/WCF-Using-HTTP-GET.aspx"&gt;this
blog post by Sasi Suryadevara&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
With your endpoint in&amp;nbsp;place, you can use the Windows Task Scheduler to invoke
the function at any given time and at intervals as low as one minute. With the Windows
Task Scheduler you have several options again:
&lt;/p&gt;
&lt;p&gt;
Create a VB Script that calls the URL, as discussed in &lt;a href="http://weblogs.asp.net/steveschofield/archive/2006/09/28/Schedule-a-task-to-call-a-webpage-using-Task-scheduler_2E00_.aspx"&gt;this
blog post by Steve Schofield&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Create a PowerShell script that calls the URL (same as option 1, but more modern).
&lt;/p&gt;
&lt;p&gt;
Have the Windows Task Scheduler open Internet Explorer and open the specified URL
(e.g. &lt;font face="Courier New"&gt;C:\PROGRA~1\INTERN~1\iexplore.exe&amp;nbsp; -extoff http://www.google.com&lt;/font&gt;,
which starts IE without extensions). If you do this, you also need to specify that
the Task Scheduler closes IE after 1 minute, which you can do in the Settings tab
of the task (Windows 2003), or in the Trigger configuration&amp;nbsp;(Windows 2008), as
shown below.
&lt;/p&gt;
&lt;p&gt;
&lt;img border=0 src="http://michiel.vanotegem.nl/content/binary/task1minute.png"&gt;
&lt;br&gt;
&lt;em&gt;Task Settings in Windows 2003&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img border=0 src="http://michiel.vanotegem.nl/content/binary/trigger.png"&gt;
&lt;br&gt;
&lt;em&gt;Trigger configuration in Windows 2008&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Note: In Windows 2008 the dropdowns governing duration and interval show 30 minutes
as lowest value. You can in fact change this to 1 minute by editing the text.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Making sure time-outs don't interfere&lt;/strong&gt;
&lt;br&gt;
A web based call is bound to time-out after a few minutes. If you task takes longer
than that, this may abort the call depending on how you programmed it, and what webserver
settings are used with regards to disconnected clients. To ensure a time-out does
not interfere, you can spawn a new thread and have it call the function. That way
the thread handling the request can return a response to the client, and the function
is carried out regardless. One issue that may arise there is that the function itself
hangs or takes too long. You may want to add logic to ensure that it's aborted after
a certain time, and add logging to notify you of this, and possibly also ensure that
the function can only be&amp;nbsp;run&amp;nbsp;by one caller&amp;nbsp;at a time.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=c88e5ffd-0600-4bff-8c83-44b41265b345" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,c88e5ffd-0600-4bff-8c83-44b41265b345.aspx</comments>
      <category>.NET</category>
      <category>ASP.NET</category>
      <category>Development</category>
      <category>English</category>
      <category>Services</category>
      <category>Windows</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=9a66392a-057f-4378-93d5-de1580e41bcd</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,9a66392a-057f-4378-93d5-de1580e41bcd.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,9a66392a-057f-4378-93d5-de1580e41bcd.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=9a66392a-057f-4378-93d5-de1580e41bcd</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Sometimes we come across integration scenario's that look straighforward, but where
the devil is in the details. We needed to integrate our asp.net/silverlight application
in an existing ASP "classic" site (yes, the still exist). The catch was that we needed
to call the ASP "classic" site in a server to server call to get some information,
but we needed to do this under the context of the current user. You may be wondering
why we didn't go through a shared database or someting, but the problem is that there
is little knowledge left of the old app, so changing the existing app was a no go.
</p>
        <p>
So, in order to impersonate the user, you need your server-sided request look like
that user. This means forwarding the cookies the user sends, and sending back the
cookies the server sends to the user. Below is code that demonstrates that.
</p>
        <pre>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">HttpWebRequest
webRequestToServer <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span> (HttpWebRequest)HttpWebRequest.Create(<span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px">"http://somedomain/somepage.asp"</span>);
webRequestToServer.CookieContainer <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">new</span> CookieContainer(); <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">foreach</span> (String
cookieKey <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">in</span> Request.Cookies)
{ HttpCookie cookie <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span> Request.Cookies[cookieKey];
Cookie serverCookie <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">new</span> Cookie(cookie.Name,
cookie.Value, <span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px">"/"</span>, <span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px">"somedomain"</span>);
webRequestToServer.CookieContainer.Add(serverCookie); } HttpWebResponse webResponseFromServer <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span> (HttpWebResponse)webRequestToServer.GetResponse(); <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">foreach</span> (Cookie
serverCookie <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">in</span> webResponseFromServer.Cookies)
{ HttpCookie clientCookie <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span> Response.Cookies[serverCookie.Name]; <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">if</span> (clientCookie
== <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">null</span>)
{ clientCookie <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">new</span> HttpCookie(serverCookie.Name);
} clientCookie.Value <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span> serverCookie.Value;
clientCookie.Expires <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span> serverCookie.Expires;
Response.Cookies.Add(clientCookie); } webResponseFromServer.Close();</span>
        </pre>
        <p>
This code works fine in a test environment, but there is a catch... in some cases
the domain of the server is not set in the cookie you get on the server side. The
problem with that is that when you set the domain, it doesn't correspond to what the
server expects. You can see this if you write out the cookies you send/receive (both
on the browser connection and te server-server connection) to a log or something (including
the domain. It took a while to figure out, but replacing "somedomain" with <font face="Courier New">Request.ServerVariables["LOCAL_ADDR"]</font> did
the trick. 
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=9a66392a-057f-4378-93d5-de1580e41bcd" />
      </body>
      <title>Forwarding cookies</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,9a66392a-057f-4378-93d5-de1580e41bcd.aspx</guid>
      <link>http://michiel.vanotegem.nl/2010/06/04/ForwardingCookies.aspx</link>
      <pubDate>Fri, 04 Jun 2010 20:23:31 GMT</pubDate>
      <description>&lt;p&gt;
Sometimes we come across integration scenario's that look straighforward, but where
the devil is in the details. We needed to integrate our asp.net/silverlight application
in an existing ASP "classic" site (yes, the still exist). The catch was that we needed
to call the ASP "classic" site in a server to server call to get some information,
but we needed to do this under the context of the current user. You may be wondering
why we didn't go through a shared database or someting, but the problem is that there
is little knowledge left of the old app, so changing the existing app was a no go.
&lt;/p&gt;
&lt;p&gt;
So, in order to impersonate the user, you need your server-sided request look like
that user. This means forwarding the cookies the user sends, and sending back the
cookies the server sends to the user. Below is code that demonstrates that.
&lt;/p&gt;
&lt;pre&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;HttpWebRequest
webRequestToServer &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; (HttpWebRequest)HttpWebRequest.Create(&lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"http://somedomain/somepage.asp"&lt;/span&gt;);
webRequestToServer.CookieContainer &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; CookieContainer(); &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;foreach&lt;/span&gt; (String
cookieKey &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;in&lt;/span&gt; Request.Cookies)
{ HttpCookie cookie &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; Request.Cookies[cookieKey];
Cookie serverCookie &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; Cookie(cookie.Name,
cookie.Value, &lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"/"&lt;/span&gt;, &lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"somedomain"&lt;/span&gt;);
webRequestToServer.CookieContainer.Add(serverCookie); } HttpWebResponse webResponseFromServer &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; (HttpWebResponse)webRequestToServer.GetResponse(); &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;foreach&lt;/span&gt; (Cookie
serverCookie &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;in&lt;/span&gt; webResponseFromServer.Cookies)
{ HttpCookie clientCookie &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; Response.Cookies[serverCookie.Name]; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;if&lt;/span&gt; (clientCookie
== &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;null&lt;/span&gt;)
{ clientCookie &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; HttpCookie(serverCookie.Name);
} clientCookie.Value &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; serverCookie.Value;
clientCookie.Expires &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; serverCookie.Expires;
Response.Cookies.Add(clientCookie); } webResponseFromServer.Close();&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
This code works fine in a test environment, but there is a catch... in some cases
the domain of the server is not set in the cookie you get on the server side. The
problem with that is that when you set the domain, it doesn't correspond to what the
server expects. You can see this if you write out the cookies you send/receive (both
on the browser connection and te server-server connection) to a log or something (including
the domain. It took a while to figure out, but replacing "somedomain" with &lt;font face="Courier New"&gt;Request.ServerVariables["LOCAL_ADDR"]&lt;/font&gt; did
the trick. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=9a66392a-057f-4378-93d5-de1580e41bcd" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,9a66392a-057f-4378-93d5-de1580e41bcd.aspx</comments>
      <category>ASP.NET</category>
      <category>Development</category>
      <category>English</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=2fd5a82a-8ba2-4896-b447-e86d66c990d2</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,2fd5a82a-8ba2-4896-b447-e86d66c990d2.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,2fd5a82a-8ba2-4896-b447-e86d66c990d2.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=2fd5a82a-8ba2-4896-b447-e86d66c990d2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
When you're using signing or encryption on your SOAP requests, WCF exepects the response
to be signed/encrypted too. When the response is not signed/encrypted the message
encoder throws a MessageSecurityException. This is perfectly fine behavior, but in
interop scenario's can really bug you, because some WS-* implementations don't sign/encrypt
Fault messages. Now, because the message encoder throws the exception, you can't get
to the underlying SOAP fault. This means that you have no clue why you received a
fault in the first place.
</p>
        <p>
To fix this, Microsoft has provided a <a href="http://support.microsoft.com/kb/971493">hotfix</a>.
With this hotfix in place you can specify <strong>enableUnsecuredResponse="true"</strong> in
the binding configuration to allow unsecured responses. Unfortunately this means that
also valid responses don't have to be signed/encrypted, defeating the purpose of signing
and encryption altogether!
</p>
        <p>
As an alternative, you can implement your own message encoder that wraps the encoder
that is actually used. In the wrapper you can either store the received XML for
use higher up in the call stack, or retrieve the fault and throw a FaultException&lt;&gt;.
Without jumping through hoops the latter option does require your wrapper to
know about the fault types it needs to handle. With the former option you can handle
the exception higher up in the call stack by catching the MessageSecurityException
and throwing a new exception with the XML of the message as a property.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=2fd5a82a-8ba2-4896-b447-e86d66c990d2" />
      </body>
      <title>Receiving unsecured response with WCF</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,2fd5a82a-8ba2-4896-b447-e86d66c990d2.aspx</guid>
      <link>http://michiel.vanotegem.nl/2010/05/28/ReceivingUnsecuredResponseWithWCF.aspx</link>
      <pubDate>Fri, 28 May 2010 14:09:27 GMT</pubDate>
      <description>&lt;p&gt;
When you're using signing or encryption on your SOAP requests, WCF exepects the response
to be signed/encrypted too. When the response is not signed/encrypted the message
encoder throws a MessageSecurityException. This is perfectly fine behavior, but in
interop scenario's can really bug you, because some WS-* implementations don't sign/encrypt
Fault messages. Now, because the message encoder throws the exception, you can't get
to the underlying SOAP fault. This means that you have no clue why you received a
fault in the first place.
&lt;/p&gt;
&lt;p&gt;
To fix this, Microsoft has provided&amp;nbsp;a &lt;a href="http://support.microsoft.com/kb/971493"&gt;hotfix&lt;/a&gt;.
With this hotfix in place you can specify &lt;strong&gt;enableUnsecuredResponse="true"&lt;/strong&gt; in
the binding configuration to allow unsecured responses. Unfortunately this means that
also valid responses don't have to be signed/encrypted, defeating the purpose of signing
and encryption altogether!
&lt;/p&gt;
&lt;p&gt;
As an alternative, you can implement your own message encoder that wraps the encoder
that is actually used.&amp;nbsp;In the wrapper you can either store the received XML for
use higher up in the call stack, or retrieve the fault and throw a FaultException&amp;lt;&amp;gt;.
Without jumping through hoops the latter option&amp;nbsp;does require your wrapper to
know about the fault types it needs to handle. With the former option you can handle
the exception higher up in the call stack by catching the MessageSecurityException
and throwing a new exception with the XML of the message as a property.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=2fd5a82a-8ba2-4896-b447-e86d66c990d2" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,2fd5a82a-8ba2-4896-b447-e86d66c990d2.aspx</comments>
      <category>Development</category>
      <category>English</category>
      <category>WCF</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=6615dee7-3844-44c7-bd5e-b359dea96cb2</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,6615dee7-3844-44c7-bd5e-b359dea96cb2.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,6615dee7-3844-44c7-bd5e-b359dea96cb2.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=6615dee7-3844-44c7-bd5e-b359dea96cb2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
If you've ever tried svcutil.exe to import WSDL which has doesn't have <font face="Courier New">&lt;sp:OnlySignEntireHeadersAndBody&gt;</font> specified
in the security policy, you'll know that this doens't fly. SvcUtil will tell you the
the security policy is not supported. So why is this? I assume this has something
to do with the a statement in paragraph 6.6 in the <a href="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200512/ws-securitypolicy-1.2-spec-cd-01.html">WS-SecurityPolicy
specification</a>, which states:
</p>
        <p>
          <em>Setting the value of this property to 'true' mitigates against some possible re-writing
attacks.</em>
        </p>
        <p>
So apparently Microsoft decided that setting it to false is not a good idea, and decided
not to support setting it to false (omitting the element).
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=6615dee7-3844-44c7-bd5e-b359dea96cb2" />
      </body>
      <title>WSDL and WCF: WCF requires &amp;lt;sp:OnlySignEntireHeadersAndBody&amp;gt;</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,6615dee7-3844-44c7-bd5e-b359dea96cb2.aspx</guid>
      <link>http://michiel.vanotegem.nl/2010/04/02/WSDLAndWCFWCFRequiresLtspOnlySignEntireHeadersAndBodygt.aspx</link>
      <pubDate>Fri, 02 Apr 2010 13:01:07 GMT</pubDate>
      <description>&lt;p&gt;
If you've ever tried svcutil.exe to import WSDL which has doesn't have &lt;font face="Courier New"&gt;&amp;lt;sp:OnlySignEntireHeadersAndBody&amp;gt;&lt;/font&gt; specified
in the security policy, you'll know that this doens't fly. SvcUtil will tell you the
the security policy is not supported. So why is this? I assume this has something
to do with the a statement in paragraph 6.6 in the&amp;nbsp;&lt;a href="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200512/ws-securitypolicy-1.2-spec-cd-01.html"&gt;WS-SecurityPolicy
specification&lt;/a&gt;, which states:
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Setting the value of this property to 'true' mitigates against some possible re-writing
attacks.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
So apparently Microsoft decided that setting it to false is not a good idea, and decided
not to support setting it to false (omitting the element).
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=6615dee7-3844-44c7-bd5e-b359dea96cb2" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,6615dee7-3844-44c7-bd5e-b359dea96cb2.aspx</comments>
      <category>Development</category>
      <category>English</category>
      <category>Services</category>
      <category>WCF</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=c8f101e0-0877-44df-b4c1-041a7d14d4eb</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,c8f101e0-0877-44df-b4c1-041a7d14d4eb.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,c8f101e0-0877-44df-b4c1-041a7d14d4eb.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=c8f101e0-0877-44df-b4c1-041a7d14d4eb</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Talking to a non-WCF webservice is like a box of chocolates... you never know what
you're going to get. After solving the issue mentioned in my previous blog post,
I had another problem. For some reason the service didn't expect a &lt;wsa:ReplyTo&gt;
element if the value was anonymous. Later on the other party adjusted the service
so it actually worked as expected from WCF, but in the mean time I did write a message
inspector to solve the problem. Besides solving the problem it also is a nice little
example of a message inspector.
</p>
        <pre>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
            <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">public</span>
            <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">class</span> RemoveAnonymousReplyToMessageInspector
: IClientMessageInspector { <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">private</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">const</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">string</span> ReplyToNode <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span><span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px">"ReplyTo"</span>; <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">private</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">const</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">string</span> WSAddressingNamespace <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span><span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px">"http://www.w3.org/2005/08/addressing"</span>; <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">public</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">void</span> AfterReceiveReply(<span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">ref</span> System.ServiceModel.Channels.Message
reply, <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">object</span> correlationState)
{} <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: green; FONT-SIZE: 11px">//
Not used for this scenario.</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">public</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">object</span> BeforeSendRequest(<span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">ref</span> System.ServiceModel.Channels.Message
request, System.ServiceModel.IClientChannel channel) { <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: green; FONT-SIZE: 11px">//
This method is called before the request is sent. You can read/manipulate the message
here. // If you're using signing or encryption, that is done after this, this is the
// unencrypted/unsigned mesage.</span> request <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span> RemoveAnonymousReplyTo(request); <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">return</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">null</span>;
} <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">private</span> Message
RemoveAnonymousReplyTo(Message message) { <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">if</span> (message.Headers.ReplyTo.IsAnonymous
== <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">true</span>)
{ <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">int</span> index <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span> message.Headers.FindHeader(ReplyToNode,
WSAddressingNamespace); message.Headers.RemoveAt(index); } <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">return</span> message;
} } </span>
        </pre>
        <p>
To use this, you'll need to create a class implementing the IEndpoint behavior and
add the MessageInspector in ApplyClientBehavior, as follows:
</p>
        <pre>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
            <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">public</span>
            <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">void</span> ApplyClientBehavior(ServiceEndpoint
endpoint, ClientRuntime clientRuntime) { RemoveAnonymousReplyToMessageInspector inspector <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">new</span> RemoveAnonymousReplyToMessageInspector();
clientRuntime.MessageInspectors.Add(inspector); }</span>
        </pre>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=c8f101e0-0877-44df-b4c1-041a7d14d4eb" />
      </body>
      <title>Removing the ReplyTo element if it is anonymous</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,c8f101e0-0877-44df-b4c1-041a7d14d4eb.aspx</guid>
      <link>http://michiel.vanotegem.nl/2010/04/02/RemovingTheReplyToElementIfItIsAnonymous.aspx</link>
      <pubDate>Fri, 02 Apr 2010 12:52:50 GMT</pubDate>
      <description>&lt;p&gt;
Talking to a non-WCF webservice is like a box of chocolates... you never know what
you're going to get. After solving the&amp;nbsp;issue mentioned in my previous blog post,
I had another problem. For some reason the service didn't expect a &amp;lt;wsa:ReplyTo&amp;gt;
element if the value was anonymous. Later on the other party adjusted the service
so it actually worked as expected from WCF, but in the mean time I did write a message
inspector to solve the problem. Besides solving the problem it also is a nice little
example of a message inspector.
&lt;/p&gt;
&lt;pre&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;class&lt;/span&gt; RemoveAnonymousReplyToMessageInspector
: IClientMessageInspector { &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;private&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;const&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;string&lt;/span&gt; ReplyToNode &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"ReplyTo"&lt;/span&gt;; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;private&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;const&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;string&lt;/span&gt; WSAddressingNamespace &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"http://www.w3.org/2005/08/addressing"&lt;/span&gt;; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;void&lt;/span&gt; AfterReceiveReply(&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;ref&lt;/span&gt; System.ServiceModel.Channels.Message
reply, &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;object&lt;/span&gt; correlationState)
{} &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: green; FONT-SIZE: 11px"&gt;//
Not used for this scenario.&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;object&lt;/span&gt; BeforeSendRequest(&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;ref&lt;/span&gt; System.ServiceModel.Channels.Message
request, System.ServiceModel.IClientChannel channel) { &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: green; FONT-SIZE: 11px"&gt;//
This method is called before the request is sent. You can read/manipulate the message
here. // If you're using signing or encryption, that is done after this, this is the
// unencrypted/unsigned mesage.&lt;/span&gt; request &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; RemoveAnonymousReplyTo(request); &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;return&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;null&lt;/span&gt;;
} &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;private&lt;/span&gt; Message
RemoveAnonymousReplyTo(Message message) { &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;if&lt;/span&gt; (message.Headers.ReplyTo.IsAnonymous
== &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;true&lt;/span&gt;)
{ &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;int&lt;/span&gt; index &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; message.Headers.FindHeader(ReplyToNode,
WSAddressingNamespace); message.Headers.RemoveAt(index); } &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;return&lt;/span&gt; message;
} } &lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
To use this, you'll need to create a class implementing the IEndpoint behavior and
add the MessageInspector in ApplyClientBehavior, as follows:
&lt;/p&gt;
&lt;pre&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;void&lt;/span&gt; ApplyClientBehavior(ServiceEndpoint
endpoint, ClientRuntime clientRuntime) { RemoveAnonymousReplyToMessageInspector inspector &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; RemoveAnonymousReplyToMessageInspector();
clientRuntime.MessageInspectors.Add(inspector); }&lt;/span&gt;&lt;/pre&gt;&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=c8f101e0-0877-44df-b4c1-041a7d14d4eb" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,c8f101e0-0877-44df-b4c1-041a7d14d4eb.aspx</comments>
      <category>Development</category>
      <category>English</category>
      <category>Services</category>
      <category>WCF</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=ee864e59-b26a-4716-bc62-bd252a07bbe5</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,ee864e59-b26a-4716-bc62-bd252a07bbe5.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,ee864e59-b26a-4716-bc62-bd252a07bbe5.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=ee864e59-b26a-4716-bc62-bd252a07bbe5</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Recently I found myself trying to talk to a webservice using signing. It was
a WCF calling a Java webservice using a certificate to sign messages. I
kept getting the following exception message:
</p>
        <p>
          <em>The incoming message was signed with a token which was different from what used
to encrypt the body. This was not expected.</em>
        </p>
        <p>
After a wild goose chase we finally figured out that the certificate was corrupted.
Just installing the certificate again solved the issue.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=ee864e59-b26a-4716-bc62-bd252a07bbe5" />
      </body>
      <title>Troubles with WCF and certificate signing</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,ee864e59-b26a-4716-bc62-bd252a07bbe5.aspx</guid>
      <link>http://michiel.vanotegem.nl/2010/04/02/TroublesWithWCFAndCertificateSigning.aspx</link>
      <pubDate>Fri, 02 Apr 2010 12:40:56 GMT</pubDate>
      <description>&lt;p&gt;
Recently I found myself trying to talk to a webservice using signing.&amp;nbsp;It was
a&amp;nbsp;WCF&amp;nbsp;calling a Java webservice using a certificate to sign messages. I
kept getting the following exception message:
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The incoming message was signed with a token which was different from what used
to encrypt the body. This was not expected.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
After a wild goose chase we finally figured out that the certificate was corrupted.
Just installing the certificate again solved the issue.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=ee864e59-b26a-4716-bc62-bd252a07bbe5" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,ee864e59-b26a-4716-bc62-bd252a07bbe5.aspx</comments>
      <category>Development</category>
      <category>English</category>
      <category>WCF</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=67cadfcd-eb82-40ff-9fd5-aca6eea083ac</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,67cadfcd-eb82-40ff-9fd5-aca6eea083ac.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,67cadfcd-eb82-40ff-9fd5-aca6eea083ac.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=67cadfcd-eb82-40ff-9fd5-aca6eea083ac</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've written quite a few functional designs over the years and I've found that for
users needing to validate it having visuals is key. In most cases prospective users
don't understand what they really get until they see screens. On the opposite side
of the spectrum telling developers what to do also is much easier with a screen, especially
when you are debating what would be the best and most efficient (coding wise) way
to give a user certain functionality. In these situations just getting a piece of
paper and draw is the best you can do. The last few years I've done this on and off
on my tablet. I can sketch on it, but the results are often so poor to see (and read!),
that I can't possible put it in a functional design. This is where a good mockup tool
comes in.
</p>
        <p>
A good mockup tool should make you feel like you are drawing, but provide you with
predefined controls to make your job fast and easy. Recently I came across <a href="http://www.balsamiq.com/products/mockups">Balsamiq
Mockups</a>, which is simply jaw dropping. Let's start with the result, which looks
pretty much like a hand drawn thing. At first glance that may not seem like a big
deal, but it is. It states clearly "<em>This is a mockup, the actual thing may look
different</em>". If you give a user something that looks like a screen shot, that
is what to expect to get. With this they know it will look differently when it is
done, and this also makes it much easier to debate your choices and come up with better
ideas (to quote David Platt, "Thy User Is Not You", so they will come up with stuff
you didn't even dream about).
</p>
        <p>
Ok, so the result is great, what about getting there? Well, that's a piece of cake,
really. Balsamiq is as intuitive a tool as I've seen and I was able to create a pretty
complex screen in about 10 minutes. There's a bunch of commonly used controls (and
some less common), and you can easily find what you need. Also, you can download tons
of additional controls from <a href="http://mockupstogo.net">http://mockupstogo.net</a>. Placing,
moving, resizing etc. is all very easy because of the snapping support. Want to see
for yourself? Look <a href="http://www.balsamiq.com/products/mockups/tour">here</a>.
</p>
        <p>
The last things that I find refreshing is the licensing model and fee. It only costs
$79 for a single license, and that comes with updates forever (and they update frequently,
so they say). Because the tool is already so good, this means you can use it for years,
without having to worry about support or having to get a new version.
</p>
        <p>
This is just a great tool. I am sure I will be using it often.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=67cadfcd-eb82-40ff-9fd5-aca6eea083ac" />
      </body>
      <title>Awesome mockup tool</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,67cadfcd-eb82-40ff-9fd5-aca6eea083ac.aspx</guid>
      <link>http://michiel.vanotegem.nl/2010/01/24/AwesomeMockupTool.aspx</link>
      <pubDate>Sun, 24 Jan 2010 21:37:03 GMT</pubDate>
      <description>&lt;p&gt;
I've written quite a few functional designs over the years and I've found that for
users needing to validate it having visuals is key. In most cases prospective users
don't understand what they really get until they see screens. On the opposite side
of the spectrum telling developers what to do also is much easier with a screen, especially
when you are debating what would be the best and most efficient (coding wise)&amp;nbsp;way
to give a user certain functionality. In these situations just getting a piece of
paper and draw is the best you can do. The last few years I've done this on and off
on my tablet. I can sketch on it, but the results are often so poor to see (and read!),
that I can't possible put it in a functional design. This is where a good mockup tool
comes in.
&lt;/p&gt;
&lt;p&gt;
A good mockup tool should make you feel like you are drawing, but provide you with
predefined controls to make your job fast and easy. Recently I came across &lt;a href="http://www.balsamiq.com/products/mockups"&gt;Balsamiq
Mockups&lt;/a&gt;, which is simply jaw dropping. Let's start with the result, which looks
pretty much like a hand drawn thing. At first glance that may not seem like a big
deal, but it is. It states clearly "&lt;em&gt;This is a mockup, the actual thing may look
different&lt;/em&gt;". If you give a user something that looks like a screen shot, that
is what to expect to get. With this they know it will look differently when it is
done, and this also makes it much easier to debate your choices and come up with better
ideas (to quote David Platt, "Thy User Is Not You", so they will come up with stuff
you didn't even dream about).
&lt;/p&gt;
&lt;p&gt;
Ok, so the result is great, what about getting there? Well, that's a piece of cake,
really. Balsamiq is as intuitive a tool as I've seen and I was able to create a pretty
complex screen in about 10 minutes. There's a bunch of commonly used controls (and
some less common), and you can easily find what you need. Also, you can download tons
of&amp;nbsp;additional controls from &lt;a href="http://mockupstogo.net"&gt;http://mockupstogo.net&lt;/a&gt;.&amp;nbsp;Placing,
moving, resizing etc. is all very easy because of the snapping support. Want to see
for yourself? Look &lt;a href="http://www.balsamiq.com/products/mockups/tour"&gt;here&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
The last things that I find refreshing is the licensing model and fee. It only costs
$79 for a single license, and that comes with updates forever (and they update frequently,
so they say). Because the tool is already so good, this means you can use it for years,
without having to worry about support or having to get a new version.
&lt;/p&gt;
&lt;p&gt;
This is just a great tool. I am sure I will be using it often.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=67cadfcd-eb82-40ff-9fd5-aca6eea083ac" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,67cadfcd-eb82-40ff-9fd5-aca6eea083ac.aspx</comments>
      <category>Development</category>
      <category>English</category>
      <category>Review</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=6d2a1db8-9976-4f16-9acc-adf5899fc362</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,6d2a1db8-9976-4f16-9acc-adf5899fc362.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,6d2a1db8-9976-4f16-9acc-adf5899fc362.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=6d2a1db8-9976-4f16-9acc-adf5899fc362</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Recently we moved our projects to a new TFS server. This means that all workspaces
link to the old TFS, and you will get the error message "The path [path] is already
mapped in workspace [workspace]" when you try to add a new reference to a project
you've already worked on. I keep running into this every once in a while, because
we develop from virtual machines and we have different ones for different projects.
I also keep forgetting what to do, so this is partly a message to self.
</p>
        <p>
You can solve this by opening the Visual Studio command prompt and typing:
</p>
        <p>
          <font face="Courier New">tf workspaces /remove:[projectname]</font>
        </p>
        <p>
If you want to remove all of them (which is the case when switching to a new TFS),
you can use a wildcard, like this:
</p>
        <p>
          <font face="Courier New">tf workspaces /remove:*</font>
        </p>
        <p>
Thanks to <a href="http://gregdoesit.com/2009/01/tfs-deleting-old-workspaces/">Gergely
Orosz's post</a> on the topic.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=6d2a1db8-9976-4f16-9acc-adf5899fc362" />
      </body>
      <title>Solving "The path [path] is already mapped in workspace [workspace]"</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,6d2a1db8-9976-4f16-9acc-adf5899fc362.aspx</guid>
      <link>http://michiel.vanotegem.nl/2009/12/21/SolvingThePathPathIsAlreadyMappedInWorkspaceWorkspace.aspx</link>
      <pubDate>Mon, 21 Dec 2009 11:32:52 GMT</pubDate>
      <description>&lt;p&gt;
Recently we moved our projects to a new TFS server. This means that all workspaces
link to the old TFS, and you will get the error message "The path [path] is already
mapped in workspace [workspace]" when you try to add a new reference to a project
you've already worked on.&amp;nbsp;I keep running into this every once in a while, because
we develop from virtual machines and we have different ones for different projects.
I also keep forgetting what to do, so this is partly a message to self.
&lt;/p&gt;
&lt;p&gt;
You can solve this by opening the Visual Studio command prompt and typing:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;tf workspaces /remove:[projectname]&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
If you want to remove all of them (which is the case when switching to a new TFS),
you can use a wildcard, like this:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;tf workspaces /remove:*&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Thanks to &lt;a href="http://gregdoesit.com/2009/01/tfs-deleting-old-workspaces/"&gt;Gergely
Orosz's post&lt;/a&gt; on the topic.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=6d2a1db8-9976-4f16-9acc-adf5899fc362" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,6d2a1db8-9976-4f16-9acc-adf5899fc362.aspx</comments>
      <category>Development</category>
      <category>English</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=39ccbf90-f724-4f79-9af3-478c6ae2ba37</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,39ccbf90-f724-4f79-9af3-478c6ae2ba37.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,39ccbf90-f724-4f79-9af3-478c6ae2ba37.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=39ccbf90-f724-4f79-9af3-478c6ae2ba37</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've been reading parts of this book on and off for a long time, and I've pretty much
read the whole book and some sections more than once, so it is time for a review (even
though this is an "older" book).
</p>
        <p>
If you're a software developer, this is a must read. It gives you a kick in the head
about what you should think of when you develop software. The examples David Platt
uses in this book are very striking, and will make you think about what you've built
yourself. You may feel embarrased sometimes and think "I did that too, shame on me!"
However, in the end it will make you a better developer. Platt shows very well that
IT is no longer about technology, but about the people operating the technology.
</p>
        <p>
This book is also a fun read. Platt has a good sense of humor, and in some cases
the stories he tells themselves are pretty hilarious. The only downside of the book
is that at some point repetition kicks in. The message is clear, so you want to move
on, but there are still more examples explaining the same thing.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=39ccbf90-f724-4f79-9af3-478c6ae2ba37" />
      </body>
      <title>Book Review: Why software sucks and what you can do about it</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,39ccbf90-f724-4f79-9af3-478c6ae2ba37.aspx</guid>
      <link>http://michiel.vanotegem.nl/2009/12/16/BookReviewWhySoftwareSucksAndWhatYouCanDoAboutIt.aspx</link>
      <pubDate>Wed, 16 Dec 2009 13:46:03 GMT</pubDate>
      <description>&lt;p&gt;
I've been reading parts of this book on and off for a long time, and I've pretty much
read the whole book and some sections more than once, so it is time for a review (even
though this is an "older" book).
&lt;/p&gt;
&lt;p&gt;
If you're a software developer, this is a must read. It gives you a kick in the head
about what you should think of when you develop software. The examples David Platt
uses in this book are very striking, and will make you think about what you've built
yourself. You may feel embarrased sometimes and think "I did that too, shame on me!"
However, in the end it will make you a better developer. Platt shows very well that
IT is no longer about technology, but about the people operating the technology.
&lt;/p&gt;
&lt;p&gt;
This book is also a fun read. Platt has a&amp;nbsp;good sense of humor, and in some cases
the stories he tells themselves are pretty hilarious. The only downside of the book
is that at some point repetition kicks in. The message is clear, so you want to move
on, but there are still more examples explaining the same thing.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=39ccbf90-f724-4f79-9af3-478c6ae2ba37" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,39ccbf90-f724-4f79-9af3-478c6ae2ba37.aspx</comments>
      <category>Development</category>
      <category>English</category>
      <category>Review</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=356e9de2-da7e-4db2-ac5b-ad6f8e0de7e3</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,356e9de2-da7e-4db2-ac5b-ad6f8e0de7e3.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,356e9de2-da7e-4db2-ac5b-ad6f8e0de7e3.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=356e9de2-da7e-4db2-ac5b-ad6f8e0de7e3</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We're doing a project where were talking to non-.NET web services and this means that
sometimes we have to see what the exact message looks like. In case you ever
need to do this: a MessageInspector will not (always) be suitable for this.
This is particularly the case where you're using a certificate to sign the message.
Signing happens after the MessageInspector is invoked, so it will just show you the
unsigned message. One thing you can do is setup a URL you can post to that logs the
incoming message as is. We have a "service" like that available to all developers,
because it is a quick and easy solution that doesn't require installing additional
tooling or modify code. Another option is to configure message logging (see the MSDN
article <a href="http://msdn.microsoft.com/en-us/library/aa702726.aspx">Recommended
Settings for Tracing and Message Logging</a>).
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=356e9de2-da7e-4db2-ac5b-ad6f8e0de7e3" />
      </body>
      <title>WCF MessageInspector Pitfall</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,356e9de2-da7e-4db2-ac5b-ad6f8e0de7e3.aspx</guid>
      <link>http://michiel.vanotegem.nl/2009/12/16/WCFMessageInspectorPitfall.aspx</link>
      <pubDate>Wed, 16 Dec 2009 13:36:14 GMT</pubDate>
      <description>&lt;p&gt;
We're doing a project where were talking to non-.NET web services and this means that
sometimes we have to see what the exact message looks like.&amp;nbsp;In case you ever
need to do this:&amp;nbsp;a&amp;nbsp;MessageInspector will not (always) be suitable for this.
This is particularly the case where you're using a certificate to sign the message.
Signing happens after the MessageInspector is invoked, so it will just show you the
unsigned message. One thing you can do is setup a URL you can post to that logs the
incoming message as is. We have a "service" like that available to all developers,
because it is a quick and easy solution that doesn't require installing additional
tooling or modify code. Another option is to configure message logging (see the MSDN
article &lt;a href="http://msdn.microsoft.com/en-us/library/aa702726.aspx"&gt;Recommended
Settings for Tracing and Message Logging&lt;/a&gt;).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=356e9de2-da7e-4db2-ac5b-ad6f8e0de7e3" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,356e9de2-da7e-4db2-ac5b-ad6f8e0de7e3.aspx</comments>
      <category>Development</category>
      <category>English</category>
      <category>WCF</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=a8a54c98-4644-4000-a8b9-1df60e0fcfc2</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,a8a54c98-4644-4000-a8b9-1df60e0fcfc2.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,a8a54c98-4644-4000-a8b9-1df60e0fcfc2.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=a8a54c98-4644-4000-a8b9-1df60e0fcfc2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
At my company we we're looking at creating a generic STS that does not require Active
Directory Federation Services 2.0, and we were also thinking about putting it up on
CodePlex. Dominick Baier from Thinktecture beat us to it with <a href="http://startersts.codeplex.com">StarterSTS</a>.
He's also posted some webcasts on how to use it. Good stuff, so instead rolling our
own, we'll be using/extending this one.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=a8a54c98-4644-4000-a8b9-1df60e0fcfc2" />
      </body>
      <title>Starter STS</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,a8a54c98-4644-4000-a8b9-1df60e0fcfc2.aspx</guid>
      <link>http://michiel.vanotegem.nl/2009/12/01/StarterSTS.aspx</link>
      <pubDate>Tue, 01 Dec 2009 22:20:19 GMT</pubDate>
      <description>&lt;p&gt;
At my company we we're looking at creating a generic STS that does not require Active
Directory Federation Services 2.0, and we were also thinking about putting it up on
CodePlex. Dominick Baier from Thinktecture beat us to it with &lt;a href="http://startersts.codeplex.com"&gt;StarterSTS&lt;/a&gt;.
He's also posted some webcasts on how to use it. Good stuff, so instead rolling our
own, we'll be using/extending this one.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=a8a54c98-4644-4000-a8b9-1df60e0fcfc2" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,a8a54c98-4644-4000-a8b9-1df60e0fcfc2.aspx</comments>
      <category>Development</category>
      <category>English</category>
      <category>Windows Identity Foundation</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=f940e046-6a9a-4d91-98e4-b41ebb8eac91</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,f940e046-6a9a-4d91-98e4-b41ebb8eac91.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,f940e046-6a9a-4d91-98e4-b41ebb8eac91.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=f940e046-6a9a-4d91-98e4-b41ebb8eac91</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Windows Identity Foundation introduces a new ClaimTypes class. It contains predefined
claim type URIs for claims defined by OASIS and Microsoft. In the WIF SDK
project templates for a custom STS this ClaimTypes class is mixed with the one
already in System.IdentityModel.Claims, which is rather confusing. So, what's the
difference?
</p>
        <p>
Functionally: None. All claim type URIs in Microsoft.IdentityModel.Claims.ClaimTypes
are identical to corresponding types in System.IdentityModel.Claims.ClaimTypes. That
said, Microsoft.IdentityModel.Claims.ClaimTypes adds a few new claim types.
</p>
        <p>
Technically: Claim types in System.IdentityModel.Claims.ClaimTypes are defined
as static read only string properties, whereas in Microsoft.IdentityModel.Claims.ClaimTypes
the claim types are string constants.
</p>
        <p>
My advice: for clarity always use Microsoft.IdentityModel.Claims.ClaimTypes.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=f940e046-6a9a-4d91-98e4-b41ebb8eac91" />
      </body>
      <title>System.IdentityModel.Claims.ClaimTypes vs. Microsoft.IdentityModel.Claims.ClaimTypes</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,f940e046-6a9a-4d91-98e4-b41ebb8eac91.aspx</guid>
      <link>http://michiel.vanotegem.nl/2009/11/25/SystemIdentityModelClaimsClaimTypesVsMicrosoftIdentityModelClaimsClaimTypes.aspx</link>
      <pubDate>Wed, 25 Nov 2009 12:33:08 GMT</pubDate>
      <description>&lt;p&gt;
Windows Identity Foundation introduces a new ClaimTypes class. It contains&amp;nbsp;predefined
claim type URIs for claims defined by OASIS and Microsoft.&amp;nbsp;In the WIF&amp;nbsp;SDK
project templates for a custom STS&amp;nbsp;this ClaimTypes class is mixed with the one
already in System.IdentityModel.Claims, which is rather confusing. So, what's the
difference?
&lt;/p&gt;
&lt;p&gt;
Functionally: None. All claim type URIs in Microsoft.IdentityModel.Claims.ClaimTypes
are identical to corresponding types in System.IdentityModel.Claims.ClaimTypes. That
said, Microsoft.IdentityModel.Claims.ClaimTypes adds a few new claim types.
&lt;/p&gt;
&lt;p&gt;
Technically: Claim types in System.IdentityModel.Claims.ClaimTypes&amp;nbsp;are defined
as&amp;nbsp;static read only string properties, whereas in Microsoft.IdentityModel.Claims.ClaimTypes
the claim types are string constants.
&lt;/p&gt;
&lt;p&gt;
My advice: for clarity always use Microsoft.IdentityModel.Claims.ClaimTypes.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=f940e046-6a9a-4d91-98e4-b41ebb8eac91" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,f940e046-6a9a-4d91-98e4-b41ebb8eac91.aspx</comments>
      <category>.NET</category>
      <category>Development</category>
      <category>English</category>
      <category>Windows Identity Foundation</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=01bdc425-c0eb-48a2-9243-f2c29aeb6d33</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,01bdc425-c0eb-48a2-9243-f2c29aeb6d33.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,01bdc425-c0eb-48a2-9243-f2c29aeb6d33.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=01bdc425-c0eb-48a2-9243-f2c29aeb6d33</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
As many BizTalk developers we've been using the SSO (Single Sign On) database for
more than just SSO. We've been storing configuration data in that database too.
This used to be a work around, and we were using some custom tool to edit the
entries in the SSO database. However, we recently learned that Microsoft has
release an MMC snap-in to manage the values. You can download it <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=94e07de1-1d33-4245-b430-9216979cd587">here</a>.
Microsoft itself states this about the tool:
</p>
        <p>
          <em>This tool provides the ability to add and manage applications, add and manage
key value pairs, as well as import and export configuration applications so that they
can be deployed to different environments.</em>
        </p>
        <p>
That apparently means that even Redmond has "officially" accepted that SSO is used
for configuration as well.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=01bdc425-c0eb-48a2-9243-f2c29aeb6d33" />
      </body>
      <title>BizTalk SSO Configuration tool</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,01bdc425-c0eb-48a2-9243-f2c29aeb6d33.aspx</guid>
      <link>http://michiel.vanotegem.nl/2009/11/16/BizTalkSSOConfigurationTool.aspx</link>
      <pubDate>Mon, 16 Nov 2009 22:45:28 GMT</pubDate>
      <description>&lt;p&gt;
As many BizTalk developers we've been using the SSO (Single Sign On) database for
more than just SSO. We've been&amp;nbsp;storing configuration data in that database too.
This used to be a work around, and we were using&amp;nbsp;some custom tool to edit the
entries in the SSO database. However,&amp;nbsp;we recently learned that Microsoft has
release an MMC snap-in to manage the values. You can download it &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=94e07de1-1d33-4245-b430-9216979cd587"&gt;here&lt;/a&gt;.
Microsoft itself&amp;nbsp;states this about the tool:
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;This tool provides the ability to add and manage applications, add and manage
key value pairs, as well as import and export configuration applications so that they
can be deployed to different environments.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
That apparently means that even Redmond has "officially" accepted that SSO is used
for configuration as well.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=01bdc425-c0eb-48a2-9243-f2c29aeb6d33" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,01bdc425-c0eb-48a2-9243-f2c29aeb6d33.aspx</comments>
      <category>Development</category>
      <category>English</category>
      <category>BizTalk</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=d6e1a20d-d255-4648-aa07-2709d3577866</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,d6e1a20d-d255-4648-aa07-2709d3577866.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,d6e1a20d-d255-4648-aa07-2709d3577866.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=d6e1a20d-d255-4648-aa07-2709d3577866</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Recently I found myself having to debug a large stored procedure that calls all sorts
of sub-procedures. Also, the data set was rather large and it only failed sometimes.
SQL Management Studio in this scenario isn't very helpful for several reasons:
</p>
        <ul>
          <li>
The number of PRINT messages that it'll show is limited, so if the error is out of
range... tough luck.</li>
          <li>
Even with PRINT messages it can be hard to pin down which statement is actually in
error.</li>
          <li>
Line numbers are never accurate.</li>
          <li>
It seems View Dendencies sometimes misses out on dependencies.</li>
          <li>
View Dependencies doesn't show the number of times a proc is called from another proc.</li>
        </ul>
        <p>
SQL Profiler, which also comes with SQL Server is a much better tool when it comes
to pin-pointing the erronous statement(s), after which you can modify your code to
show an error message that prints the values causing the hickup. When you use SQL
Profiler, be sure to select more than just the default events. Click Show All Events
and select all Error events, as well as the Stored Procedure events that show Starting
and Completed of SQL statements with stored procedures. Then, once the root procedure
is done, do a Find through the trace for "Error", and you can see exactly which statement
is causing the error.
</p>
        <p>
 
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=d6e1a20d-d255-4648-aa07-2709d3577866" />
      </body>
      <title>Debugging SQL Server (large) stored procedures</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,d6e1a20d-d255-4648-aa07-2709d3577866.aspx</guid>
      <link>http://michiel.vanotegem.nl/2009/11/11/DebuggingSQLServerLargeStoredProcedures.aspx</link>
      <pubDate>Wed, 11 Nov 2009 00:33:56 GMT</pubDate>
      <description>&lt;p&gt;
Recently I found myself having to debug a large stored procedure that calls all sorts
of sub-procedures. Also, the data set was rather large and it only failed sometimes.
SQL Management Studio in this scenario isn't very helpful for several reasons:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
The number of PRINT messages that it'll show is limited, so if the error is out of
range... tough luck.&lt;/li&gt;
&lt;li&gt;
Even with PRINT messages it can be hard to pin down which statement is actually in
error.&lt;/li&gt;
&lt;li&gt;
Line numbers are never accurate.&lt;/li&gt;
&lt;li&gt;
It seems View Dendencies sometimes misses out on dependencies.&lt;/li&gt;
&lt;li&gt;
View Dependencies doesn't show the number of times a proc is called from another proc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
SQL Profiler, which also comes with SQL Server is a much better tool when it comes
to pin-pointing the erronous statement(s), after which you can modify your code to
show an error message that prints the values causing the hickup. When you use SQL
Profiler, be sure to select more than just the default events. Click Show All Events
and select all Error events, as well as the Stored Procedure events that show Starting
and Completed of SQL statements with stored procedures. Then, once the root procedure
is done, do a Find through the trace for "Error", and you can see exactly which statement
is causing the error.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=d6e1a20d-d255-4648-aa07-2709d3577866" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,d6e1a20d-d255-4648-aa07-2709d3577866.aspx</comments>
      <category>Development</category>
      <category>English</category>
      <category>SQL Server</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=52a693f7-863d-41fa-a91a-f8b8cfa82d4a</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,52a693f7-863d-41fa-a91a-f8b8cfa82d4a.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,52a693f7-863d-41fa-a91a-f8b8cfa82d4a.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=52a693f7-863d-41fa-a91a-f8b8cfa82d4a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
My company regularly works on public facing websites, and as such it is imperative
we test the sites we create with most common browsers. Naturally that means at least
Internet Explorer, FireFox, Safari, and Opera. With the last three we just download
and install om some test (virtual) machine. With IE however this is somewhat more
complicated (although not impossible to run different versions of IE side by side.
However, Microsoft provides a set of Virtual PC images known as the <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=21eabb90-958f-4b64-b5f1-73d0a413c8ef">Internet
Explorer Application Compatibility VPC Image</a>. These images enable you
to test different versions of IE on different versions of Windows. These images have
a limited lifetime (between 1-4 months), so you'll have to download a new set
on a regular basis, but other than that this is really handy. The following configurations
are available:
</p>
        <ul>
          <li>
Windows XP SP3 with IE6</li>
          <li>
Windows XP SP3 with IE7</li>
          <li>
Windows XP SP3 with IE8</li>
          <li>
Windows Vista with IE7</li>
          <li>
Windows Vista with IE8</li>
        </ul>
        <p>
Unfortunately these configurations are all en-US, so if you want to test with say
a Dutch version of Windows, you'll have to create your own images (which is what my
company has done, even for en-US).
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=52a693f7-863d-41fa-a91a-f8b8cfa82d4a" />
      </body>
      <title>Testing with different versions of IE</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,52a693f7-863d-41fa-a91a-f8b8cfa82d4a.aspx</guid>
      <link>http://michiel.vanotegem.nl/2009/11/11/TestingWithDifferentVersionsOfIE.aspx</link>
      <pubDate>Wed, 11 Nov 2009 00:20:59 GMT</pubDate>
      <description>&lt;p&gt;
My company regularly works on public facing websites, and as such it is imperative
we test the sites we create with most common browsers. Naturally that means at least
Internet Explorer, FireFox, Safari, and Opera. With the last three we just download
and install om some test (virtual) machine. With IE however this is somewhat more
complicated (although not impossible to run different versions of IE side by side.
However, Microsoft provides a set of Virtual PC images&amp;nbsp;known as the &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=21eabb90-958f-4b64-b5f1-73d0a413c8ef"&gt;Internet
Explorer Application Compatibility VPC Image&lt;/a&gt;.&amp;nbsp;These images&amp;nbsp;enable you
to test different versions of IE on different versions of Windows. These images have
a limited lifetime (between&amp;nbsp;1-4 months), so you'll have to download a new set
on a regular basis, but other than that this is really handy. The following configurations
are available:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Windows XP SP3 with IE6&lt;/li&gt;
&lt;li&gt;
Windows XP SP3 with IE7&lt;/li&gt;
&lt;li&gt;
Windows XP SP3 with IE8&lt;/li&gt;
&lt;li&gt;
Windows Vista with IE7&lt;/li&gt;
&lt;li&gt;
Windows Vista with IE8&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Unfortunately these configurations are all en-US, so if you want to test with say
a Dutch version of Windows, you'll have to create your own images (which is what my
company has done, even for en-US).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=52a693f7-863d-41fa-a91a-f8b8cfa82d4a" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,52a693f7-863d-41fa-a91a-f8b8cfa82d4a.aspx</comments>
      <category>ASP.NET</category>
      <category>Development</category>
      <category>English</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=443aa85b-f4ee-4cfb-9550-70a39b347977</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,443aa85b-f4ee-4cfb-9550-70a39b347977.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,443aa85b-f4ee-4cfb-9550-70a39b347977.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=443aa85b-f4ee-4cfb-9550-70a39b347977</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today <a href="http://orchard.codeplex.com/">http://orchard.codeplex.com/</a> went
live. Orchard is an open source Content Management System that the folks from Redmond
are working on together with the ASP.NET community, and which I've been following
with much interest. Orchard is based on ASP.NET MVC, which means I'd favor it over
something like Umbraco when it is mature enough. Why? Because this should mean that
it blends easier with your regular development efforts, rather than having to deal
with an entirely different templating technology. Umbraco for instance uses XSLT,
and even though I wrote<a href="http://www.amazon.com/exec/obidos/ASIN/0672323184/aspnlcom-20"> a
book a about XSLT</a> and my company is well versed in XSLT because we do a lot of
BizTalk, it is troublesome for plain ASP.NET developers.
</p>
        <p>
Keep in mind that Orchard is relatively new and a lot of scenario's are still not
supported. But at the pace the team is going, you'll soon see more advanced stuff
being possible. You can make yourself heard about what you'd like to see through CodePlex
or through one of the sessions at TechEd or PDC this month.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=443aa85b-f4ee-4cfb-9550-70a39b347977" />
      </body>
      <title>New ASP.NET Open Source CMS in the making</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,443aa85b-f4ee-4cfb-9550-70a39b347977.aspx</guid>
      <link>http://michiel.vanotegem.nl/2009/11/10/NewASPNETOpenSourceCMSInTheMaking.aspx</link>
      <pubDate>Tue, 10 Nov 2009 22:37:34 GMT</pubDate>
      <description>&lt;p&gt;
Today &lt;a href="http://orchard.codeplex.com/"&gt;http://orchard.codeplex.com/&lt;/a&gt;&amp;nbsp;went
live. Orchard is an open source Content Management System that the folks from Redmond
are working on together with the ASP.NET community, and which I've been following
with much interest. Orchard is based on ASP.NET MVC, which means I'd favor it over
something like Umbraco when it is mature enough. Why? Because this should mean that
it blends easier with your regular development efforts, rather than having to deal
with an entirely different templating technology. Umbraco for instance uses XSLT,
and even though I wrote&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0672323184/aspnlcom-20"&gt; a
book a about XSLT&lt;/a&gt; and my company is well versed in XSLT because we do a lot of
BizTalk, it is troublesome for plain ASP.NET developers.
&lt;/p&gt;
&lt;p&gt;
Keep in mind that Orchard is relatively new and a lot of scenario's are still not
supported. But at the pace the team is going, you'll soon see more advanced stuff
being possible. You can make yourself heard about what you'd like to see through CodePlex
or through one of the sessions at TechEd or PDC this month.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=443aa85b-f4ee-4cfb-9550-70a39b347977" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,443aa85b-f4ee-4cfb-9550-70a39b347977.aspx</comments>
      <category>ASP.NET</category>
      <category>Development</category>
      <category>English</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=70768443-da91-472c-a6e5-ccd9059f55b5</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,70768443-da91-472c-a6e5-ccd9059f55b5.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,70768443-da91-472c-a6e5-ccd9059f55b5.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=70768443-da91-472c-a6e5-ccd9059f55b5</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Lately I've been making time to read more again, and I thought I'd share my findings.
My most recent read is <a href="http://www.amazon.com/exec/obidos/ASIN/0735625921/aspnlcom-20" target="_blank">Solid
Code: Optimizing the Software Development Life Cycle</a> by Donis Marshall and John
Bruno. My feelings about this book are mixed. On the one hand, it gives a good overview
of software engineering practices. On the other hand, an overview is all that it is.
It doesn't really do a good job at giving any details. That said, I think it is a
good read for junior/medior developers to get a sense of all the stuff they should
be aware of when building software. For senior developers and architects a quick scan
to see if they have a gap somewhere is enough. From there you can explore books
specialized at the topic(s) you need to know more about. Some of the topics covered
include, design, testing, performance, scalabiltity, and security.
</p>
        <p>
As an aside, I've read several books now that cover Agile development methodologies.
What strikes me everytime is that the given examples are always about product development,
and this book is no different. Product development and custom software projects however
are very different. In product development you can work with fixed budget and fixed
time, and cut features if either budget or time doesn't allow you to create them.
Custom software projects can't do this as easily. Clients are not going to give you
a bag of money and a schedule and say "we'll see what makes it into the final version".
The client wants to know what he/she is going to get for the money they pay. This
means that in custom software projects, you need to have a much more detailed view
up front of what needs to be implemented. I'm not saying this precludes Agile development
practices, but there is a certainly a difference at the start of the project, because
a large chunk of the design work has to be done earlier in the project lifecycle.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=70768443-da91-472c-a6e5-ccd9059f55b5" />
      </body>
      <title>Book Review - Solid Code: Optimizing the Software Development Life Cycle </title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,70768443-da91-472c-a6e5-ccd9059f55b5.aspx</guid>
      <link>http://michiel.vanotegem.nl/2009/10/30/BookReviewSolidCodeOptimizingTheSoftwareDevelopmentLifeCycle.aspx</link>
      <pubDate>Fri, 30 Oct 2009 13:05:13 GMT</pubDate>
      <description>&lt;p&gt;
Lately I've been making time to read more again, and I thought I'd share my findings.
My most recent read is &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0735625921/aspnlcom-20" target=_blank&gt;Solid
Code: Optimizing the Software Development Life Cycle&lt;/a&gt; by Donis Marshall and John
Bruno. My feelings about this book are mixed. On the one hand, it gives a good overview
of software engineering practices. On the other hand, an overview is all that it is.
It doesn't really do a good job at giving any details. That said, I think it is a
good read for junior/medior developers to get a sense of all the stuff they should
be aware of when building software. For senior developers and architects a quick scan
to see if&amp;nbsp;they have a gap somewhere is enough. From there you can explore books
specialized at the topic(s) you need to know more about.&amp;nbsp;Some of the topics covered
include, design, testing, performance, scalabiltity, and security.
&lt;/p&gt;
&lt;p&gt;
As an aside, I've read several books now that cover Agile development methodologies.
What strikes me everytime is that the given examples are always about product development,
and this book is no different. Product development and custom software projects however
are very different. In product development you can work with fixed budget and fixed
time, and cut features if either budget or time doesn't allow you to create them.
Custom software projects can't do this as easily. Clients are not going to give you
a bag of money and a schedule and say "we'll see what makes it into the final version".
The client wants to know what he/she is going to get for the money they pay. This
means that in custom software projects, you need to have a much more detailed view
up front of what needs to be implemented. I'm not saying this precludes Agile development
practices, but there is a certainly a difference at the start of the project, because
a large chunk of the design work has to be done earlier in the project lifecycle.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=70768443-da91-472c-a6e5-ccd9059f55b5" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,70768443-da91-472c-a6e5-ccd9059f55b5.aspx</comments>
      <category>Development</category>
      <category>English</category>
      <category>Review</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=6859ff29-918a-4128-b4db-6e0cdabb4edb</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,6859ff29-918a-4128-b4db-6e0cdabb4edb.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,6859ff29-918a-4128-b4db-6e0cdabb4edb.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=6859ff29-918a-4128-b4db-6e0cdabb4edb</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Every once in a while (when I use a new dev environment) I hit this error:
</p>
        <p>
Saving Changes in not permitted. The changes you have made require the following tables
to be dropped and re-created. You have either made changes to a table that can’t be
re-created or enabled the option Prevent saving changes that require the table to
be re-created
</p>
        <p>
Each time I forget how to fix this, so by posting here I know I'll never forget. Check <a href="http://blog.sqlauthority.com/2009/05/18/sql-server-fix-management-studio-error-saving-changes-in-not-permitted-the-changes-you-have-made-require-the-following-tables-to-be-dropped-and-re-created-you-have-either-made-changes-to-a-tab/">Pinal
Dave's blog post on this error</a> (hint: it's in the Option menu). Thanks Pinal!
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=6859ff29-918a-4128-b4db-6e0cdabb4edb" />
      </body>
      <title>Note to self: SQL Server Management Studio Error "Saving Changes not permitted"</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,6859ff29-918a-4128-b4db-6e0cdabb4edb.aspx</guid>
      <link>http://michiel.vanotegem.nl/2009/09/30/NoteToSelfSQLServerManagementStudioErrorSavingChangesNotPermitted.aspx</link>
      <pubDate>Wed, 30 Sep 2009 15:41:56 GMT</pubDate>
      <description>&lt;p&gt;
Every once in a while (when I use a new dev environment) I hit this error:
&lt;/p&gt;
&lt;p&gt;
Saving Changes in not permitted. The changes you have made require the following tables
to be dropped and re-created. You have either made changes to a table that can’t be
re-created or enabled the option Prevent saving changes that require the table to
be&amp;nbsp;re-created
&lt;/p&gt;
&lt;p&gt;
Each time I forget how to fix this, so by posting here I know I'll never forget. Check &lt;a href="http://blog.sqlauthority.com/2009/05/18/sql-server-fix-management-studio-error-saving-changes-in-not-permitted-the-changes-you-have-made-require-the-following-tables-to-be-dropped-and-re-created-you-have-either-made-changes-to-a-tab/"&gt;Pinal
Dave's blog post on this error&lt;/a&gt;&amp;nbsp;(hint: it's in the Option menu). Thanks Pinal!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=6859ff29-918a-4128-b4db-6e0cdabb4edb" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,6859ff29-918a-4128-b4db-6e0cdabb4edb.aspx</comments>
      <category>Development</category>
      <category>English</category>
      <category>SQL Server</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=75f0b0f7-829e-4a4a-9b8f-ba8b85baa86e</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,75f0b0f7-829e-4a4a-9b8f-ba8b85baa86e.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,75f0b0f7-829e-4a4a-9b8f-ba8b85baa86e.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=75f0b0f7-829e-4a4a-9b8f-ba8b85baa86e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I was working on this little app I wrote a while ago and wanted to add some features
requiring (de)serialization. So, I took the original class and made it a DataContract
so I could use it with the DataContractSerializer. The class then looked more or less
like this:
</p>
        <pre>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">[DataContract] <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">public</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">class</span> MyClass
{ List&lt;Trip&gt; m_Items <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">new</span> List&lt;Item&gt;();
[DataMember] <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">public</span> IList&lt;Item&gt;
Items { get { <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">return</span> m_Items;
} } }</span>
        </pre>
        <p>
Serialization went fine, but when I tried to deserialize the same object, I got a
null reference exception. Of course you say, you should have added a method tied to
de OnDeserializing event, because the constructor of the object doesn't work and hence
the m_Items field is never initialized. The code I added to solve this looked
like this:
</p>
        <pre>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">[OnDeserializing] <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">protected</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">void</span> Init(StreamingContext
context) { m_Items <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">new</span> List&lt;Item&gt;();
}</span>
        </pre>
        <p>
To my surprise I still got the same exception. I finally figured out that the problem
was the type of Items. It is was an IList&lt;&gt; instead of a List&lt;&gt;. To avoid
tying a class to a specific implementation of a list, I usually use an interface,
which is good practice in most cases... however, not when you want to do deserialization
:).
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=75f0b0f7-829e-4a4a-9b8f-ba8b85baa86e" />
      </body>
      <title>DataContractSerializer and interfaces</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,75f0b0f7-829e-4a4a-9b8f-ba8b85baa86e.aspx</guid>
      <link>http://michiel.vanotegem.nl/2009/09/02/DataContractSerializerAndInterfaces.aspx</link>
      <pubDate>Wed, 02 Sep 2009 21:11:22 GMT</pubDate>
      <description>&lt;p&gt;
I was working on this little app I wrote a while ago and wanted to add some features
requiring (de)serialization. So, I took the original class and made it a DataContract
so I could use it with the DataContractSerializer. The class then looked more or less
like this:
&lt;/p&gt;
&lt;pre&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;[DataContract] &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;class&lt;/span&gt; MyClass
{ List&amp;lt;Trip&amp;gt; m_Items &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; List&amp;lt;Item&amp;gt;();
[DataMember] &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt; IList&amp;lt;Item&amp;gt;
Items { get { &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;return&lt;/span&gt; m_Items;
} } }&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
Serialization went fine, but when I tried to deserialize the same object, I got a
null reference exception. Of course you say, you should have added a method tied to
de OnDeserializing event, because the constructor of the object doesn't work and hence
the m_Items field is never initialized. The code I added to solve this&amp;nbsp;looked
like this:
&lt;/p&gt;
&lt;pre&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;[OnDeserializing] &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;protected&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;void&lt;/span&gt; Init(StreamingContext
context) { m_Items &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;new&lt;/span&gt; List&amp;lt;Item&amp;gt;();
}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
To my surprise I still got the same exception. I finally figured out that the problem
was the type of Items. It is was an IList&amp;lt;&amp;gt; instead of a List&amp;lt;&amp;gt;. To avoid
tying a class to a specific implementation of a list, I usually use an interface,
which is good practice in most cases... however, not when you want to do deserialization
:).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=75f0b0f7-829e-4a4a-9b8f-ba8b85baa86e" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,75f0b0f7-829e-4a4a-9b8f-ba8b85baa86e.aspx</comments>
      <category>.NET</category>
      <category>Development</category>
      <category>English</category>
      <category>Services</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=e213994d-019b-4688-8b88-6b454802d802</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,e213994d-019b-4688-8b88-6b454802d802.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,e213994d-019b-4688-8b88-6b454802d802.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=e213994d-019b-4688-8b88-6b454802d802</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
At BataviaLabs we were debating coding guidelines the other day and came across this
one: do you use #if or the ConditionalAttribute to indicate to the compiler if a method
should be compiled. Let me elaborate...
</p>
        <p>
If you have a method you only want to compile in a debug scenario, you have the following
options:
</p>
        <p>
1) Use #if DEBUG as shown below
</p>
        <pre>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
            <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">class</span> Program
{ <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">static</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">void</span> Main(<span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">string</span>[]
args) { <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">#if</span> DEBUG
SomeMethod(); <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">#endif</span> Console.WriteLine(<span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px">"End"</span>);
Console.ReadKey(); } <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">#if</span> DEBUG <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">internal</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">static</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">void</span> SomeMethod()
{ Console.WriteLine(<span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px">"SomeMethod"</span>);
} <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">#endif</span> }</span>
        </pre>
        <p>
2) Use the ConditionalAttribute as shown below
</p>
        <pre>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
            <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">class</span> Program
{ <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">static</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">void</span> Main(<span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">string</span>[]
args) { SomeMethod(); Console.WriteLine(<span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px">"End"</span>);
Console.ReadKey(); } [Conditional(<span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px">"DEBUG"</span>)] <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">internal</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">static</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">void</span> SomeMethod()
{ Console.WriteLine(<span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px">"SomeMethod"</span>);
} }</span>
        </pre>
        <p>
The difference between these two methods is enormous. The first sample is very explicit.
Any code you don't want to compile into the production build is placed between #if
DEBUG and #endif. If you try to call SomeMethod in a production build, the compiler
will give you a compile error. The ConditionalAttributeon the other hand doesn't require
you to remove the calls to SomeMethod. If a method is marked [Conditional], any calls
made to that method are removed from the build by the compiler. A proviso here is
that [Conditional] only works with methods that don't return a value (i.e. void).
</p>
        <p>
I much more prefer #if DEBUG, because it is explicit. I can't run into a situation
where from reading the code I'm thinking "SomeMethod is being executed", but it actually
isn't because the compiler removed the call. Comments anyone?
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=e213994d-019b-4688-8b88-6b454802d802" />
      </body>
      <title>#if vs. ConditionalAttribute</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,e213994d-019b-4688-8b88-6b454802d802.aspx</guid>
      <link>http://michiel.vanotegem.nl/2009/08/26/ifVsConditionalAttribute.aspx</link>
      <pubDate>Wed, 26 Aug 2009 14:59:00 GMT</pubDate>
      <description>&lt;p&gt;
At BataviaLabs we were debating coding guidelines the other day and came across this
one: do you use #if or the ConditionalAttribute to indicate to the compiler if a method
should be compiled. Let me elaborate...
&lt;/p&gt;
&lt;p&gt;
If you have a method you only want to compile in a debug scenario, you have the following
options:
&lt;/p&gt;
&lt;p&gt;
1) Use #if DEBUG as shown&amp;nbsp;below
&lt;/p&gt;
&lt;pre&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;class&lt;/span&gt; Program
{ &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;static&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;void&lt;/span&gt; Main(&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;string&lt;/span&gt;[]
args) { &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;#if&lt;/span&gt; DEBUG
SomeMethod(); &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;#endif&lt;/span&gt; Console.WriteLine(&lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"End"&lt;/span&gt;);
Console.ReadKey(); } &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;#if&lt;/span&gt; DEBUG &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;internal&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;static&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;void&lt;/span&gt; SomeMethod()
{ Console.WriteLine(&lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"SomeMethod"&lt;/span&gt;);
} &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;#endif&lt;/span&gt; }&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
2) Use the ConditionalAttribute as shown below
&lt;/p&gt;
&lt;pre&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;class&lt;/span&gt; Program
{ &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;static&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;void&lt;/span&gt; Main(&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;string&lt;/span&gt;[]
args) { SomeMethod(); Console.WriteLine(&lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"End"&lt;/span&gt;);
Console.ReadKey(); } [Conditional(&lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"DEBUG"&lt;/span&gt;)] &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;internal&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;static&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;void&lt;/span&gt; SomeMethod()
{ Console.WriteLine(&lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"SomeMethod"&lt;/span&gt;);
} }&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
The difference between these two methods is enormous. The first sample is very explicit.
Any code you don't want to compile into the production build is placed between #if
DEBUG and #endif. If you try to call SomeMethod in a production build, the compiler
will give you a compile error. The ConditionalAttributeon the other hand doesn't require
you to remove the calls to SomeMethod. If a method is marked [Conditional], any calls
made to that method are removed from the build by the compiler. A proviso here is
that [Conditional] only works with methods that don't return a value (i.e. void).
&lt;/p&gt;
&lt;p&gt;
I much more prefer #if DEBUG, because it is explicit.&amp;nbsp;I can't run into a situation
where from reading the code I'm thinking "SomeMethod is being executed", but it actually
isn't because the compiler removed the call. Comments anyone?
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=e213994d-019b-4688-8b88-6b454802d802" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,e213994d-019b-4688-8b88-6b454802d802.aspx</comments>
      <category>.NET</category>
      <category>Development</category>
      <category>English</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=45c50599-78d0-423f-97c1-b9afff9caf6f</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,45c50599-78d0-423f-97c1-b9afff9caf6f.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,45c50599-78d0-423f-97c1-b9afff9caf6f.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=45c50599-78d0-423f-97c1-b9afff9caf6f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
When testing a UI, especially a web UI, it is imperative you do so at all resolutions
you expect your users to use. So, how do you size the browser to 1024x768 on a 1680x1050
screen? The answer is a little tool called <a href="http://www.brianapps.net/sizer.html">Sizer</a>.
It allows you to set a window to a prefixed size or you can drag the window size and
it will show the actual size as a tooltip.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=45c50599-78d0-423f-97c1-b9afff9caf6f" />
      </body>
      <title>Must have tool: Sizer</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,45c50599-78d0-423f-97c1-b9afff9caf6f.aspx</guid>
      <link>http://michiel.vanotegem.nl/2009/05/02/MustHaveToolSizer.aspx</link>
      <pubDate>Sat, 02 May 2009 21:48:19 GMT</pubDate>
      <description>&lt;p&gt;
When testing a UI, especially a web UI, it is imperative you do so at all resolutions
you expect your users to use. So, how do you size the browser to 1024x768 on a 1680x1050
screen? The answer is a little tool called &lt;a href="http://www.brianapps.net/sizer.html"&gt;Sizer&lt;/a&gt;.
It allows you to set a window to a prefixed size or you can drag the window size and
it will show the actual size as a tooltip.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=45c50599-78d0-423f-97c1-b9afff9caf6f" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,45c50599-78d0-423f-97c1-b9afff9caf6f.aspx</comments>
      <category>Development</category>
      <category>English</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=c3e7b69c-d15b-449b-90bb-36697796fba3</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,c3e7b69c-d15b-449b-90bb-36697796fba3.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,c3e7b69c-d15b-449b-90bb-36697796fba3.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=c3e7b69c-d15b-449b-90bb-36697796fba3</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I read <a href="http://blogs.msdn.com/stevemar/archive/2009/03/24/windows-azure-and-windows-server-licensing-model.aspx">this
post from Steven Martin</a> at Microsoft and frankly I'm disappointed. Microsoft is
not the only company building cloud computing services, but they have a clear advantage
over most of the providers: they own the operating system. As such, a unique selling
point would definitly be that they can provide you with cloud services, but also enable
you to run your applications in your own data center <strong>without modifications</strong>.
If I build an application for the Windows platform, I want to build it once and be
able to run in on any server infrastructure. As it looks now, this is not possible.
Once built for the cloud, it must remain in the cloud unless you refactor the application
for use in your own environment. I really hope Microsoft sees that this is a mistake
and that it will actually gain them clients if they allow this. There is another factor
here and that's trust. I'd like to have a backup scenario in case Microsoft fails
to deliver. With the Azure platform as is, there is no backup scenario. You either
go for it full-blown, or you don't. It is my belief that many people will decide not
to go with Azure in the first place because of this. In fact, I am now much more reluctant
to tell my clients about Azure as an option.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=c3e7b69c-d15b-449b-90bb-36697796fba3" />
      </body>
      <title>Windows Azure licensing disappointment</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,c3e7b69c-d15b-449b-90bb-36697796fba3.aspx</guid>
      <link>http://michiel.vanotegem.nl/2009/03/26/WindowsAzureLicensingDisappointment.aspx</link>
      <pubDate>Thu, 26 Mar 2009 14:52:29 GMT</pubDate>
      <description>&lt;p&gt;
I read &lt;a href="http://blogs.msdn.com/stevemar/archive/2009/03/24/windows-azure-and-windows-server-licensing-model.aspx"&gt;this
post from Steven Martin&lt;/a&gt; at Microsoft and frankly I'm disappointed. Microsoft is
not the only company building cloud computing services, but they have a clear advantage
over most of the providers: they own the operating system. As such, a unique selling
point would definitly be that they can provide you with cloud services, but also enable
you to run your applications in your own data center &lt;strong&gt;without modifications&lt;/strong&gt;.
If I build an application for the Windows platform, I want to build it once and be
able to run in on any server infrastructure. As it looks now, this is not possible.
Once built for the cloud, it must remain in the cloud unless you refactor the application
for use in your own environment. I really hope Microsoft sees that this is a mistake
and that it will actually gain them clients if they allow this. There is another factor
here and that's trust. I'd like to have a backup scenario in case Microsoft fails
to deliver. With the Azure platform as is, there is no backup scenario. You either
go for it full-blown, or you don't. It is my belief that many people will decide not
to go with Azure in the first place because of this. In fact, I am now much more reluctant
to tell my clients about Azure as an option.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=c3e7b69c-d15b-449b-90bb-36697796fba3" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,c3e7b69c-d15b-449b-90bb-36697796fba3.aspx</comments>
      <category>Development</category>
      <category>English</category>
      <category>Windows Azure</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=0192a8e1-1dee-4207-8b2b-26d5bf8812dd</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,0192a8e1-1dee-4207-8b2b-26d5bf8812dd.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,0192a8e1-1dee-4207-8b2b-26d5bf8812dd.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=0192a8e1-1dee-4207-8b2b-26d5bf8812dd</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
Recently my latest (Dutch) book was released, titled <em>XML - de basis</em>. For
that book I did an interview with Chris Lovett from the <a href="http://blogs.msdn.com/xmlteam/">Microsoft
XML Team</a>. Below is the unedited version of that interview. There's a lot of cool
stuff in the interview which I unfortunately had to cut for the book, because otherwise
it wouldn't fit the number of pages available for the interview. Fortunately, my blog
doesn't have that limitation :).
</p>
        <p>
          <strong>Please tell us who you are and what you do.</strong>
          <br />
My name is Chris Lovett, and I’m an architect on the Data Programmability Tools team
in SQL Server, and I work on XML tools that ship in Visual Studio. As an architect
I do lots of different things including: hands on product development on the XML editor
in Visual Studio 2008 “Orcas”; cross-group collaboration to make sure all our tools
fit together; playing with other concepts like XML Notepad; and thinking about and
communicating our strategy and future directions for our technology.
</p>
        <p>
          <strong>How long have you worked for Microsoft and what did you do before your current
position?</strong>
          <br />
I have worked on pretty much every XML core technology from Microsoft starting with
MSXML in 1997, then to System.Xml in the .NET frameworks v1, and 2 and for the last
few years I’ve been focusing on building XML tools in Visual Studio – for example,
I was the primary developer on the XML editor in Visual Studio 2005. Before Microsoft
I worked at IBM on OS/2 applications, then I joined the IBM Apple/IBM joint venture
called Taligent, then I started my own company in Sillicon Valley with a bunch of
friends from Taligent during the height of the .com boom and that’s what led me to
Microsoft. A lot of the .NET Framework works with XML in some form or another.
</p>
        <p>
          <strong>Why is XML such a key component and what were the challenges you faced because
of that?</strong>
          <br />
For one thing the .NET frameworks were designed during the peak of the XML hype curve
J, but more seriously, many folks at Microsoft were waking up to the fact that not
everything had to be buried in code. Some things could be very neatly described at
a higher “declarative” level and HTML showed the world that “markup” is a great way
to do that. So XML became the way to specify configuration information (.config files),
and build information (MSBuild files), and setup information (WIX), object remoting
with SOAP, and security permissions and so on. All of these domain specific uses of
XML were then supported by our core System.Xml classes. It’s interesting to note that
even those teams that didn’t swallow XML back in .NET v1.0 are fixing that, for example,
we have the new AJAX work from the ASP.NET team and we have XAML in the Windows Presentation
Framework (I’m a huge fan of WPF by the way. I’ve done a lot of UI development in
the last 20 years and I have to say WPF totally rocks). So XML is touching everything
from database, management, communications, content publishing and now even into the
user interface layer. I was amazed at the last PDC just about every talk showed some
snippet of XML somewhere during their talk.
</p>
        <p>
I remember when we started XML at Microsoft most people thought we were crazy. The
biggest challenge was convincing people the cost of parsing and storing verbose XML
tags was worth it and our team has been working on performance, and scalability ever
since. But the technical challenges are easy to overcome. The real reason XML become
a key component of .NET, (and Windows, and SQL Server and Office) is because it achieved
true cross-platform interoperability and because it was good enough for that job,
which leads to the next question…
</p>
        <p>
          <strong>What do you (personally) like the most about XML and its associated standards?</strong>
          <br />
Simplicity, cross-platform interoperability and huge adoption. The great thing about
XML is that it is humble. It’s not trying to solve world hunger. Just invent your
own tags, group them into structures that make sense for your domain and viola. It
is very simple and it is this concept that helped HTML take the world by storm. XML
then improved on HTML by providing a clean separation between data and UI. It brought
MVC to the masses so to speak.
</p>
        <p>
The other day my 12 year old son was all excited and just had to show me what he discovered.
He was editing Age of Empires XML files to tweak the behavior of the game using Notepad.
I asked him how he knew that he could do that and how he knew the XML syntax. He didn’t
know what “syntax” meant, but he knew how to edit XML ! Then the same week my doctor
was all excited when he heard I worked on XML because he was involved in a software
purchasing decision at our local hospital and it came down to their level of XML support.
I couldn’t believe my ears.
</p>
        <p>
The funny thing is that most programmers don’t really like XML. Probably because it
doesn’t use curly brackets J, so most programmers treat XML a bit like the ugly duckling.
But the reality is that the whole world gets markup – to them markup makes our programming
world more approachable. There are still way too many programmers that don’t get this.
</p>
        <p>
          <strong>What would be your #1 tip to people learning XML, XML Schema, XSLT and XQuery?</strong>
          <br />
First of all I would say that XML 1.0 is the foundation. A must have. Can’t go wrong
there, learn it, and learn how XML encoding works – that’s the number one issue people
have with XML 1.0 – people don’t take the time to understand how UTF-8 encoding works
which is a pretty important foundation to XML. Don’t worry too much about DTD, because
we now have XML schema.
</p>
        <p>
XML Schema (XSD) is a layer on top of XML 1.0. When you need a way to describe your
XML structure in “standard contract” XSD is handy and most importantly – it’s there
and it’s a standard. So don’t re-invent the wheel, but I’m not going to say that XSD
is the be all and end all of data modeling, because it isn’t. A lot of things are
missing, which is why people had to invent things like Schematron, and why Microsoft
is working on EDM and SML and so on. Model driven development is now on the peak of
the hype curve so I expect that modeling will be a battle ground for a long time to
come. So take a pragmatic approach to XSD - use it if it fits your purpose. Some folks
use other modeling approaches then have a tool that spits out the XSD – and that’s
fine too. 
</p>
        <p>
Same goes for XQuery and XSLT – I think of these as being yet another layer above
XSD. We did XSLT and XQuery because we figured that XML is data therefore people will
want ways to query and transform that data. Makes sense, and I’ve done a lot of XSLT
development, I still use it for specific tasks, but some things are a bit tedious.
I find myself escaping to script a lot. XSLT 2.0 is a good improvement, but again,
these things are not going to be the be all and end all of query and transformation
languages.
</p>
        <p>
For example, I’m a huge fan of the work they are doing in VB 9 with XML literals connected
to our new Language Integrated Query (LINQ). It makes a lot of sense, because instead
of having to “escape” to script, you just write the code you need right there in place
– you have a complete general purpose programming language at your finger tips. VB-XML
integration is big leap forward for VB programmers and allows those developers, who
may not be as familiar with the standard XML technologies like XSLT, to easily process
XML data inside their programs. It’s a huge advantage to the VB programmer and we
think it helps make VB an extremely compelling language for XML programming – it makes
me want to write VB again, and I’ve heard many others say the same thing. However,
it is VB-specific so development teams that need cross-platform interoperability at
the query/transform layer are likely to stick to the standard technologies like XSLT
and XQuery.
</p>
        <p>
There’s a very interesting tension going on here where general purpose languages like
VB and C# are moving up into declarative space with LINQ but not going all the way
into declarative, versus SQL, XQuery and XSLT which are fully declarative with no
side effects, which are therefore more optimizable, but sometimes rather incomplete
as programming languages go and rather hard to author in some cases. I really don’t
know how it’s going to end up. I think we should continue innovating on both approaches
and see what happens. It should be very interesting.
</p>
        <p>
As for all the myriad other XML standards out there, there’s a lot of hype that you
have to sort though. To me it’s a funny thing to see programmers going to town making
XML more complicated with layer upon layer of new concepts. I remember going to a
conference and people were telling me “stop! – we can’t take any more”. There is genius
in simplicity. I’m glad to see the renewed focus on simple REST-ful XML based services
for this reason. If simple works, why complicate it. Conversely, if it isn’t simple,
chances are people just won’t use it.
</p>
        <p>
          <strong>What can we expect from Microsoft in the future in the XML arena? Will support
for XQuery 1.0 and XSLT 2.0 become part of Microsoft’s offering?</strong>
          <br />
Microsoft is a pretty big place, so it’s hard for me to know all that is going with
XML across the company. But I do know about .NET, Visual Studio and SQL server. As
I’ve mentioned before we are shipping the XML support in Visual Basic 9.0 with XML
literals, XML axis properties and integration with LINQ to XML. LINQ to XML is our
API which we are adding to the XML runtime in .NET 3.5, it is a new XML object model
that is designed to work well with the Language Integrate Query capabilities of C#
and VB. We are also shipping some cool new features in the XML tools in Visual Studio
2008, including an incremental parser with extensibility API based on LINQ to XML
that 3rd party XML designers can build on. We are also adding data breakpoints in
the XSLT debugger and we have a new command line tool named “xsltc.exe” which takes
XSLT and generates a .NET assembly which you can then deploy with your app instead
of the XSLT source so you don’t have to compile XSLT on the server. Anton Lapounov
has a great blog that talks about that. There is not much else new in the System.Xml
runtime because Visual Studio 2008 is essentially a service pack release of the .NET
2.0 runtime, so we’ve fixed some bugs there. We are also working on some XML features
in Silverlight and we put up a preview of our LINQ to XSD work on MSDN. We are working
on a new XSD designer and you will see a CTP on MSDN pretty soon.
</p>
        <p>
As for XQuery, you probably know we have a subset of XQuery already supported inside
SQL Server. We currently have no official plans that we can announce on a client side
XQuery engine but we are definitely interested in expanding client side query processing.
LINQ offers a path to this (for both relational as well as XML). ESQL provides another
client-side investment. We are open to customer feedback on the relative importance
of client side XQuery compared to all these other possibilities. Meanwhile we are
doing some XQuery improvements in SQL Server 2008, adding LET, better datetime support,
and lax validation.
</p>
        <p>
As for XSLT 2.0 - we’ve heard from customers and understand the improvements in XSLT
2.0 over XSLT 1.0, but right now we’re in the middle of a big strategic investment
in LINQ and EDM for the future of the data programming platform which we think will
create major improvements in programming against all types of data. But we are always
re-evaluating our technology investments so if your readers want to ramp up their
volume on XSLT 2.0 please ask them to <a href="http://blogs.msdn.com/xmlteam/contact.aspx">drop
us a line</a> with their comments.
</p>
        <p>
Meanwhile I was rather surprised by the positive feedback to my little XML Notepad
2007 tool. It now has over 1 million downloads and is still going strong. Not bad
for a couple weeks work and no marketing. So something about this tool hit the sweet
spot. The interesting thing there is it reaches out to the non-programmer community
and I think that is the key and it has the right balance of simplicity and usability.
A Swedish customer said it is “logam” – just enough. I think you should expect to
see more from Microsoft in the future that helps to make XML something that everyone
on the planet can deal with easily and in a way that integrates deeply with everything
else Microsoft provides.
</p>
        <p>
As the XML hype is wearing off, folks are realizing that not everything that made
it through the standards process needs to be implemented. So I think you will see
Microsoft continue to innovate on new XML technologies and tools like LINQ to XML
and VB 9.0 XML and you’ll see Microsoft taking a more pragmatic customer-demand-driven
approach to standards. Microsoft will probably never implement every standard that
comes out but I’m confident you will see Microsoft continue to be committed to the
really important XML standards, like XML 1.0, and any other standard that is essential
to achieving cross-platform <a href="http://www.microsoft.com/interop">interoperability</a>,
including <a href="http://office.microsoft.com/en-us/products/HA102058151033.aspx">Open
XML</a>. There is enormous power in the cross-platform reach of XML and the huge industry
adoption it has and I’m happy to see that Microsoft is continuing to do some really
innovative work with XML. 
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=0192a8e1-1dee-4207-8b2b-26d5bf8812dd" />
      </body>
      <title>Interview with Chris Lovett from Microsoft</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,0192a8e1-1dee-4207-8b2b-26d5bf8812dd.aspx</guid>
      <link>http://michiel.vanotegem.nl/2007/11/16/InterviewWithChrisLovettFromMicrosoft.aspx</link>
      <pubDate>Fri, 16 Nov 2007 01:03:41 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Recently my latest (Dutch) book was released, titled &lt;em&gt;XML - de basis&lt;/em&gt;. For
that book I did an interview with Chris Lovett from the &lt;a href="http://blogs.msdn.com/xmlteam/"&gt;Microsoft
XML Team&lt;/a&gt;. Below is the unedited version of that interview. There's a lot of cool
stuff in the interview which I unfortunately had to cut for the book, because otherwise
it wouldn't fit the number of pages available for the interview. Fortunately, my blog
doesn't have that limitation :).
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Please tell us who you are and what you do.&lt;/strong&gt;
&lt;br&gt;
My name is Chris Lovett, and I’m an architect on the Data Programmability Tools team
in SQL Server, and I work on XML tools that ship in Visual Studio. As an architect
I do lots of different things including: hands on product development on the XML editor
in Visual Studio 2008 “Orcas”; cross-group collaboration to make sure all our tools
fit together; playing with other concepts like XML Notepad; and thinking about and
communicating our strategy and future directions for our technology.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;How long have you worked for Microsoft and what did you do before your current
position?&lt;/strong&gt;
&lt;br&gt;
I have worked on pretty much every XML core technology from Microsoft starting with
MSXML in 1997, then to System.Xml in the .NET frameworks v1, and 2 and for the last
few years I’ve been focusing on building XML tools in Visual Studio – for example,
I was the primary developer on the XML editor in Visual Studio 2005. Before Microsoft
I worked at IBM on OS/2 applications, then I joined the IBM Apple/IBM joint venture
called Taligent, then I started my own company in Sillicon Valley with a bunch of
friends from Taligent during the height of the .com boom and that’s what led me to
Microsoft. A lot of the .NET Framework works with XML in some form or another.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Why is XML such a key component and what were the challenges you faced because
of that?&lt;/strong&gt;
&lt;br&gt;
For one thing the .NET frameworks were designed during the peak of the XML hype curve
J, but more seriously, many folks at Microsoft were waking up to the fact that not
everything had to be buried in code. Some things could be very neatly described at
a higher “declarative” level and HTML showed the world that “markup” is a great way
to do that. So XML became the way to specify configuration information (.config files),
and build information (MSBuild files), and setup information (WIX), object remoting
with SOAP, and security permissions and so on. All of these domain specific uses of
XML were then supported by our core System.Xml classes. It’s interesting to note that
even those teams that didn’t swallow XML back in .NET v1.0 are fixing that, for example,
we have the new AJAX work from the ASP.NET team and we have XAML in the Windows Presentation
Framework (I’m a huge fan of WPF by the way. I’ve done a lot of UI development in
the last 20 years and I have to say WPF totally rocks). So XML is touching everything
from database, management, communications, content publishing and now even into the
user interface layer. I was amazed at the last PDC just about every talk showed some
snippet of XML somewhere during their talk.
&lt;/p&gt;
&lt;p&gt;
I remember when we started XML at Microsoft most people thought we were crazy. The
biggest challenge was convincing people the cost of parsing and storing verbose XML
tags was worth it and our team has been working on performance, and scalability ever
since. But the technical challenges are easy to overcome. The real reason XML become
a key component of .NET, (and Windows, and SQL Server and Office) is because it achieved
true cross-platform interoperability and because it was good enough for that job,
which leads to the next question…
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;What do you (personally) like the most about XML and its associated standards?&lt;/strong&gt;
&lt;br&gt;
Simplicity, cross-platform interoperability and huge adoption. The great thing about
XML is that it is humble. It’s not trying to solve world hunger. Just invent your
own tags, group them into structures that make sense for your domain and viola. It
is very simple and it is this concept that helped HTML take the world by storm. XML
then improved on HTML by providing a clean separation between data and UI. It brought
MVC to the masses so to speak.
&lt;/p&gt;
&lt;p&gt;
The other day my 12 year old son was all excited and just had to show me what he discovered.
He was editing Age of Empires XML files to tweak the behavior of the game using Notepad.
I asked him how he knew that he could do that and how he knew the XML syntax. He didn’t
know what “syntax” meant, but he knew how to edit XML ! Then the same week my doctor
was all excited when he heard I worked on XML because he was involved in a software
purchasing decision at our local hospital and it came down to their level of XML support.
I couldn’t believe my ears.
&lt;/p&gt;
&lt;p&gt;
The funny thing is that most programmers don’t really like XML. Probably because it
doesn’t use curly brackets J, so most programmers treat XML a bit like the ugly duckling.
But the reality is that the whole world gets markup – to them markup makes our programming
world more approachable. There are still way too many programmers that don’t get this.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;What would be your #1 tip to people learning XML, XML Schema, XSLT and XQuery?&lt;/strong&gt;
&lt;br&gt;
First of all I would say that XML 1.0 is the foundation. A must have. Can’t go wrong
there, learn it, and learn how XML encoding works – that’s the number one issue people
have with XML 1.0 – people don’t take the time to understand how UTF-8 encoding works
which is a pretty important foundation to XML. Don’t worry too much about DTD, because
we now have XML schema.
&lt;/p&gt;
&lt;p&gt;
XML Schema (XSD) is a layer on top of XML 1.0. When you need a way to describe your
XML structure in “standard contract” XSD is handy and most importantly – it’s there
and it’s a standard. So don’t re-invent the wheel, but I’m not going to say that XSD
is the be all and end all of data modeling, because it isn’t. A lot of things are
missing, which is why people had to invent things like Schematron, and why Microsoft
is working on EDM and SML and so on. Model driven development is now on the peak of
the hype curve so I expect that modeling will be a battle ground for a long time to
come. So take a pragmatic approach to XSD - use it if it fits your purpose. Some folks
use other modeling approaches then have a tool that spits out the XSD – and that’s
fine too. 
&lt;/p&gt;
&lt;p&gt;
Same goes for XQuery and XSLT – I think of these as being yet another layer above
XSD. We did XSLT and XQuery because we figured that XML is data therefore people will
want ways to query and transform that data. Makes sense, and I’ve done a lot of XSLT
development, I still use it for specific tasks, but some things are a bit tedious.
I find myself escaping to script a lot. XSLT 2.0 is a good improvement, but again,
these things are not going to be the be all and end all of query and transformation
languages.
&lt;/p&gt;
&lt;p&gt;
For example, I’m a huge fan of the work they are doing in VB 9 with XML literals connected
to our new Language Integrated Query (LINQ). It makes a lot of sense, because instead
of having to “escape” to script, you just write the code you need right there in place
– you have a complete general purpose programming language at your finger tips. VB-XML
integration is big leap forward for VB programmers and allows those developers, who
may not be as familiar with the standard XML technologies like XSLT, to easily process
XML data inside their programs. It’s a huge advantage to the VB programmer and we
think it helps make VB an extremely compelling language for XML programming – it makes
me want to write VB again, and I’ve heard many others say the same thing. However,
it is VB-specific so development teams that need cross-platform interoperability at
the query/transform layer are likely to stick to the standard technologies like XSLT
and XQuery.
&lt;/p&gt;
&lt;p&gt;
There’s a very interesting tension going on here where general purpose languages like
VB and C# are moving up into declarative space with LINQ but not going all the way
into declarative, versus SQL, XQuery and XSLT which are fully declarative with no
side effects, which are therefore more optimizable, but sometimes rather incomplete
as programming languages go and rather hard to author in some cases. I really don’t
know how it’s going to end up. I think we should continue innovating on both approaches
and see what happens. It should be very interesting.
&lt;/p&gt;
&lt;p&gt;
As for all the myriad other XML standards out there, there’s a lot of hype that you
have to sort though. To me it’s a funny thing to see programmers going to town making
XML more complicated with layer upon layer of new concepts. I remember going to a
conference and people were telling me “stop! – we can’t take any more”. There is genius
in simplicity. I’m glad to see the renewed focus on simple REST-ful XML based services
for this reason. If simple works, why complicate it. Conversely, if it isn’t simple,
chances are people just won’t use it.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;What can we expect from Microsoft in the future in the XML arena? Will support
for XQuery 1.0 and XSLT 2.0 become part of Microsoft’s offering?&lt;/strong&gt;
&lt;br&gt;
Microsoft is a pretty big place, so it’s hard for me to know all that is going with
XML across the company. But I do know about .NET, Visual Studio and SQL server. As
I’ve mentioned before we are shipping the XML support in Visual Basic 9.0 with XML
literals, XML axis properties and integration with LINQ to XML. LINQ to XML is our
API which we are adding to the XML runtime in .NET 3.5, it is a new XML object model
that is designed to work well with the Language Integrate Query capabilities of C#
and VB. We are also shipping some cool new features in the XML tools in Visual Studio
2008, including an incremental parser with extensibility API based on LINQ to XML
that 3rd party XML designers can build on. We are also adding data breakpoints in
the XSLT debugger and we have a new command line tool named “xsltc.exe” which takes
XSLT and generates a .NET assembly which you can then deploy with your app instead
of the XSLT source so you don’t have to compile XSLT on the server. Anton Lapounov
has a great blog that talks about that. There is not much else new in the System.Xml
runtime because Visual Studio 2008 is essentially a service pack release of the .NET
2.0 runtime, so we’ve fixed some bugs there. We are also working on some XML features
in Silverlight and we put up a preview of our LINQ to XSD work on MSDN. We are working
on a new XSD designer and you will see a CTP on MSDN pretty soon.
&lt;/p&gt;
&lt;p&gt;
As for XQuery, you probably know we have a subset of XQuery already supported inside
SQL Server. We currently have no official plans that we can announce on a client side
XQuery engine but we are definitely interested in expanding client side query processing.
LINQ offers a path to this (for both relational as well as XML). ESQL provides another
client-side investment. We are open to customer feedback on the relative importance
of client side XQuery compared to all these other possibilities. Meanwhile we are
doing some XQuery improvements in SQL Server 2008, adding LET, better datetime support,
and lax validation.
&lt;/p&gt;
&lt;p&gt;
As for XSLT 2.0 - we’ve heard from customers and understand the improvements in XSLT
2.0 over XSLT 1.0, but right now we’re in the middle of a big strategic investment
in LINQ and EDM for the future of the data programming platform which we think will
create major improvements in programming against all types of data. But we are always
re-evaluating our technology investments so if your readers want to ramp up their
volume on XSLT 2.0 please ask them to &lt;a href="http://blogs.msdn.com/xmlteam/contact.aspx"&gt;drop
us a line&lt;/a&gt; with their comments.
&lt;/p&gt;
&lt;p&gt;
Meanwhile I was rather surprised by the positive feedback to my little XML Notepad
2007 tool. It now has over 1 million downloads and is still going strong. Not bad
for a couple weeks work and no marketing. So something about this tool hit the sweet
spot. The interesting thing there is it reaches out to the non-programmer community
and I think that is the key and it has the right balance of simplicity and usability.
A Swedish customer said it is “logam” – just enough. I think you should expect to
see more from Microsoft in the future that helps to make XML something that everyone
on the planet can deal with easily and in a way that integrates deeply with everything
else Microsoft provides.
&lt;/p&gt;
&lt;p&gt;
As the XML hype is wearing off, folks are realizing that not everything that made
it through the standards process needs to be implemented. So I think you will see
Microsoft continue to innovate on new XML technologies and tools like LINQ to XML
and VB 9.0 XML and you’ll see Microsoft taking a more pragmatic customer-demand-driven
approach to standards. Microsoft will probably never implement every standard that
comes out but I’m confident you will see Microsoft continue to be committed to the
really important XML standards, like XML 1.0, and any other standard that is essential
to achieving cross-platform &lt;a href="http://www.microsoft.com/interop"&gt;interoperability&lt;/a&gt;,
including &lt;a href="http://office.microsoft.com/en-us/products/HA102058151033.aspx"&gt;Open
XML&lt;/a&gt;. There is enormous power in the cross-platform reach of XML and the huge industry
adoption it has and I’m happy to see that Microsoft is continuing to do some really
innovative work with XML. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=0192a8e1-1dee-4207-8b2b-26d5bf8812dd" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,0192a8e1-1dee-4207-8b2b-26d5bf8812dd.aspx</comments>
      <category>Development</category>
      <category>English</category>
      <category>XML</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=6360b2c8-e014-49c5-9d6e-93036a78d29f</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,6360b2c8-e014-49c5-9d6e-93036a78d29f.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,6360b2c8-e014-49c5-9d6e-93036a78d29f.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=6360b2c8-e014-49c5-9d6e-93036a78d29f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Op 17 en 18 september is in ons land weer de Software Developer Conference (SDC) georganiseerd
door het Software Developer Network. Hier zijn een aantal toonaangevende internationale
sprekers te zien waarvoor je normaal gezien naar het buitenland moet. Zeker de moeite
waard dus. Zie <a href="http://www.sdc.nl">http://www.sdc.nl</a> voor meer info.
Ik weet zelf helaas nog niet of ik erbij kan zijn, hoewel Ordina wel een stand heeft.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=6360b2c8-e014-49c5-9d6e-93036a78d29f" />
      </body>
      <title>SDC op 17 en 18 september</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,6360b2c8-e014-49c5-9d6e-93036a78d29f.aspx</guid>
      <link>http://michiel.vanotegem.nl/2007/07/23/SDCOp17En18September.aspx</link>
      <pubDate>Mon, 23 Jul 2007 20:00:09 GMT</pubDate>
      <description>&lt;p&gt;
Op 17 en 18 september is in ons land weer de Software Developer Conference (SDC) georganiseerd
door het Software Developer Network. Hier zijn een aantal toonaangevende internationale
sprekers te zien waarvoor je normaal gezien naar het buitenland moet. Zeker de moeite
waard dus. Zie &lt;a href="http://www.sdc.nl"&gt;http://www.sdc.nl&lt;/a&gt;&amp;nbsp;voor meer info.
Ik weet zelf helaas nog niet of ik erbij kan zijn, hoewel Ordina wel een stand heeft.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=6360b2c8-e014-49c5-9d6e-93036a78d29f" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,6360b2c8-e014-49c5-9d6e-93036a78d29f.aspx</comments>
      <category>Development</category>
      <category>Events</category>
      <category>Nederlands</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=f51e5ce4-5516-4363-b8fa-e26ba046913c</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,f51e5ce4-5516-4363-b8fa-e26ba046913c.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,f51e5ce4-5516-4363-b8fa-e26ba046913c.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=f51e5ce4-5516-4363-b8fa-e26ba046913c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Het Office platform is zo onderhand behoorlijk groot aan het worden en je weg vinden
wordt dan ook steeds lastiger. Met de <a href="http://msdn2.microsoft.com/en-us/office/bb497969.aspx">Microsoft
Office Interactive Developer Map</a> kun je de weg weer vinden. De Developer Map is
een WPF applicatie met een overzicht van alle technologieen de van toepassing zijn
op het Office platform. Door te klikken op een bepaalde technologie krijg je allerlei
detailinformatie en documentatie, of wordt je naar het betreffende MSDN Developer
Center gestuurd. De definitie van de "kaart" werkt zichzelf bij van de servers van
Microsoft als er zaken veranderen dankzij het gebruik van WPF/XAML. Cool!
</p>
        <p>
          <img alt="" hspace="0" src="http://msdn2.microsoft.com/en-us/office/bb497969.mapPicture_785(en-us,MSDN.10).jpg" align="baseline" border="0" />
        </p>
        <p>
 
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=f51e5ce4-5516-4363-b8fa-e26ba046913c" />
      </body>
      <title>De weg vinden in Office development? Gebruik de interactieve Developer Map!</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,f51e5ce4-5516-4363-b8fa-e26ba046913c.aspx</guid>
      <link>http://michiel.vanotegem.nl/2007/05/30/DeWegVindenInOfficeDevelopmentGebruikDeInteractieveDeveloperMap.aspx</link>
      <pubDate>Wed, 30 May 2007 19:46:18 GMT</pubDate>
      <description>&lt;p&gt;
Het Office platform is zo onderhand behoorlijk groot aan het worden en je weg vinden
wordt dan ook steeds lastiger. Met de &lt;a href="http://msdn2.microsoft.com/en-us/office/bb497969.aspx"&gt;Microsoft
Office Interactive Developer Map&lt;/a&gt; kun je de weg weer vinden. De Developer Map is
een WPF applicatie met een overzicht van alle technologieen de van toepassing zijn
op het Office platform. Door te klikken op een bepaalde technologie krijg je allerlei
detailinformatie en documentatie, of wordt je naar&amp;nbsp;het betreffende MSDN Developer
Center gestuurd. De definitie van de "kaart" werkt zichzelf bij van de servers van
Microsoft als er zaken veranderen dankzij het gebruik van WPF/XAML. Cool!
&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" hspace=0 src="http://msdn2.microsoft.com/en-us/office/bb497969.mapPicture_785(en-us,MSDN.10).jpg" align=baseline border=0&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=f51e5ce4-5516-4363-b8fa-e26ba046913c" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,f51e5ce4-5516-4363-b8fa-e26ba046913c.aspx</comments>
      <category>Development</category>
      <category>Nederlands</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=fa1ab105-e315-4747-9c3a-481995d2c842</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,fa1ab105-e315-4747-9c3a-481995d2c842.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,fa1ab105-e315-4747-9c3a-481995d2c842.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=fa1ab105-e315-4747-9c3a-481995d2c842</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Een goed overzicht met <a href="http://www.hanselman.com/blog/VMPerformanceChecklistBeforeYouComplainThatYourVirtualMachineIsSlow.aspx">tips</a> van
Scott Hanselman.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=fa1ab105-e315-4747-9c3a-481995d2c842" />
      </body>
      <title>VPC traag? Kijk eens naar deze tips</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,fa1ab105-e315-4747-9c3a-481995d2c842.aspx</guid>
      <link>http://michiel.vanotegem.nl/2007/05/30/VPCTraagKijkEensNaarDezeTips.aspx</link>
      <pubDate>Wed, 30 May 2007 11:12:06 GMT</pubDate>
      <description>&lt;p&gt;
Een goed overzicht met &lt;a href="http://www.hanselman.com/blog/VMPerformanceChecklistBeforeYouComplainThatYourVirtualMachineIsSlow.aspx"&gt;tips&lt;/a&gt; van
Scott Hanselman.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=fa1ab105-e315-4747-9c3a-481995d2c842" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,fa1ab105-e315-4747-9c3a-481995d2c842.aspx</comments>
      <category>Development</category>
      <category>Nederlands</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=45be6ae4-7212-4161-a6b0-3bbeade86821</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,45be6ae4-7212-4161-a6b0-3bbeade86821.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,45be6ae4-7212-4161-a6b0-3bbeade86821.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=45be6ae4-7212-4161-a6b0-3bbeade86821</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I've been working with ASP.NET 2.0 for a long time now and I thought I'd seen most
of it. Today I found something that must have flown under my radar all this time: the
Health Monitoring API. Functionally this API is similar to l<a href="http://logging.apache.org/log4net/">og4net</a> and
the <a href="http://www.codeplex.com/entlib">Enterprise Library</a> logging
Application Block. Although both of these work well I prefer functionality that comes "out-of-the-box",
because you don't have to do anything to get it, it works, and your pretty sure it'll
be kept up to date by the folks in the product team(s). So even if you're using
another logging mechanism, be sure to check out the Health Monitoring API. <a href="http://msdn2.microsoft.com/en-us/library/ms998306.aspx">How
To: Use Health Monitoring in ASP.NET 2.0</a> from the  Pattern &amp; Practices
group is a good starting piont.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=45be6ae4-7212-4161-a6b0-3bbeade86821" />
      </body>
      <title>Logging in ASP.NET? Use the Health Monitoring API</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,45be6ae4-7212-4161-a6b0-3bbeade86821.aspx</guid>
      <link>http://michiel.vanotegem.nl/2007/05/18/LoggingInASPNETUseTheHealthMonitoringAPI.aspx</link>
      <pubDate>Fri, 18 May 2007 10:49:37 GMT</pubDate>
      <description>&lt;p&gt;
I've been working with ASP.NET 2.0 for a long time now and I thought I'd seen most
of it. Today I found something that must&amp;nbsp;have flown under my radar all this time:&amp;nbsp;the
Health Monitoring API. Functionally this&amp;nbsp;API is&amp;nbsp;similar to&amp;nbsp;l&lt;a href="http://logging.apache.org/log4net/"&gt;og4net&lt;/a&gt;&amp;nbsp;and
the&amp;nbsp;&lt;a href="http://www.codeplex.com/entlib"&gt;Enterprise Library&lt;/a&gt;&amp;nbsp;logging
Application Block. Although both of these work well I prefer functionality that comes&amp;nbsp;"out-of-the-box",
because you don't have to do anything to get it, it works, and your pretty sure it'll
be kept up to date by the folks in the product team(s).&amp;nbsp;So even if you're using
another logging mechanism, be sure to check&amp;nbsp;out the Health Monitoring API.&amp;nbsp;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms998306.aspx"&gt;How
To: Use Health Monitoring in ASP.NET 2.0&lt;/a&gt; from the&amp;nbsp; Pattern &amp;amp; Practices
group is a good starting piont.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=45be6ae4-7212-4161-a6b0-3bbeade86821" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,45be6ae4-7212-4161-a6b0-3bbeade86821.aspx</comments>
      <category>ASP.NET</category>
      <category>Development</category>
      <category>English</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=52bc41f0-b331-42f5-8094-610c17d2dbdd</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,52bc41f0-b331-42f5-8094-610c17d2dbdd.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,52bc41f0-b331-42f5-8094-610c17d2dbdd.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=52bc41f0-b331-42f5-8094-610c17d2dbdd</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Ik werk al zo lang met ASP.NET 2.0 dat ik dacht alles wel een keer gezien te hebben,
maar nu blijkt er toch iets aan mijn aandacht ontsnapt te zijn: de Health Monitoring
API. Deze API is qua functionaliteit vergelijkbaar met l<a href="http://logging.apache.org/log4net/">og4net</a> en
het logging Application Block van <a href="http://www.codeplex.com/entlib">Enterprise
Library</a>. Hoewel dat beide goede logging biedt ben ik toch altijd wel een voorstander
van functionaliteit die "out-of-the-box" beschikbaar is, omdat je daarmee zekerder
bent van de levensduur en bugfixes. Ook als je een ander loggingmechanisme gebruikt
is het dus zeker de moeite waard om even naar de Health Monitoring API te kijken.
Een goed startpunt is <a href="http://msdn2.microsoft.com/en-us/library/ms998306.aspx">How
To: Use Health Monitoring in ASP.NET 2.0</a> van de Pattern &amp; Practices groep.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=52bc41f0-b331-42f5-8094-610c17d2dbdd" />
      </body>
      <title>Logging in ASP.NET? Gebruik de Health Monitoring API</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,52bc41f0-b331-42f5-8094-610c17d2dbdd.aspx</guid>
      <link>http://michiel.vanotegem.nl/2007/05/18/LoggingInASPNETGebruikDeHealthMonitoringAPI.aspx</link>
      <pubDate>Fri, 18 May 2007 10:43:39 GMT</pubDate>
      <description>&lt;p&gt;
Ik werk al zo lang met ASP.NET 2.0 dat ik dacht alles wel een keer gezien te hebben,
maar nu blijkt er toch iets aan mijn aandacht ontsnapt te zijn: de Health Monitoring
API. Deze API is qua functionaliteit vergelijkbaar met l&lt;a href="http://logging.apache.org/log4net/"&gt;og4net&lt;/a&gt; en
het logging Application Block van &lt;a href="http://www.codeplex.com/entlib"&gt;Enterprise
Library&lt;/a&gt;. Hoewel dat beide goede logging biedt ben ik toch altijd wel een voorstander
van functionaliteit die "out-of-the-box" beschikbaar is, omdat je daarmee zekerder
bent van de levensduur en bugfixes. Ook als je een ander loggingmechanisme gebruikt
is het dus zeker de moeite waard om even naar de Health Monitoring API te kijken.
Een goed startpunt is &lt;a href="http://msdn2.microsoft.com/en-us/library/ms998306.aspx"&gt;How
To: Use Health Monitoring in ASP.NET 2.0&lt;/a&gt; van de Pattern &amp;amp; Practices groep.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=52bc41f0-b331-42f5-8094-610c17d2dbdd" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,52bc41f0-b331-42f5-8094-610c17d2dbdd.aspx</comments>
      <category>ASP.NET</category>
      <category>Development</category>
      <category>Nederlands</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=643745ea-076e-444d-9143-ceb9e1524c4d</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,643745ea-076e-444d-9143-ceb9e1524c4d.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,643745ea-076e-444d-9143-ceb9e1524c4d.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=643745ea-076e-444d-9143-ceb9e1524c4d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Onlangs kreeg ik de volgende melding in Visual Studio 2005: <em>The project file '
' has been renamed or is no longer in the solution</em>. Hierdoor was het niet
meer mogelijk om ook maar iets van het project te bouwen. Het vervelende aan dit probleem
is dat je geen idee hebt wat er nu eigenlijk aan de hand is. Na enige tijd vond ik
uit dat dit gebeurt als een Web Project referenties bevat naar assemblies of projecten
die het niet kan vinden. Je lost dit als volgt op:
</p>
        <ol>
          <li>
Rechts-klik op het Web project en kies Property Pages. 
</li>
          <li>
Er verschijnt een venster met alle referenties, zowel naar de bin-map, GAC of andere
projecten in de solution. 
</li>
          <li>
Verwijderer de referenties gemarkeerd met <em>(unavailable)</em>. 
</li>
          <li>
Waarschijnlijk kun je nu niet bouwen omdat je assemblies mist. Als je de referenties
daar naartoe maakt zou alles moeten werken.</li>
        </ol>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=643745ea-076e-444d-9143-ceb9e1524c4d" />
      </body>
      <title>VS2005 probleem "The project file ' ' has been renamed or is no longer in the solution" oplossen</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,643745ea-076e-444d-9143-ceb9e1524c4d.aspx</guid>
      <link>http://michiel.vanotegem.nl/2007/01/31/VS2005ProbleemTheProjectFileHasBeenRenamedOrIsNoLongerInTheSolutionOplossen.aspx</link>
      <pubDate>Wed, 31 Jan 2007 15:42:56 GMT</pubDate>
      <description>&lt;p&gt;
Onlangs kreeg ik de volgende melding in Visual Studio 2005: &lt;em&gt;The project file '
' has been renamed or is no longer in the solution&lt;/em&gt;.&amp;nbsp;Hierdoor was het niet
meer mogelijk om ook maar iets van het project te bouwen. Het vervelende aan dit probleem
is dat je geen idee hebt wat er nu eigenlijk aan de hand is. Na enige tijd vond ik
uit dat dit gebeurt als een Web Project referenties bevat naar assemblies of projecten
die het niet kan vinden. Je lost dit als volgt op:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Rechts-klik op het Web project en kies Property Pages. 
&lt;li&gt;
Er verschijnt een venster met alle referenties, zowel naar de bin-map, GAC of andere
projecten in de solution. 
&lt;li&gt;
Verwijderer de referenties gemarkeerd met &lt;em&gt;(unavailable)&lt;/em&gt;. 
&lt;li&gt;
Waarschijnlijk kun je nu niet bouwen omdat je assemblies mist. Als je de referenties
daar naartoe maakt zou alles moeten werken.&lt;/li&gt;
&lt;/ol&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=643745ea-076e-444d-9143-ceb9e1524c4d" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,643745ea-076e-444d-9143-ceb9e1524c4d.aspx</comments>
      <category>ASP.NET</category>
      <category>Development</category>
      <category>Nederlands</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=5edafacd-a2a9-4666-92b9-48c39ab939fa</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,5edafacd-a2a9-4666-92b9-48c39ab939fa.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,5edafacd-a2a9-4666-92b9-48c39ab939fa.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=5edafacd-a2a9-4666-92b9-48c39ab939fa</wfw:commentRss>
      <slash:comments>9</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We were recently faced with the error message <em>The project file ' ' has been renamed
or is no longer in the solution</em> in Visual Studio 2005. The problem
is that from this message you have no idea what is actually the matter. We finally
figured out that this happens when a Web Project contains references to assemblies
or projects it can't find. Here's how you solve this:
</p>
        <ol>
          <li>
Right click the Web project and select Property Pages. 
</li>
          <li>
A window will open which lists all the references, either to the bin-folder, GAC or
other projects in the solution.</li>
          <li>
Remove those that show <em>(unavailable)</em> behind it.</li>
          <li>
Chances are that now you can't build because the reference is not there. Simply add
the reference again and you should be OK.</li>
        </ol>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=5edafacd-a2a9-4666-92b9-48c39ab939fa" />
      </body>
      <title>Solving "The project file ' ' has been renamed or is no longer in the solution"</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,5edafacd-a2a9-4666-92b9-48c39ab939fa.aspx</guid>
      <link>http://michiel.vanotegem.nl/2007/01/31/SolvingTheProjectFileHasBeenRenamedOrIsNoLongerInTheSolution.aspx</link>
      <pubDate>Wed, 31 Jan 2007 15:36:21 GMT</pubDate>
      <description>&lt;p&gt;
We were recently faced with the error message &lt;em&gt;The project file ' ' has been renamed
or is no longer in the solution&lt;/em&gt;&amp;nbsp;in Visual Studio 2005.&amp;nbsp;The problem
is that from this message you have no idea what is actually the matter. We finally
figured out that this happens when a Web Project contains references to assemblies
or projects it can't find. Here's how you solve this:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Right click the Web project and select Property Pages. 
&lt;/li&gt;
&lt;li&gt;
A window will open which lists all the references, either to the bin-folder, GAC or
other projects in the solution.&lt;/li&gt;
&lt;li&gt;
Remove those that&amp;nbsp;show &lt;em&gt;(unavailable)&lt;/em&gt; behind it.&lt;/li&gt;
&lt;li&gt;
Chances are that now you can't build because the reference is not there. Simply add
the reference again and you should be OK.&lt;/li&gt;
&lt;/ol&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=5edafacd-a2a9-4666-92b9-48c39ab939fa" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,5edafacd-a2a9-4666-92b9-48c39ab939fa.aspx</comments>
      <category>ASP.NET</category>
      <category>Development</category>
      <category>English</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=6a651dc1-f7e0-41a0-895f-d982a8476464</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,6a651dc1-f7e0-41a0-895f-d982a8476464.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,6a651dc1-f7e0-41a0-895f-d982a8476464.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=6a651dc1-f7e0-41a0-895f-d982a8476464</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
XQuery 1.0 en XSLT 2.0 hebben heel lang op zich laten wachten. Al drie jaar geleden
wilde ik een boek schrijven over XQuery en toen was volgens W3C de specificatie bijna
klaar. Dat "bijna" was dus een ruim begrip... maar goed, ze hebben nu eindelijk <a href="http://www.w3.org/2007/01/qt-pressrelease">W3C
Recommendation status verworven</a>. Moet ik de voorgestelde inhoudsopgave voor <a href="http://www.vanotegem.nl/PermaLink,guid,eff27daa-cd03-4d81-b969-88198032170f.aspx">m'n
te schrijven XML boek</a> helaas wel aanpassen :(.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=6a651dc1-f7e0-41a0-895f-d982a8476464" />
      </body>
      <title>Na heeeeel lang wachten zijn XQuery 1.0 en XSLT 2.0 eindelijk klaar</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,6a651dc1-f7e0-41a0-895f-d982a8476464.aspx</guid>
      <link>http://michiel.vanotegem.nl/2007/01/31/NaHeeeeelLangWachtenZijnXQuery10EnXSLT20EindelijkKlaar.aspx</link>
      <pubDate>Wed, 31 Jan 2007 14:57:44 GMT</pubDate>
      <description>&lt;p&gt;
XQuery 1.0 en XSLT 2.0 hebben heel lang op zich laten wachten. Al drie jaar geleden
wilde ik een boek schrijven over XQuery en toen was volgens W3C de specificatie bijna
klaar. Dat "bijna" was dus een ruim begrip... maar goed, ze hebben nu eindelijk &lt;a href="http://www.w3.org/2007/01/qt-pressrelease"&gt;W3C
Recommendation status verworven&lt;/a&gt;. Moet ik de voorgestelde&amp;nbsp;inhoudsopgave voor &lt;a href="http://www.vanotegem.nl/PermaLink,guid,eff27daa-cd03-4d81-b969-88198032170f.aspx"&gt;m'n
te schrijven XML boek&lt;/a&gt; helaas wel aanpassen :(.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=6a651dc1-f7e0-41a0-895f-d982a8476464" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,6a651dc1-f7e0-41a0-895f-d982a8476464.aspx</comments>
      <category>Development</category>
      <category>Nederlands</category>
      <category>XML</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=2c871406-3d5d-4ba2-ae03-f2e115a7601d</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,2c871406-3d5d-4ba2-ae03-f2e115a7601d.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,2c871406-3d5d-4ba2-ae03-f2e115a7601d.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=2c871406-3d5d-4ba2-ae03-f2e115a7601d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Via het <a href="http://blog.smart-ms.ordina.nl/">blog van m'n collega's bij Ordina
Development Center Microsoft</a> kwam ik deze aardige <a href="http://www.gotdotnet.com/codegallery/codegallery.aspx?id=9de82f8b-f006-4c6f-819d-15b1ad1d461a">IE
add-in (IEeee)</a> tegen. Geweldig voor testers omdat ze vanuit IE de bug kunnen rapporteren.
Daarbij worden de volgende gegevens toegevoegd aan het item in Team System:
</p>
        <ul>
          <li>
Screenshot</li>
          <li>
HTML Van de pagina en alle frames/iframes</li>
          <li>
Stylesheets en scripts die door de pagina gebruikt worden</li>
          <li>
Details over de machine en de browser van de gebruiker</li>
        </ul>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=2c871406-3d5d-4ba2-ae03-f2e115a7601d" />
      </body>
      <title>Bug in VS Team System rapporteren vanuit IE</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,2c871406-3d5d-4ba2-ae03-f2e115a7601d.aspx</guid>
      <link>http://michiel.vanotegem.nl/2007/01/04/BugInVSTeamSystemRapporterenVanuitIE.aspx</link>
      <pubDate>Thu, 04 Jan 2007 08:39:39 GMT</pubDate>
      <description>&lt;p&gt;
Via het &lt;a href="http://blog.smart-ms.ordina.nl/"&gt;blog van m'n collega's bij Ordina
Development Center Microsoft&lt;/a&gt; kwam ik deze aardige &lt;a href="http://www.gotdotnet.com/codegallery/codegallery.aspx?id=9de82f8b-f006-4c6f-819d-15b1ad1d461a"&gt;IE
add-in (IEeee)&lt;/a&gt; tegen. Geweldig voor testers omdat ze vanuit IE de bug kunnen rapporteren.
Daarbij worden de volgende gegevens toegevoegd aan het item in Team System:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Screenshot&lt;/li&gt;
&lt;li&gt;
HTML Van de pagina en alle frames/iframes&lt;/li&gt;
&lt;li&gt;
Stylesheets en scripts die door de pagina gebruikt worden&lt;/li&gt;
&lt;li&gt;
Details over de machine en de browser van de gebruiker&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=2c871406-3d5d-4ba2-ae03-f2e115a7601d" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,2c871406-3d5d-4ba2-ae03-f2e115a7601d.aspx</comments>
      <category>Development</category>
      <category>Nederlands</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=897c85bc-63ea-43e0-9cdf-de1c79fbf3b0</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,897c85bc-63ea-43e0-9cdf-de1c79fbf3b0.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,897c85bc-63ea-43e0-9cdf-de1c79fbf3b0.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=897c85bc-63ea-43e0-9cdf-de1c79fbf3b0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Visual Studio 2005 SP1 is beschikbaar.
Het lost allerlei bugs op en biedt een aantal verbeteringen, waaronder<br /><span style="color: rgb(0, 0, 0);"><ul><li>
Nieuwe project types voor ASP.NET<br /></li><li>
Ondersteuning voor nieuwe processor types voor code generatie en profiling</li><li>
Integratie van Excel 2007 en Project 2007 met Team Foundation Server</li><li>
Ondersteuning voor Windows Embedded 6.0 platform en tools</li></ul>
Meer informatie is te vinden op de MSDN pagina <a href="http://msdn.microsoft.com/vstudio/support/vs2005sp1/default.aspx">Visual
Studio 2005 Service Pack 1 (SP1)</a>.</span><img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=897c85bc-63ea-43e0-9cdf-de1c79fbf3b0" /></body>
      <title>Visual Studio 2005 SP1 beschikbaar</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,897c85bc-63ea-43e0-9cdf-de1c79fbf3b0.aspx</guid>
      <link>http://michiel.vanotegem.nl/2006/12/18/VisualStudio2005SP1Beschikbaar.aspx</link>
      <pubDate>Mon, 18 Dec 2006 12:05:13 GMT</pubDate>
      <description>Visual Studio 2005 SP1 is beschikbaar. Het lost allerlei bugs op en biedt een aantal verbeteringen, waaronder&lt;br&gt;
&lt;span style="color: rgb(0, 0, 0);"&gt;
&lt;ul&gt;
&lt;li&gt;
Nieuwe project types voor ASP.NET&lt;br&gt;
&lt;/li&gt;
&lt;li&gt;
Ondersteuning voor nieuwe processor types voor code generatie en profiling&lt;/li&gt;
&lt;li&gt;
Integratie van Excel 2007 en Project 2007 met Team Foundation Server&lt;/li&gt;
&lt;li&gt;
Ondersteuning voor Windows Embedded 6.0 platform en tools&lt;/li&gt;
&lt;/ul&gt;
Meer informatie is te vinden op de MSDN pagina &lt;a href="http://msdn.microsoft.com/vstudio/support/vs2005sp1/default.aspx"&gt;Visual
Studio 2005 Service Pack 1 (SP1)&lt;/a&gt;.&lt;/span&gt;&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=897c85bc-63ea-43e0-9cdf-de1c79fbf3b0" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,897c85bc-63ea-43e0-9cdf-de1c79fbf3b0.aspx</comments>
      <category>.NET</category>
      <category>ASP.NET</category>
      <category>Development</category>
      <category>Nederlands</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=007a2b73-236d-4381-ba7b-91707903a8b4</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,007a2b73-236d-4381-ba7b-91707903a8b4.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,007a2b73-236d-4381-ba7b-91707903a8b4.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=007a2b73-236d-4381-ba7b-91707903a8b4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Microsoft heeft een security patch uitgebracht voor Visual Studio. Het "gat" in VS2005
wordt als kritiek beschouwd, dus is het heeeel verstandig de patch te installeren.
Zie voor meer informatie en download Microsoft <a href="http://www.microsoft.com/technet/security/Bulletin/MS06-073.mspx">Security
Bulletin MS06-073</a>.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=007a2b73-236d-4381-ba7b-91707903a8b4" />
      </body>
      <title>Critical Security Patch voor Visual Studio 2005</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,007a2b73-236d-4381-ba7b-91707903a8b4.aspx</guid>
      <link>http://michiel.vanotegem.nl/2006/12/13/CriticalSecurityPatchVoorVisualStudio2005.aspx</link>
      <pubDate>Wed, 13 Dec 2006 12:05:09 GMT</pubDate>
      <description>&lt;p&gt;
Microsoft heeft een security patch uitgebracht voor Visual Studio. Het "gat" in VS2005
wordt als kritiek beschouwd, dus is het heeeel verstandig de patch te installeren.
Zie voor meer informatie en download Microsoft &lt;a href="http://www.microsoft.com/technet/security/Bulletin/MS06-073.mspx"&gt;Security
Bulletin MS06-073&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=007a2b73-236d-4381-ba7b-91707903a8b4" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,007a2b73-236d-4381-ba7b-91707903a8b4.aspx</comments>
      <category>.NET</category>
      <category>ASP.NET</category>
      <category>Development</category>
      <category>Nederlands</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=74dd0d42-3f3f-48b0-894b-3f276402501d</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,74dd0d42-3f3f-48b0-894b-3f276402501d.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,74dd0d42-3f3f-48b0-894b-3f276402501d.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=74dd0d42-3f3f-48b0-894b-3f276402501d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Alex Thissen meldt op <a href="http://www.alexthissen.nl/weblog/DetailsView.aspx?PostingID=c0236bc1-3b8b-4900-b933-74be436fc83a">deze
blogpost </a>dat het probeert om zoveel mogelijk te programmeren met alleen z'n
keyboard, omdat keyboard+muis vertragend werkt. De assumptie daarbij is uiteraard
</p>
        <p>
1) Je kan alle shortcuts onthouden.<br />
2) Je hebt de shortcuts vaak genoeg nodig om ze te onthouden.
</p>
        <p>
In beide gevallen moet ik helaas zeggen "lukt me niet". Vandaag de dag spendeer
ik minder uren aan programmeren en meer aan zaken die om het ontwikkelproces
heen liggen. Voor hardcode programmeurs is dit wel handig lijkt me, hoewel ik wel
een beetje flashbacks heb naar discussies over waarom VI beter is dan Emacs (of andersom).
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=74dd0d42-3f3f-48b0-894b-3f276402501d" />
      </body>
      <title>"Keyboard only" programmeren? Niets voor mij</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,74dd0d42-3f3f-48b0-894b-3f276402501d.aspx</guid>
      <link>http://michiel.vanotegem.nl/2006/12/11/KeyboardOnlyProgrammerenNietsVoorMij.aspx</link>
      <pubDate>Mon, 11 Dec 2006 14:06:39 GMT</pubDate>
      <description>&lt;p&gt;
Alex Thissen meldt op&amp;nbsp;&lt;a href="http://www.alexthissen.nl/weblog/DetailsView.aspx?PostingID=c0236bc1-3b8b-4900-b933-74be436fc83a"&gt;deze
blogpost&amp;nbsp;&lt;/a&gt;dat het probeert om zoveel mogelijk te programmeren met alleen z'n
keyboard, omdat&amp;nbsp;keyboard+muis vertragend werkt. De assumptie daarbij is uiteraard
&lt;/p&gt;
&lt;p&gt;
1) Je kan alle shortcuts onthouden.&lt;br&gt;
2) Je hebt de shortcuts vaak genoeg nodig om ze te onthouden.
&lt;/p&gt;
&lt;p&gt;
In beide gevallen moet ik helaas zeggen "lukt me niet". Vandaag de dag&amp;nbsp;spendeer
ik&amp;nbsp;minder uren aan programmeren en meer aan&amp;nbsp;zaken die om het ontwikkelproces
heen liggen. Voor hardcode programmeurs is dit wel handig lijkt me, hoewel ik wel
een beetje flashbacks heb naar discussies over waarom VI beter is dan Emacs (of andersom).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=74dd0d42-3f3f-48b0-894b-3f276402501d" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,74dd0d42-3f3f-48b0-894b-3f276402501d.aspx</comments>
      <category>Development</category>
      <category>Nederlands</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=c26cecba-c5e9-4d60-aa11-fb78b4f1a733</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,c26cecba-c5e9-4d60-aa11-fb78b4f1a733.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,c26cecba-c5e9-4d60-aa11-fb78b4f1a733.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=c26cecba-c5e9-4d60-aa11-fb78b4f1a733</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Nu Internet Explorer 7 uitgerold wordt op de meeste computers ontstaat de situatie
dat sites zowel met IE6 als IE7 goed moeten werken. Dit testen vanaf 1 machine is
lastig omdat IE7 over IE6 heen gezet wordt. Maar geen nood, je kunt altijd nog gebruik
maken van Virtual PC om in een virtuele machine met IE6 te testen (of IE7 natuurlijk
als IE6 op je eigen machine staat). Microsoft biedt hiervoor een kant-en-klare
Virtual PC. Meer informatie en de nodige download links vind je op het <a href="IE6 and IE7 Running on a Single Machine">IEBlog</a>.
Bij The Vision Web werken we al tijden met Virtual PC voor het ontwikkelen en testen
van applicaties, dus waren we zelf ook al op deze oplossing gekomen. Het is echter
wel erg handig dat Microsoft een standaard Virtual PC aanbiedit hiervoor.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=c26cecba-c5e9-4d60-aa11-fb78b4f1a733" />
      </body>
      <title>Testen met IE6 en IE7</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,c26cecba-c5e9-4d60-aa11-fb78b4f1a733.aspx</guid>
      <link>http://michiel.vanotegem.nl/2006/12/11/TestenMetIE6EnIE7.aspx</link>
      <pubDate>Mon, 11 Dec 2006 13:43:29 GMT</pubDate>
      <description>&lt;p&gt;
Nu Internet Explorer 7 uitgerold wordt op de meeste computers ontstaat de situatie
dat sites zowel met IE6 als IE7 goed moeten werken. Dit testen vanaf 1 machine is
lastig omdat IE7 over IE6 heen gezet wordt. Maar geen nood, je kunt altijd nog gebruik
maken van Virtual PC om in een virtuele machine met IE6 te testen (of IE7 natuurlijk
als IE6 op je eigen machine staat). Microsoft&amp;nbsp;biedt hiervoor een kant-en-klare
Virtual PC. Meer informatie en de nodige download links vind je op het &lt;a href="IE6 and IE7 Running on a Single Machine"&gt;IEBlog&lt;/a&gt;.
Bij The Vision Web werken we al tijden met Virtual PC voor het ontwikkelen en testen
van applicaties, dus waren we zelf ook al op deze oplossing gekomen. Het is echter
wel erg handig dat Microsoft een standaard Virtual PC aanbiedit hiervoor.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=c26cecba-c5e9-4d60-aa11-fb78b4f1a733" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,c26cecba-c5e9-4d60-aa11-fb78b4f1a733.aspx</comments>
      <category>ASP.NET</category>
      <category>Development</category>
      <category>Nederlands</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=99864f5d-8c6f-4bbe-b51b-b18c5c12a325</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,99864f5d-8c6f-4bbe-b51b-b18c5c12a325.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,99864f5d-8c6f-4bbe-b51b-b18c5c12a325.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=99864f5d-8c6f-4bbe-b51b-b18c5c12a325</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Serieus over beveiliging? Dan is de Threat Analysis &amp; Modeling tool een goede
toevoeging aan je arsenaal. Met deze tool kun je in kaart brengen welke (mogelijke)
beveiligingsproblemen je applicatie heeft. Versie 2.1 verbetert een aantal zaken,
waaronder export naar Work Items voor Visual Studio team System en voegt zaken als
Auto Save toe. <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=59888078-9daf-4e96-b7d1-944703479451&amp;displaylang=en">Download
Threat Analysis &amp; Modeling v2.1</a></p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=99864f5d-8c6f-4bbe-b51b-b18c5c12a325" />
      </body>
      <title>Threat Analysis &amp; Modeling v2.1 beschikbaar</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,99864f5d-8c6f-4bbe-b51b-b18c5c12a325.aspx</guid>
      <link>http://michiel.vanotegem.nl/2006/12/11/ThreatAnalysisModelingV21Beschikbaar.aspx</link>
      <pubDate>Mon, 11 Dec 2006 13:27:45 GMT</pubDate>
      <description>&lt;p&gt;
Serieus over beveiliging? Dan is de Threat Analysis &amp;amp; Modeling tool een goede
toevoeging aan je arsenaal. Met deze tool kun je in kaart brengen welke (mogelijke)
beveiligingsproblemen je applicatie heeft. Versie 2.1 verbetert een aantal zaken,
waaronder export naar Work Items voor Visual Studio team System en voegt zaken als
Auto Save toe. &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=59888078-9daf-4e96-b7d1-944703479451&amp;amp;displaylang=en"&gt;Download
Threat Analysis &amp;amp; Modeling v2.1&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=99864f5d-8c6f-4bbe-b51b-b18c5c12a325" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,99864f5d-8c6f-4bbe-b51b-b18c5c12a325.aspx</comments>
      <category>Development</category>
      <category>Nederlands</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=91f742b9-0ed3-4a08-a2ff-3faafeaffb42</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,91f742b9-0ed3-4a08-a2ff-3faafeaffb42.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,91f742b9-0ed3-4a08-a2ff-3faafeaffb42.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=91f742b9-0ed3-4a08-a2ff-3faafeaffb42</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Het jaarlijkse TechEd "feest" is weer begonnen. Gisteren al met een etentje met de
MVP's waar ik weer eens heb kunnen praten met m'n mede-MVP's, waaronder Andre Obelink
en Sander Gerz die boeken over VB en C# hebben geschreven in dezelfde serie waarvoor
ik net een boek geschreven heb (De Basis). Leuk om ervaringen uit te wisselen.
</p>
        <p>
Vanmorgen de keynote van Eric Rudder, die vooraf gegaan werd door Simon Brown. Simon
had een leuk intermezzo met Arfa Karim, de jongste Microsoft Certified Professional
(11 jaar, uit Pakistan). Arfa liet een zelf geprogrammeerde calculator zien en de
code zag er netjes uit. De demo's tijdens Eric Rudder's keynote waren ook leuk om
te zien. Als je de afgelopen twee jaar met je kop in het zand hebt gezet waren ze
zelfs indrukwekkend.
</p>
        <p>
Later meer over de sessies...
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=91f742b9-0ed3-4a08-a2ff-3faafeaffb42" />
      </body>
      <title>TechEd Developers 2006</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,91f742b9-0ed3-4a08-a2ff-3faafeaffb42.aspx</guid>
      <link>http://michiel.vanotegem.nl/2006/11/07/TechEdDevelopers2006.aspx</link>
      <pubDate>Tue, 07 Nov 2006 10:51:55 GMT</pubDate>
      <description>&lt;p&gt;
Het jaarlijkse TechEd "feest" is weer begonnen. Gisteren al met een etentje met de
MVP's waar ik weer eens heb kunnen praten met m'n mede-MVP's, waaronder Andre Obelink
en Sander Gerz die boeken over VB en C# hebben geschreven in dezelfde serie waarvoor
ik net een boek geschreven heb (De Basis). Leuk om ervaringen uit te wisselen.
&lt;/p&gt;
&lt;p&gt;
Vanmorgen de keynote van Eric Rudder, die vooraf gegaan werd door Simon Brown. Simon
had een leuk intermezzo met Arfa Karim, de jongste Microsoft Certified Professional
(11 jaar, uit Pakistan). Arfa liet een zelf geprogrammeerde calculator zien en de
code zag er netjes uit. De demo's tijdens Eric Rudder's keynote waren ook leuk om
te zien. Als je de afgelopen twee jaar met je kop in het zand hebt gezet waren ze
zelfs indrukwekkend.
&lt;/p&gt;
&lt;p&gt;
Later meer over de sessies...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=91f742b9-0ed3-4a08-a2ff-3faafeaffb42" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,91f742b9-0ed3-4a08-a2ff-3faafeaffb42.aspx</comments>
      <category>Development</category>
      <category>Evenementen</category>
      <category>Nederlands</category>
      <category>Review</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=fb83e26c-5d9f-4c18-b3b6-ee60535ac8c5</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,fb83e26c-5d9f-4c18-b3b6-ee60535ac8c5.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,fb83e26c-5d9f-4c18-b3b6-ee60535ac8c5.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=fb83e26c-5d9f-4c18-b3b6-ee60535ac8c5</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Het gebeurt me nog wel eens dat ik een SQL Server database aangeleverd krijg en dan
wil ik graag een diagram hebben van de tabellen en relaties. Zo'n diagram kun je
maken door er een toe te voegen in de Database Diagram map die te zien is in SQL Enterprise
Manager (2000) of SQL Management Studio (2005). Vaak krijg je dan de melding hieronder:
</p>
        <p>
          <img src="http://www.vanotegem.nl/data/content/binary/NoValidDbOwner.gif" border="0" />
        </p>
        <p>
Helaas kun je de Database Properties in dat geval niet opvragen (in elk geval niet
in SQL Management Studio), dus kun je het niet aanpassen. Door de volgende query uit
te voeren is het euvel ook opgelost
</p>
        <p>
          <font face="Courier New">ALTER AUTHORIZATION ON Database::[<em>Database Name</em>]
TO [sa]</font>
        </p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=fb83e26c-5d9f-4c18-b3b6-ee60535ac8c5" />
      </body>
      <title>Geen database diagram kunnen maken in SQL Server</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,fb83e26c-5d9f-4c18-b3b6-ee60535ac8c5.aspx</guid>
      <link>http://michiel.vanotegem.nl/2006/09/18/GeenDatabaseDiagramKunnenMakenInSQLServer.aspx</link>
      <pubDate>Mon, 18 Sep 2006 10:11:25 GMT</pubDate>
      <description>&lt;p&gt;
Het gebeurt me nog wel eens dat ik een SQL Server database aangeleverd krijg en dan
wil ik graag een diagram hebben van de tabellen en relaties. Zo'n diagram kun&amp;nbsp;je
maken door er een toe te voegen in de Database Diagram map die te zien is in SQL Enterprise
Manager (2000) of SQL Management Studio (2005). Vaak krijg je dan de melding hieronder:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.vanotegem.nl/data/content/binary/NoValidDbOwner.gif" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Helaas kun je de Database Properties in dat geval niet opvragen (in elk geval niet
in SQL Management Studio), dus kun je het niet aanpassen. Door de volgende query uit
te voeren is het euvel ook opgelost
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;ALTER AUTHORIZATION ON Database::[&lt;em&gt;Database Name&lt;/em&gt;]
TO [sa]&lt;/font&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=fb83e26c-5d9f-4c18-b3b6-ee60535ac8c5" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,fb83e26c-5d9f-4c18-b3b6-ee60535ac8c5.aspx</comments>
      <category>Development</category>
      <category>Nederlands</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=36fde194-e731-45e1-945a-445f4c3004c2</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,36fde194-e731-45e1-945a-445f4c3004c2.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,36fde194-e731-45e1-945a-445f4c3004c2.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=36fde194-e731-45e1-945a-445f4c3004c2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Kan met de Augustus CTP van <a href="http://msdn.microsoft.com/robotics/">Microsoft
Robotics Studio</a>. Zo te zien zijn er ook al heel wat (verkrijgbare) robots die
hiermee aan te sturen zijn... leuk speelgoed.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=36fde194-e731-45e1-945a-445f4c3004c2" />
      </body>
      <title>Robots programmeren met .NET</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,36fde194-e731-45e1-945a-445f4c3004c2.aspx</guid>
      <link>http://michiel.vanotegem.nl/2006/08/24/RobotsProgrammerenMetNET.aspx</link>
      <pubDate>Thu, 24 Aug 2006 10:54:48 GMT</pubDate>
      <description>&lt;p&gt;
Kan met de Augustus CTP van &lt;a href="http://msdn.microsoft.com/robotics/"&gt;Microsoft
Robotics Studio&lt;/a&gt;. Zo te zien zijn er ook al heel wat (verkrijgbare) robots die
hiermee aan te sturen zijn... leuk speelgoed.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=36fde194-e731-45e1-945a-445f4c3004c2" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,36fde194-e731-45e1-945a-445f4c3004c2.aspx</comments>
      <category>.NET</category>
      <category>Development</category>
      <category>Nederlands</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=64d69720-5a11-4187-8c96-559e1766fadb</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,64d69720-5a11-4187-8c96-559e1766fadb.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,64d69720-5a11-4187-8c96-559e1766fadb.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=64d69720-5a11-4187-8c96-559e1766fadb</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
One of the great things about a DataSet, from a code generation perspective that is,
is that it is defined in an XML Schema with some added features for TableAdapters
and such. I wrote a very simple code generator that takes a DataSet definition and
an XSLT stylesheet and generates a code file. I also made it possible to
call an XSLT stylesheet for each table in the DataSet so I could create Data
Transfer Objects and such from the table definition. I had some trouble to get it
going though because of a namespace issue. The namespace that you expect to be the
default namespace isn't in actual fact as I'll explain with the following fragment:
</p>
        <pre>&lt;xs:schema id="TrackingTracingDataSet"
           targetNamespace="http://tempuri.org/MyDataSet.xsd"
           xmlns:mstns="http://tempuri.org/My.xsd"
           xmlns="http://tempuri.org/MyDataSet.xsd"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
           xmlns:msprop="urn:schemas-microsoft-com:xml-msprop"
           attributeFormDefault="qualified" elementFormDefault="qualified"&gt;
  &lt;xs:annotation&gt;
    &lt;xs:appinfo source="urn:schemas-microsoft-com:xml-msdatasource"&gt;
</pre>
        <p>
From the above fragment you would think that the default namespace is <strong>http://tempuri.org/MyDataSet.xsd</strong>,
because the default namespace is declare with the statement <strong>xmlns="http://tempuri.org/MyDataSet.xsd</strong>.
The actual default namespace is however defined in the source attribute of xs:appinfo
element, so the default namespace is <strong>urn:schemas-microsoft-com:xml-msdatasource</strong>. 
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=64d69720-5a11-4187-8c96-559e1766fadb" />
      </body>
      <title>Generating code with XSLT from a DataSet</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,64d69720-5a11-4187-8c96-559e1766fadb.aspx</guid>
      <link>http://michiel.vanotegem.nl/2006/07/26/GeneratingCodeWithXSLTFromADataSet.aspx</link>
      <pubDate>Wed, 26 Jul 2006 08:39:13 GMT</pubDate>
      <description>&lt;p&gt;
One of the great things about a DataSet, from a code generation perspective that is,
is that it is defined in an XML Schema with some added features for TableAdapters
and such. I wrote a very simple code generator that takes a DataSet definition and
an&amp;nbsp;XSLT&amp;nbsp;stylesheet and generates a code file. I also made it possible to
call an XSLT&amp;nbsp;stylesheet for each table in the DataSet so I could create Data
Transfer Objects and such from the table definition. I had some trouble to get it
going though because of a namespace issue. The namespace that you expect to be the
default namespace isn't in actual fact as I'll explain with the following fragment:
&lt;/p&gt;
&lt;pre&gt;&amp;lt;xs:schema id="TrackingTracingDataSet"
           targetNamespace="http://tempuri.org/MyDataSet.xsd"
           xmlns:mstns="http://tempuri.org/My.xsd"
           xmlns="http://tempuri.org/MyDataSet.xsd"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
           xmlns:msprop="urn:schemas-microsoft-com:xml-msprop"
           attributeFormDefault="qualified" elementFormDefault="qualified"&amp;gt;
  &amp;lt;xs:annotation&amp;gt;
    &amp;lt;xs:appinfo source="urn:schemas-microsoft-com:xml-msdatasource"&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
From the above fragment you would think that the default namespace is &lt;strong&gt;http://tempuri.org/MyDataSet.xsd&lt;/strong&gt;,
because the default namespace is declare with the statement &lt;strong&gt;xmlns="http://tempuri.org/MyDataSet.xsd&lt;/strong&gt;.
The actual default namespace is however defined in the source attribute of xs:appinfo
element, so the default namespace is &lt;strong&gt;urn:schemas-microsoft-com:xml-msdatasource&lt;/strong&gt;. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=64d69720-5a11-4187-8c96-559e1766fadb" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,64d69720-5a11-4187-8c96-559e1766fadb.aspx</comments>
      <category>Development</category>
      <category>English</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=36633846-2eca-40fe-9957-2859d8a244dc</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,36633846-2eca-40fe-9957-2859d8a244dc.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,36633846-2eca-40fe-9957-2859d8a244dc.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=36633846-2eca-40fe-9957-2859d8a244dc</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>Updated August 13, 2006 to reflect Sander's comment.</em>
        </p>
        <p>
On my old blog (in Dutch) I commented that I thought the WindowsImpersonationContext
was clumsy and I wrote a replacement that you can use as follows:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">Console.WriteLine(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Current
user: "</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> WindowsIdentity.GetCurrent().Name);<br />
WrapperImpersonationContext context <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> WrapperImpersonationContext(domain,
username, password);<br />
context.Enter();<br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//
Execute code under other uses context</span><br />
Console.WriteLine(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Current
user: "</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> WindowsIdentity.GetCurrent().Name);<br />
context.Leave();<br />
Console.WriteLine(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Current
user: "</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> WindowsIdentity.GetCurrent().Name);</span>
        </p>
        <p>
Recently a visitor noted that the code wasn't quite right (missng a view using statements,
and I found some other small issues. The correct code (including namespace references)
is below. It takes care of all that nasty calls into the Win32 API. The one thing
you need to be aware of is that it requires permissions to call into a DLL (i.e. run
unsafe code), which is why I added the attributes that indicate this. Unfortunately
that renders this class useless in a hosted environment, unless you strong sign the
assembly and pursuade the host to allow your assembly to run in Full or High
trust. This however is a problem you will run into regardless your use of this class.
As soon as you call LogonUser you need at least High trust. If this is something that
should be possible under lower trust by default it's up to the folks in Redmond to
add this functionality to .NET and handle it as such.
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Runtime.InteropServices;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Security.Principal;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Security.Permissions;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.ComponentModel;<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> WrapperImpersonationContext<br />
{<br />
   [DllImport(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"advapi32.dll"</span>,
SetLastError <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">true</span>)]<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">  
public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">static</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">extern</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bool</span> LogonUser(String
lpszUsername, String lpszDomain,<br />
   String lpszPassword, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span> dwLogonType, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span> dwLogonProvider, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">ref</span> IntPtr
phToken);<br /><br />
   [DllImport(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"kernel32.dll"</span>,
CharSet <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> CharSet.Auto)]<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">  
public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">extern</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">static</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bool</span> CloseHandle(IntPtr
handle);<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">  
private</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">const</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span> LOGON32_PROVIDER_DEFAULT <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> 0;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">  
private</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">const</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span> LOGON32_LOGON_INTERACTIVE <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> 2;<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">  
private</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> m_Domain;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">  
private</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> m_Password;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">  
private</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> m_Username;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">  
private</span> IntPtr m_Token;<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">  
private</span> WindowsImpersonationContext m_Context <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>;</span>
        </p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">  
protected</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bool</span> IsInContext<br />
   {<br />
      get { <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> m_Context
!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>;
}<br />
   }<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">  
public</span> WrapperImpersonationContext(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> domain, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> username, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> password)<br />
   {<br />
      m_Domain <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> domain;<br />
      m_Username <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> username;<br />
      m_Password <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> password;<br />
   }<br /><br />
   [PermissionSetAttribute(SecurityAction.Demand, Name <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"FullTrust"</span>)]<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> Enter()<br />
   {<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">     
if</span> (<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">this</span>.IsInContext) <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span>;<br />
      m_Token <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> IntPtr(0);<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">      try</span><br />
      {<br />
         m_Token <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> IntPtr.Zero;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">        
bool</span> logonSuccessfull <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> LogonUser(<br />
            m_Username,<br />
            m_Domain,<br />
            m_Password,<br />
            LOGON32_LOGON_INTERACTIVE,<br />
            LOGON32_PROVIDER_DEFAULT,<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">           
ref</span> m_Token);<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">        
if</span> (logonSuccessfull == <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">false</span>)<br />
         {<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">           
int</span> error <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> Marshal.GetLastWin32Error();<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">           
throw</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> Win32Exception(error);<br />
         }<br />
         WindowsIdentity identity <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> WindowsIdentity(m_Token);<br />
         m_Context <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> identity.Impersonate();<br />
      }<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">     
catch</span> (Exception exception)<br />
      {<br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">        
// Catch exceptions here</span><br />
      }<br />
   }<br /></span>
        </p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">  
[PermissionSetAttribute(SecurityAction.Demand, Name <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"FullTrust"</span>)]<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">  
public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> Leave()<br />
   {<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">      
if</span> (<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">this</span>.IsInContext
== <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">false</span>) <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span>;<br />
       m_Context.Undo();<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">      
if</span> (m_Token !<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> IntPtr.Zero)
CloseHandle(m_Token);<br />
       m_Context <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>;<br />
   }<br />
}</span>
        </p>
        <p>
 
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=36633846-2eca-40fe-9957-2859d8a244dc" />
      </body>
      <title>WindowsImpersonationContext made easy</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,36633846-2eca-40fe-9957-2859d8a244dc.aspx</guid>
      <link>http://michiel.vanotegem.nl/2006/07/07/WindowsImpersonationContextMadeEasy.aspx</link>
      <pubDate>Fri, 07 Jul 2006 19:18:44 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;Updated August 13, 2006 to reflect Sander's comment.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
On my old blog (in Dutch) I commented that I thought the WindowsImpersonationContext
was clumsy and I wrote a replacement that you can use as follows:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Console.WriteLine(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Current
user: "&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; WindowsIdentity.GetCurrent().Name);&lt;br&gt;
WrapperImpersonationContext context &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; WrapperImpersonationContext(domain,
username, password);&lt;br&gt;
context.Enter();&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
Execute code under other uses context&lt;/span&gt;
&lt;br&gt;
Console.WriteLine(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Current
user: "&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; WindowsIdentity.GetCurrent().Name);&lt;br&gt;
context.Leave();&lt;br&gt;
Console.WriteLine(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Current
user: "&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; WindowsIdentity.GetCurrent().Name);&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Recently a visitor noted that the code wasn't quite right (missng a view using statements,
and I found some other small issues. The correct code (including namespace references)
is below. It takes care of all that nasty calls into the Win32 API. The one thing
you need to be aware of is that it requires permissions to call into a DLL (i.e. run
unsafe code), which is why I added the attributes that indicate this. Unfortunately
that renders this class useless in a hosted environment, unless you strong sign the
assembly and pursuade the host to&amp;nbsp;allow your assembly to run in Full or High
trust. This however is a problem you will run into regardless your use of this class.
As soon as you call LogonUser you need at least High trust. If this is something that
should be possible under lower trust by default it's up to the folks in Redmond to
add this functionality to .NET and handle it as such.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Runtime.InteropServices;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Security.Principal;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Security.Permissions;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.ComponentModel;&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; WrapperImpersonationContext&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp; [DllImport(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"advapi32.dll"&lt;/span&gt;,
SetLastError &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;true&lt;/span&gt;)]&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;
public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;static&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;extern&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt; LogonUser(String
lpszUsername, String lpszDomain,&lt;br&gt;
&amp;nbsp;&amp;nbsp; String lpszPassword, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt; dwLogonType, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt; dwLogonProvider, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;ref&lt;/span&gt; IntPtr
phToken);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp; [DllImport(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"kernel32.dll"&lt;/span&gt;,
CharSet &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; CharSet.Auto)]&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;
public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;extern&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;static&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt; CloseHandle(IntPtr
handle);&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;
private&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;const&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt; LOGON32_PROVIDER_DEFAULT &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; 0;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;
private&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;const&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt; LOGON32_LOGON_INTERACTIVE &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; 2;&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;
private&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; m_Domain;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;
private&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; m_Password;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;
private&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; m_Username;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;
private&lt;/span&gt; IntPtr m_Token;&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;
private&lt;/span&gt; WindowsImpersonationContext m_Context &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;
protected&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt; IsInContext&lt;br&gt;
&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; m_Context
!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;;
}&lt;br&gt;
&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;
public&lt;/span&gt; WrapperImpersonationContext(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; domain, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; username, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; password)&lt;br&gt;
&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_Domain &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; domain;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_Username &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; username;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_Password &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; password;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp; [PermissionSetAttribute(SecurityAction.Demand, Name &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FullTrust"&lt;/span&gt;)]&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; Enter()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
if&lt;/span&gt; (&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;this&lt;/span&gt;.IsInContext) &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_Token &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; IntPtr(0);&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_Token &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; IntPtr.Zero;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
bool&lt;/span&gt; logonSuccessfull &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; LogonUser(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_Username,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_Domain,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_Password,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOGON32_LOGON_INTERACTIVE,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOGON32_PROVIDER_DEFAULT,&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
ref&lt;/span&gt; m_Token);&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
if&lt;/span&gt; (logonSuccessfull == &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;false&lt;/span&gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
int&lt;/span&gt; error &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; Marshal.GetLastWin32Error();&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
throw&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; Win32Exception(error);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WindowsIdentity identity &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; WindowsIdentity(m_Token);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_Context &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; identity.Impersonate();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
catch&lt;/span&gt; (Exception exception)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
// Catch exceptions here&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;/p&gt;
&gt; 
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;
[PermissionSetAttribute(SecurityAction.Demand, Name &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"FullTrust"&lt;/span&gt;)]&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;
public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; Leave()&lt;br&gt;
&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
if&lt;/span&gt; (&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;this&lt;/span&gt;.IsInContext
== &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;false&lt;/span&gt;) &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_Context.Undo();&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
if&lt;/span&gt; (m_Token !&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; IntPtr.Zero)
CloseHandle(m_Token);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_Context &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp; }&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=36633846-2eca-40fe-9957-2859d8a244dc" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,36633846-2eca-40fe-9957-2859d8a244dc.aspx</comments>
      <category>.NET</category>
      <category>Development</category>
      <category>English</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=c21092f7-621d-48f8-96dd-e3ae516cb769</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,c21092f7-621d-48f8-96dd-e3ae516cb769.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,c21092f7-621d-48f8-96dd-e3ae516cb769.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=c21092f7-621d-48f8-96dd-e3ae516cb769</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This is a great tool that helps you create a sound threat model of your application,
leading to a more secure application. Do yourself a favor and <a href="Microsoft Threat Analysis &amp; Modeling v2.0">download</a> it.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=c21092f7-621d-48f8-96dd-e3ae516cb769" />
      </body>
      <title>Microsoft Threat Analysis &amp; Modeling v2.0 released</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,c21092f7-621d-48f8-96dd-e3ae516cb769.aspx</guid>
      <link>http://michiel.vanotegem.nl/2006/07/07/MicrosoftThreatAnalysisModelingV20Released.aspx</link>
      <pubDate>Fri, 07 Jul 2006 07:22:50 GMT</pubDate>
      <description>&lt;p&gt;
This is a great tool that helps you create a sound threat model of your application,
leading to a more secure application. Do yourself a favor and &lt;a href="Microsoft Threat Analysis &amp;amp; Modeling v2.0"&gt;download&lt;/a&gt; it.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=c21092f7-621d-48f8-96dd-e3ae516cb769" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,c21092f7-621d-48f8-96dd-e3ae516cb769.aspx</comments>
      <category>Development</category>
      <category>English</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=93834b91-22b6-407b-9d8b-c9dacf1f279a</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,93834b91-22b6-407b-9d8b-c9dacf1f279a.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,93834b91-22b6-407b-9d8b-c9dacf1f279a.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=93834b91-22b6-407b-9d8b-c9dacf1f279a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Eerder al berichtte ik over deze Threat Modeling tool in <a href="http://www.vanotegem.nl/PermaLink,guid,fb492fc5-d9ee-4162-a5b8-ae63a1fa5b7d.aspx">Eerste
hulp bij Threat Modeling</a> toen dit nog een release candidate was. Deze tool is
er nu als final release en is <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=334ad466-8b53-4440-8ff0-6ac8142d9198&amp;displaylang=en">hier</a> te <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=334ad466-8b53-4440-8ff0-6ac8142d9198&amp;displaylang=en">downloaden</a>.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=93834b91-22b6-407b-9d8b-c9dacf1f279a" />
      </body>
      <title>Microsoft Threat Analysis &amp; Modeling v2.0 uigebracht</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,93834b91-22b6-407b-9d8b-c9dacf1f279a.aspx</guid>
      <link>http://michiel.vanotegem.nl/2006/07/07/MicrosoftThreatAnalysisModelingV20Uigebracht.aspx</link>
      <pubDate>Fri, 07 Jul 2006 07:19:06 GMT</pubDate>
      <description>&lt;p&gt;
Eerder al berichtte ik over deze Threat Modeling tool in &lt;a href="http://www.vanotegem.nl/PermaLink,guid,fb492fc5-d9ee-4162-a5b8-ae63a1fa5b7d.aspx"&gt;Eerste
hulp bij Threat Modeling&lt;/a&gt; toen dit nog een release candidate was. Deze tool is
er nu als final release en is&amp;nbsp;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=334ad466-8b53-4440-8ff0-6ac8142d9198&amp;amp;displaylang=en"&gt;hier&lt;/a&gt;&amp;nbsp;te &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=334ad466-8b53-4440-8ff0-6ac8142d9198&amp;amp;displaylang=en"&gt;downloaden&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=93834b91-22b6-407b-9d8b-c9dacf1f279a" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,93834b91-22b6-407b-9d8b-c9dacf1f279a.aspx</comments>
      <category>Development</category>
      <category>Nederlands</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=481db6c8-e40b-4387-9f01-52f3905bbee6</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,481db6c8-e40b-4387-9f01-52f3905bbee6.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,481db6c8-e40b-4387-9f01-52f3905bbee6.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=481db6c8-e40b-4387-9f01-52f3905bbee6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Ted Neward legt in zijn blogpost <a href="http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx">The
Vietnam of Computer Science</a> uit welke problemen zich voordoen bij object-relational
mapping (de overgang van de database naar objecten en weer terug). Het stuk is behoorlijk
lang, dus neem er even de tijd voor.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=481db6c8-e40b-4387-9f01-52f3905bbee6" />
      </body>
      <title>De problemen van object-relational mapping op een rijtje</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,481db6c8-e40b-4387-9f01-52f3905bbee6.aspx</guid>
      <link>http://michiel.vanotegem.nl/2006/06/27/DeProblemenVanObjectrelationalMappingOpEenRijtje.aspx</link>
      <pubDate>Tue, 27 Jun 2006 11:26:17 GMT</pubDate>
      <description>&lt;p&gt;
Ted Neward legt in zijn blogpost &lt;a href="http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx"&gt;The
Vietnam of Computer Science&lt;/a&gt; uit welke problemen zich voordoen bij object-relational
mapping (de overgang van de database naar objecten en weer terug). Het stuk is behoorlijk
lang, dus neem er even de tijd voor.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=481db6c8-e40b-4387-9f01-52f3905bbee6" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,481db6c8-e40b-4387-9f01-52f3905bbee6.aspx</comments>
      <category>Development</category>
      <category>Nederlands</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=fb492fc5-d9ee-4162-a5b8-ae63a1fa5b7d</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,fb492fc5-d9ee-4162-a5b8-ae63a1fa5b7d.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,fb492fc5-d9ee-4162-a5b8-ae63a1fa5b7d.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=fb492fc5-d9ee-4162-a5b8-ae63a1fa5b7d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Threat Modeling van een applicatie, het identificeren van mogelijke bedreigingen en
het registreren van de genomen maatregelen, wordt steeds belangrijker bij het maken
van veilige applicaties. Zonder Threat Modeling is het eigenlijk niet mogelijk om
te weten of een applicatie veilig is of niet. Aangezien Threat Modeling best
lastig is, heeft Microsoft een tool om dit te doen, Microsoft Threat Analysis &amp;
Modeling. Hiervan is momenteel versie 2.0 Release Candidate 1 te <a href="http://www.microsoft.com/downloads/thankyou.aspx?familyId=570dccd9-596a-44bc-bed7-1f6f0ad79e3d&amp;displayLang=en&amp;oRef=http%3a%2f%2fmsdn.microsoft.com%2fsecurity%2fsecurecode%2fthreatmodeling%2facetm%2f">downloaden</a>,
en binnenkort zal de uiteindelijke versie verschijnen. Deze tool bevat een wizard
om je applicatie mee te definieren, waaruit de mogelijke threats worden gegenereerd.
Zonodig kun je op basis van de Attack Library meer zaken toevoegen aan je model. Doe
er je voordeel mee!
</p>
        <p>
Overigens staat deze tool nog los van Visual Studio, hoewel je wel work items kunt
maken en exporteren naar VS. Het schijnt de bedoeling te zijn dat deze tool t.z.t.
onderdeel wordt van Visual Studio.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=fb492fc5-d9ee-4162-a5b8-ae63a1fa5b7d" />
      </body>
      <title>Eerste hulp bij Threat Modeling </title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,fb492fc5-d9ee-4162-a5b8-ae63a1fa5b7d.aspx</guid>
      <link>http://michiel.vanotegem.nl/2006/06/26/EersteHulpBijThreatModeling.aspx</link>
      <pubDate>Mon, 26 Jun 2006 11:46:30 GMT</pubDate>
      <description>&lt;p&gt;
Threat Modeling van een applicatie, het identificeren van mogelijke bedreigingen en
het registreren van de genomen maatregelen, wordt steeds belangrijker bij het maken
van veilige applicaties. Zonder Threat Modeling is het eigenlijk niet mogelijk om
te weten of&amp;nbsp;een applicatie veilig is of niet. Aangezien Threat Modeling best
lastig is, heeft Microsoft een tool om dit te doen, Microsoft Threat Analysis &amp;amp;
Modeling. Hiervan is momenteel versie 2.0 Release Candidate 1 te &lt;a href="http://www.microsoft.com/downloads/thankyou.aspx?familyId=570dccd9-596a-44bc-bed7-1f6f0ad79e3d&amp;amp;displayLang=en&amp;amp;oRef=http%3a%2f%2fmsdn.microsoft.com%2fsecurity%2fsecurecode%2fthreatmodeling%2facetm%2f"&gt;downloaden&lt;/a&gt;,
en binnenkort zal de uiteindelijke versie verschijnen. Deze tool bevat een wizard
om je applicatie mee te definieren, waaruit de mogelijke threats worden gegenereerd.
Zonodig kun je op basis van de Attack Library meer zaken toevoegen aan je model. Doe
er je voordeel mee!
&lt;/p&gt;
&lt;p&gt;
Overigens staat deze tool nog los van Visual Studio, hoewel je wel work items kunt
maken en exporteren naar VS. Het schijnt de bedoeling te zijn dat deze tool t.z.t.
onderdeel wordt van Visual Studio.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=fb492fc5-d9ee-4162-a5b8-ae63a1fa5b7d" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,fb492fc5-d9ee-4162-a5b8-ae63a1fa5b7d.aspx</comments>
      <category>Development</category>
      <category>Nederlands</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=988aa837-59ee-4032-a598-634da89906a4</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,988aa837-59ee-4032-a598-634da89906a4.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,988aa837-59ee-4032-a598-634da89906a4.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=988aa837-59ee-4032-a598-634da89906a4</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
WinFS, het op de PDC 2003 aangekondigde relationele file systeem, is op sterven na
dood. Oorspronkelijk zou deze technologie in Windows Vista komen en zou je makkelijk
je bestanden kunnen organiseren. Op het <a href="http://blogs.msdn.com/winfs/">WinFS
blog</a> van Microsoft is nu aangekondigd <a href="http://blogs.msdn.com/winfs/archive/2006/06/23/644706.aspx">wat
er gaat gebeuren met WinFS</a>. In het kort: onderdelen van de technologie komen in
de volgende versie van ADO.NET en SQL Server terecht, maar het zal niet meer geleverd
worden als aparte technologie. Daarmee is de gedachte van het relationele file systeem
min of meer van de baan zo lijkt het. De kritiek op <a href="http://blogs.msdn.com/winfs/archive/2006/06/23/644706.aspx">dit
bericht</a> is niet van de lucht (zie comments bij het bericht), en terecht. Door
deze koerswijziging is iets wat geweldig is voor zowel bedrijven als consumenten de
nek opgedraaied en wordt het expliciet in de bedrijfssfeer neergezet.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=988aa837-59ee-4032-a598-634da89906a4" />
      </body>
      <title>Grote kritiek op Microsoft na koerswijziging WinFS</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,988aa837-59ee-4032-a598-634da89906a4.aspx</guid>
      <link>http://michiel.vanotegem.nl/2006/06/26/GroteKritiekOpMicrosoftNaKoerswijzigingWinFS.aspx</link>
      <pubDate>Mon, 26 Jun 2006 08:26:46 GMT</pubDate>
      <description>&lt;p&gt;
WinFS, het op de PDC 2003 aangekondigde relationele file systeem, is op sterven na
dood. Oorspronkelijk zou deze technologie in Windows Vista komen en zou je makkelijk
je bestanden kunnen organiseren. Op het &lt;a href="http://blogs.msdn.com/winfs/"&gt;WinFS
blog&lt;/a&gt; van Microsoft is nu aangekondigd &lt;a href="http://blogs.msdn.com/winfs/archive/2006/06/23/644706.aspx"&gt;wat
er gaat gebeuren met WinFS&lt;/a&gt;. In het kort: onderdelen van de technologie komen in
de volgende versie van ADO.NET en SQL Server terecht, maar het zal niet meer geleverd
worden als aparte technologie. Daarmee is de gedachte van het relationele file systeem
min of meer van de baan zo lijkt het. De kritiek op &lt;a href="http://blogs.msdn.com/winfs/archive/2006/06/23/644706.aspx"&gt;dit
bericht&lt;/a&gt; is niet van de lucht (zie comments bij het bericht), en terecht. Door
deze koerswijziging is iets wat geweldig is voor zowel bedrijven als consumenten de
nek opgedraaied en wordt het expliciet in de bedrijfssfeer neergezet.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=988aa837-59ee-4032-a598-634da89906a4" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,988aa837-59ee-4032-a598-634da89906a4.aspx</comments>
      <category>Development</category>
      <category>Nederlands</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=970505a7-840a-46e5-ba08-773a777a247c</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,970505a7-840a-46e5-ba08-773a777a247c.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,970505a7-840a-46e5-ba08-773a777a247c.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=970505a7-840a-46e5-ba08-773a777a247c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
See Scott Hanselman's blog for details (no use repeating his post): <a href="http://www.hanselman.com/blog/FreePowerShellIDE.aspx">http://www.hanselman.com/blog/FreePowerShellIDE.aspx</a></p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=970505a7-840a-46e5-ba08-773a777a247c" />
      </body>
      <title>Free Powershell IDE</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,970505a7-840a-46e5-ba08-773a777a247c.aspx</guid>
      <link>http://michiel.vanotegem.nl/2006/06/19/FreePowershellIDE.aspx</link>
      <pubDate>Mon, 19 Jun 2006 07:50:09 GMT</pubDate>
      <description>&lt;p&gt;
See&amp;nbsp;Scott Hanselman's blog for details (no use repeating his post): &lt;a href="http://www.hanselman.com/blog/FreePowerShellIDE.aspx"&gt;http://www.hanselman.com/blog/FreePowerShellIDE.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=970505a7-840a-46e5-ba08-773a777a247c" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,970505a7-840a-46e5-ba08-773a777a247c.aspx</comments>
      <category>Development</category>
      <category>English</category>
    </item>
    <item>
      <trackback:ping>http://michiel.vanotegem.nl/Trackback.aspx?guid=485055da-e6ec-47e9-b8ba-7b70545db992</trackback:ping>
      <pingback:server>http://michiel.vanotegem.nl/pingback.aspx</pingback:server>
      <pingback:target>http://michiel.vanotegem.nl/PermaLink,guid,485055da-e6ec-47e9-b8ba-7b70545db992.aspx</pingback:target>
      <dc:creator>Michiel van Otegem</dc:creator>
      <wfw:comment>http://michiel.vanotegem.nl/CommentView,guid,485055da-e6ec-47e9-b8ba-7b70545db992.aspx</wfw:comment>
      <wfw:commentRss>http://michiel.vanotegem.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=485055da-e6ec-47e9-b8ba-7b70545db992</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Ik ben nooit zo van de command line geweest, maar Windows Powershell (voorheen
bekend als "Monad") is wel heel cool. Om het makkelijker te maken om Powershell scfiprts
te maken is het toch wel prettig dat er ook weer een IDE is. Zie deze <a href="http://www.hanselman.com/blog/FreePowerShellIDE.aspx">post
van Scott Hanselman</a>.
</p>
        <img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=485055da-e6ec-47e9-b8ba-7b70545db992" />
      </body>
      <title>Gratis Powershell IDE</title>
      <guid isPermaLink="false">http://michiel.vanotegem.nl/PermaLink,guid,485055da-e6ec-47e9-b8ba-7b70545db992.aspx</guid>
      <link>http://michiel.vanotegem.nl/2006/06/19/GratisPowershellIDE.aspx</link>
      <pubDate>Mon, 19 Jun 2006 07:49:11 GMT</pubDate>
      <description>&lt;p&gt;
Ik ben&amp;nbsp;nooit zo van de command line geweest, maar Windows Powershell (voorheen
bekend als "Monad") is wel heel cool. Om het makkelijker te maken om Powershell scfiprts
te maken is het toch wel prettig dat er ook weer een IDE is. Zie deze &lt;a href="http://www.hanselman.com/blog/FreePowerShellIDE.aspx"&gt;post
van Scott Hanselman&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://michiel.vanotegem.nl/aggbug.ashx?id=485055da-e6ec-47e9-b8ba-7b70545db992" /&gt;</description>
      <comments>http://michiel.vanotegem.nl/CommentView,guid,485055da-e6ec-47e9-b8ba-7b70545db992.aspx</comments>
      <category>Nederlands</category>
      <category>Development</category>
    </item>
  </channel>
</rss>