<?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>this.Pose() as Expert - Community</title>
    <link>http://chrison.net/</link>
    <description />
    <language>en-us</language>
    <copyright>Christoph Wille</copyright>
    <lastBuildDate>Wed, 28 Feb 2007 08:20:15 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>christoph.wille@gmail.com</managingEditor>
    <webMaster>christoph.wille@gmail.com</webMaster>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=882c78eb-1d78-412a-bb89-f4079fa7c174</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,882c78eb-1d78-412a-bb89-f4079fa7c174.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,882c78eb-1d78-412a-bb89-f4079fa7c174.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=882c78eb-1d78-412a-bb89-f4079fa7c174</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The <a href="http://fosdem.org/2007/media/video/">video recordings for the main tracks
of FOSDEM 2007</a> are online now. Of interest for .NET developers might be Miguel's
session on "Turbocharging Linux with <a href="http://www.mono-project.com/">Mono</a>".
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=882c78eb-1d78-412a-bb89-f4079fa7c174" />
      </body>
      <title>FOSDEM Video Recordings</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,882c78eb-1d78-412a-bb89-f4079fa7c174.aspx</guid>
      <link>http://chrison.net/FOSDEMVideoRecordings.aspx</link>
      <pubDate>Wed, 28 Feb 2007 08:20:15 GMT</pubDate>
      <description>&lt;p&gt;
The &lt;a href="http://fosdem.org/2007/media/video/"&gt;video recordings for the main tracks
of FOSDEM 2007&lt;/a&gt; are online now. Of interest for .NET developers might be Miguel's
session on "Turbocharging Linux with &lt;a href="http://www.mono-project.com/"&gt;Mono&lt;/a&gt;".
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=882c78eb-1d78-412a-bb89-f4079fa7c174" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,882c78eb-1d78-412a-bb89-f4079fa7c174.aspx</comments>
      <category>.NET</category>
      <category>Community</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=e44316ef-6f78-4bbf-968f-eacbd7872631</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,e44316ef-6f78-4bbf-968f-eacbd7872631.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,e44316ef-6f78-4bbf-968f-eacbd7872631.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=e44316ef-6f78-4bbf-968f-eacbd7872631</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Yesterday, Peter Koen held a talk at the .NET UG Vienna about Office Business
Applications (OBA). I had ignored this topic up until now, but it definitely is worth
checking out. Get started with <a href="http://blogs.msdn.com/erikaehrli/archive/2006/10/26/IntroductionToOBA.aspx">Office
Business Applications: What is it, and how can I get started?</a> and then head over
to the <a href="http://msdn2.microsoft.com/en-us/office/aa905528.aspx">Office Business
Applications Developer Portal</a>. (Also have a look at the <a href="http://msdn2.microsoft.com/en-us/arcjournal/bb232818.aspx">topics
in Architecture Journal #10</a>)
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=e44316ef-6f78-4bbf-968f-eacbd7872631" />
      </body>
      <title>Office Business Applications (OBA)</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,e44316ef-6f78-4bbf-968f-eacbd7872631.aspx</guid>
      <link>http://chrison.net/OfficeBusinessApplicationsOBA.aspx</link>
      <pubDate>Tue, 20 Feb 2007 10:09:37 GMT</pubDate>
      <description>&lt;p&gt;
Yesterday, Peter Koen held a talk at the .NET&amp;nbsp;UG Vienna about Office Business
Applications (OBA). I had ignored this topic up until now, but it definitely is worth
checking out. Get started with &lt;a href="http://blogs.msdn.com/erikaehrli/archive/2006/10/26/IntroductionToOBA.aspx"&gt;Office
Business Applications: What is it, and how can I get started?&lt;/a&gt; and then head over
to the &lt;a href="http://msdn2.microsoft.com/en-us/office/aa905528.aspx"&gt;Office Business
Applications Developer Portal&lt;/a&gt;. (Also have a look at the &lt;a href="http://msdn2.microsoft.com/en-us/arcjournal/bb232818.aspx"&gt;topics
in Architecture Journal #10&lt;/a&gt;)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=e44316ef-6f78-4bbf-968f-eacbd7872631" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,e44316ef-6f78-4bbf-968f-eacbd7872631.aspx</comments>
      <category>Community</category>
      <category>Software Architecture</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=e7f560a9-bd3e-4974-819e-d4b3771e8ca9</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,e7f560a9-bd3e-4974-819e-d4b3771e8ca9.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,e7f560a9-bd3e-4974-819e-d4b3771e8ca9.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=e7f560a9-bd3e-4974-819e-d4b3771e8ca9</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Got a developer question on how Windows Vista security affects your application? Then
the MSDN Forum <a href="http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=116&amp;SiteID=1">Security
for Applications in Windows Vista</a> is the right place to go.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=e7f560a9-bd3e-4974-819e-d4b3771e8ca9" />
      </body>
      <title>Security for Applications in Windows Vista Forum</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,e7f560a9-bd3e-4974-819e-d4b3771e8ca9.aspx</guid>
      <link>http://chrison.net/SecurityForApplicationsInWindowsVistaForum.aspx</link>
      <pubDate>Thu, 25 Jan 2007 09:38:07 GMT</pubDate>
      <description>&lt;p&gt;
Got a developer question on how Windows Vista security affects your application? Then
the MSDN Forum &lt;a href="http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=116&amp;amp;SiteID=1"&gt;Security
for Applications in Windows Vista&lt;/a&gt; is the right place to go.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=e7f560a9-bd3e-4974-819e-d4b3771e8ca9" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,e7f560a9-bd3e-4974-819e-d4b3771e8ca9.aspx</comments>
      <category>Community</category>
      <category>Security</category>
      <category>Vista</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=fb56c8e8-c15f-4148-99a2-66abd43286da</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,fb56c8e8-c15f-4148-99a2-66abd43286da.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,fb56c8e8-c15f-4148-99a2-66abd43286da.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=fb56c8e8-c15f-4148-99a2-66abd43286da</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I have been re-awarded <a href="http://mvp.support.microsoft.com/">MVP</a> for Visual
Developer ASP/ASP.NET. 
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=fb56c8e8-c15f-4148-99a2-66abd43286da" />
      </body>
      <title>MVP Visual Developer - ASP/ASP.NET Again 2007</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,fb56c8e8-c15f-4148-99a2-66abd43286da.aspx</guid>
      <link>http://chrison.net/MVPVisualDeveloperASPASPNETAgain2007.aspx</link>
      <pubDate>Wed, 03 Jan 2007 09:37:47 GMT</pubDate>
      <description>&lt;p&gt;
I have been re-awarded &lt;a href="http://mvp.support.microsoft.com/"&gt;MVP&lt;/a&gt; for Visual
Developer ASP/ASP.NET. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=fb56c8e8-c15f-4148-99a2-66abd43286da" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,fb56c8e8-c15f-4148-99a2-66abd43286da.aspx</comments>
      <category>ASP.NET</category>
      <category>Community</category>
      <category>this</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=5598e23e-647a-4ac8-8196-d180569fee67</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,5598e23e-647a-4ac8-8196-d180569fee67.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,5598e23e-647a-4ac8-8196-d180569fee67.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=5598e23e-647a-4ac8-8196-d180569fee67</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last Tuesday, I held the talk "Advanced Code Access Security" at UG Styria in Graz.
This talk was originally part of the MSDN Security Briefings held in Austria earlier
this year, for which MS Austria had asked MVPs to help create and deliver security
content. Advanced CAS seemed an interesting enough developer topic to re-run at user
groups, and <a href="http://blogs.msdn.com/mszcool/">Mario</a> (the author of this
session) has allowed me to publish the slide deck and demos for the general public.
</p>
        <p>
          <a href="http://chrison.net/content/binary/AdvancedCodeAccessSecurity.pdf">AdvancedCodeAccessSecurity.pdf
(4542 KB)</a>
        </p>
        <p>
          <a href="http://chrison.net/content/binary/AdvancedCAS.zip">AdvancedCAS.zip (599.6
KB)</a>
        </p>
        <p>
Please note that I have published only demos four (setting CAS via setup) and
six (using CAS in addin application) - those are the "completed" versions of
the demos.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=5598e23e-647a-4ac8-8196-d180569fee67" />
      </body>
      <title>Advanced Code Access Security</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,5598e23e-647a-4ac8-8196-d180569fee67.aspx</guid>
      <link>http://chrison.net/AdvancedCodeAccessSecurity.aspx</link>
      <pubDate>Mon, 30 Oct 2006 08:10:54 GMT</pubDate>
      <description>&lt;p&gt;
Last Tuesday, I held the talk "Advanced Code Access Security" at UG Styria in Graz.
This talk was originally part of the MSDN Security Briefings held in Austria earlier
this year, for which MS Austria had asked MVPs to help create and deliver security
content. Advanced CAS seemed an interesting enough developer topic to re-run at user
groups, and &lt;a href="http://blogs.msdn.com/mszcool/"&gt;Mario&lt;/a&gt; (the author of this
session) has allowed me to publish the slide deck and demos for the general public.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/AdvancedCodeAccessSecurity.pdf"&gt;AdvancedCodeAccessSecurity.pdf
(4542 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/AdvancedCAS.zip"&gt;AdvancedCAS.zip (599.6
KB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Please note that I have published only demos four (setting CAS via setup)&amp;nbsp;and
six (using CAS in addin application)&amp;nbsp;- those are the "completed" versions of
the demos.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=5598e23e-647a-4ac8-8196-d180569fee67" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,5598e23e-647a-4ac8-8196-d180569fee67.aspx</comments>
      <category>.NET</category>
      <category>2 Ohhhh</category>
      <category>Community</category>
      <category>Cool Download</category>
      <category>Security</category>
      <category>this</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=7cc51630-782d-4c3b-8889-10ddab9a902d</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,7cc51630-782d-4c3b-8889-10ddab9a902d.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,7cc51630-782d-4c3b-8889-10ddab9a902d.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=7cc51630-782d-4c3b-8889-10ddab9a902d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
During the MVP Open Day in Munich last week (Friday &amp; Saturday), we had a presentation
by Talhah Mir (<a href="http://blogs.msdn.com/ace_team/">ACE Team</a>, <a href="http://blogs.msdn.com/threatmodeling/">Threat
Modeling</a> blogs) on threat modeling - which (I hope) everyone is familiar
by now. During the talk, he pointed us to an interesting resource: <a href="http://www.privacyrights.org/ar/ChronDataBreaches.htm">A
Chronology of Data Breaches</a> from the Privacy Rights Clearinghouse. Quite an interesting
list of incidents, which gives you an idea of the ratio of actual hacking vs dishonest
insider, as well as other types of security breaches.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=7cc51630-782d-4c3b-8889-10ddab9a902d" />
      </body>
      <title>A Chronology of Data Breaches</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,7cc51630-782d-4c3b-8889-10ddab9a902d.aspx</guid>
      <link>http://chrison.net/AChronologyOfDataBreaches.aspx</link>
      <pubDate>Wed, 12 Apr 2006 08:20:38 GMT</pubDate>
      <description>&lt;p&gt;
During the MVP Open Day in Munich last week (Friday &amp;amp; Saturday), we had a presentation
by Talhah Mir (&lt;a href="http://blogs.msdn.com/ace_team/"&gt;ACE Team&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/threatmodeling/"&gt;Threat
Modeling&lt;/a&gt;&amp;nbsp;blogs) on threat modeling - which (I hope) everyone is familiar
by now. During the talk, he pointed us to an interesting resource: &lt;a href="http://www.privacyrights.org/ar/ChronDataBreaches.htm"&gt;A
Chronology of Data Breaches&lt;/a&gt; from the Privacy Rights Clearinghouse. Quite an interesting
list of incidents, which gives you an idea of the ratio of actual hacking vs dishonest
insider, as well as other types of security breaches.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=7cc51630-782d-4c3b-8889-10ddab9a902d" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,7cc51630-782d-4c3b-8889-10ddab9a902d.aspx</comments>
      <category>Community</category>
      <category>Security</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=8da2b45e-3dca-478d-a552-e07ee3c78af5</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,8da2b45e-3dca-478d-a552-e07ee3c78af5.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,8da2b45e-3dca-478d-a552-e07ee3c78af5.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=8da2b45e-3dca-478d-a552-e07ee3c78af5</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today, I got my <a href="http://mvp.support.microsoft.com/">MVP</a> award package,
which kind of makes it fully official. No surprise with my area of expertise:
Visual Developer ASP / ASP.NET.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=8da2b45e-3dca-478d-a552-e07ee3c78af5" />
      </body>
      <title>MVP 2006</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,8da2b45e-3dca-478d-a552-e07ee3c78af5.aspx</guid>
      <link>http://chrison.net/MVP2006.aspx</link>
      <pubDate>Mon, 09 Jan 2006 17:20:44 GMT</pubDate>
      <description>&lt;p&gt;
Today, I got my &lt;a href="http://mvp.support.microsoft.com/"&gt;MVP&lt;/a&gt; award package,
which kind of makes it fully official. No surprise with my&amp;nbsp;area of expertise:
Visual Developer ASP / ASP.NET.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=8da2b45e-3dca-478d-a552-e07ee3c78af5" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,8da2b45e-3dca-478d-a552-e07ee3c78af5.aspx</comments>
      <category>ASP.NET</category>
      <category>Community</category>
      <category>this</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=12ef6e77-fe53-4697-9c16-9df403ad088a</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,12ef6e77-fe53-4697-9c16-9df403ad088a.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,12ef6e77-fe53-4697-9c16-9df403ad088a.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=12ef6e77-fe53-4697-9c16-9df403ad088a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Only a little more than two weeks to go until our yearly Community Wintercamp - "our"
as in German .NET mailing list community. The <a href="http://www.dotnetgerman.com/Community/Wintercamp2006/">agenda</a> [German]
has been posted quite some time ago, and this year it's going to be great because
we already have tons of snow (literally). If you are a .NET aficionado living nearby (I
like to define "nearby" as Switzerland, Germany or Austria) you are welcome to
join a band of geeks in the snow! To whet your appetite, take a look at the photos
and accounts of the past events.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=12ef6e77-fe53-4697-9c16-9df403ad088a" />
      </body>
      <title>Community Wintercamp 2006</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,12ef6e77-fe53-4697-9c16-9df403ad088a.aspx</guid>
      <link>http://chrison.net/CommunityWintercamp2006.aspx</link>
      <pubDate>Wed, 04 Jan 2006 11:41:23 GMT</pubDate>
      <description>&lt;p&gt;
Only a little more than two weeks to go until our yearly Community Wintercamp - "our"
as in German .NET mailing list community. The &lt;a href="http://www.dotnetgerman.com/Community/Wintercamp2006/"&gt;agenda&lt;/a&gt; [German]
has been posted quite some time ago, and this year it's going to be great because
we already have tons of snow (literally). If you are a .NET aficionado living nearby&amp;nbsp;(I
like to define "nearby"&amp;nbsp;as Switzerland, Germany or Austria) you are welcome to
join a band of geeks in the snow! To whet your appetite, take a look at the photos
and accounts of the past events.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=12ef6e77-fe53-4697-9c16-9df403ad088a" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,12ef6e77-fe53-4697-9c16-9df403ad088a.aspx</comments>
      <category>Community</category>
      <category>this</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=ef3e6b4b-9ac4-455b-b784-837646d5e8b4</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,ef3e6b4b-9ac4-455b-b784-837646d5e8b4.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,ef3e6b4b-9ac4-455b-b784-837646d5e8b4.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=ef3e6b4b-9ac4-455b-b784-837646d5e8b4</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Today, a member of our <a href="http://www.dotnetgerman.com/">German .NET community</a> asked
if it is possible to programmatically query the Google page rank. He had seen it done
in PHP (<a href="http://www.googlecommunity.com/scripts/pagerank-source.phps">here</a> on
the <a href="http://www.googlecommunity.com/">Google Community</a> site), but didn't
have time / PHP skills to translate it. All I found on a rather shallow search was <a href="http://www.bolinfest.com/pullrank/">PullRank</a>,
which I'd describe as non-fit for server use.
</p>
        <p>
So I decided to set out to convert the PHP sample. Being PHP-challenged myself, I
decided to give the <a href="http://msdn.microsoft.com/asp.net/using/migrating/phpmig/phpmigasst.aspx">PHP
to ASP.NET Migration Assistant</a> a shot. Whoha! That converted code is the most
convoluted contraption to be called code I have seen - ever. I tried to get it to
run, but failed because the conversion left me with some loose ends.
</p>
        <p>
Instead of giving in, I contacted <a href="http://www.hauser-wenz.de/s9y/">Christian
Wenz</a> to lend me a hand because he has some PHP experience. He thankfully hosted
an "annotated" version of the PHP script so I could look at the output of
various stages to test my solution with known-good values. That was most helpful.
</p>
        <p>
Instead of doing a Web site demo application with everything intertwined, I split
up the project into two - <strong>GPRDotNet</strong> being a DLL assembly project
you can reference in any type of .NET application (Windows Forms, Web Forms, you name
it), as well as a simple Web frontend to demo the usage: <strong>DemoSite</strong>.
</p>
        <p>
          <img src="http://chrison.net/content/binary/GooglePageRankInDotNet20.png" border="0" />
        </p>
        <p>
Querying the page rank is really simple - the following snippet is the code
from the "Check PageRank" button event handler:
</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">void</span> doCheckPageRank_Click(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">object</span> sender,
EventArgs e)<br />
{<br />
  GooglePageRank pr <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> GooglePageRank();<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><font color="#000000">  </font>string</span> url <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> webSiteUrl.Text;<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><font color="#000000">  </font>try</span><br />
  {<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><font color="#000000">    </font>string</span> rank <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> pr.GetRank(url);<br />
    thePageRank.Text <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> rank;<br />
  }<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><font color="#000000">  </font>catch</span> (Exception
ex)<br />
  {<br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><font color="#000000">    </font>//
this is rather chatty (telling the end user everything *IS* a bad idea)</span><br />
    thePageRank.Text <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">"Requesting
the page rank failed. Reason: "</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> ex.ToString();<br />
  }<br />
}</span>
        </p>
        <p>
I want to emphasize that the code for the GooglePageRank class is a rather quick &amp;
dirty port of the PHP code and that it does not contain the necessary error handling
you would expect for a server-side library. After all, it is just a proof of concept
for our community.
</p>
        <p>
Finally, here is the source code: <a href="http://chrison.net/content/binary/PageRank.zip">PageRank.zip
(26.89 KB)</a></p>
        <p>
If you find errors, please leave a blog comment so others know about improvements.
Thanks!
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=ef3e6b4b-9ac4-455b-b784-837646d5e8b4" />
      </body>
      <title>Google PageRank as a .NET Assembly</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,ef3e6b4b-9ac4-455b-b784-837646d5e8b4.aspx</guid>
      <link>http://chrison.net/GooglePageRankAsANETAssembly.aspx</link>
      <pubDate>Mon, 05 Dec 2005 18:03:00 GMT</pubDate>
      <description>&lt;p&gt;
Today, a member of our &lt;a href="http://www.dotnetgerman.com/"&gt;German .NET community&lt;/a&gt; asked
if it is possible to programmatically query the Google page rank. He had seen it done
in PHP (&lt;a href="http://www.googlecommunity.com/scripts/pagerank-source.phps"&gt;here&lt;/a&gt;&amp;nbsp;on
the &lt;a href="http://www.googlecommunity.com/"&gt;Google Community&lt;/a&gt; site), but didn't
have time / PHP skills to translate it. All I found on a rather shallow search was &lt;a href="http://www.bolinfest.com/pullrank/"&gt;PullRank&lt;/a&gt;,
which I'd describe as&amp;nbsp;non-fit for server use.
&lt;/p&gt;
&lt;p&gt;
So I decided to set out to convert the PHP sample. Being PHP-challenged myself, I
decided to give the &lt;a href="http://msdn.microsoft.com/asp.net/using/migrating/phpmig/phpmigasst.aspx"&gt;PHP
to ASP.NET Migration Assistant&lt;/a&gt; a shot. Whoha! That converted code is the most
convoluted contraption to be called code I have seen - ever. I tried to get it to
run, but failed because the conversion left me with some loose ends.
&lt;/p&gt;
&lt;p&gt;
Instead of giving in, I contacted &lt;a href="http://www.hauser-wenz.de/s9y/"&gt;Christian
Wenz&lt;/a&gt; to lend me a hand because he has some PHP experience. He thankfully hosted
an "annotated"&amp;nbsp;version of the PHP script so I could look at the output&amp;nbsp;of
various stages to test my solution with known-good values. That was most helpful.
&lt;/p&gt;
&lt;p&gt;
Instead of doing a Web site demo application with everything intertwined, I split
up the project into two - &lt;strong&gt;GPRDotNet&lt;/strong&gt; being a DLL assembly project
you can reference in any type of .NET application (Windows Forms, Web Forms, you name
it), as well as a simple Web frontend to demo the usage: &lt;strong&gt;DemoSite&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/GooglePageRankInDotNet20.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Querying the page rank is really simple -&amp;nbsp;the following snippet&amp;nbsp;is the code
from the "Check PageRank" button event handler:
&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;protected&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; doCheckPageRank_Click(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;object&lt;/span&gt; sender,
EventArgs e)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; GooglePageRank pr &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; GooglePageRank();&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font color=#000000&gt;&amp;nbsp; &lt;/font&gt;string&lt;/span&gt; url &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; webSiteUrl.Text;&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font color=#000000&gt;&amp;nbsp; &lt;/font&gt;try&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; {&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;string&lt;/span&gt; rank &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; pr.GetRank(url);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; thePageRank.Text &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; rank;&lt;br&gt;
&amp;nbsp; }&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font color=#000000&gt;&amp;nbsp; &lt;/font&gt;catch&lt;/span&gt; (Exception
ex)&lt;br&gt;
&amp;nbsp; {&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;//
this is rather chatty (telling the end user everything *IS* a bad idea)&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; thePageRank.Text &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;"Requesting
the page rank failed. Reason: "&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; ex.ToString();&lt;br&gt;
&amp;nbsp; }&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
I want to emphasize that the code for the GooglePageRank class is a rather quick &amp;amp;
dirty port of the PHP code and&amp;nbsp;that it does not contain the necessary error handling
you would expect for a server-side library. After all, it is just a proof of concept
for our community.
&lt;/p&gt;
&lt;p&gt;
Finally, here is the source code: &lt;a href="http://chrison.net/content/binary/PageRank.zip"&gt;PageRank.zip
(26.89 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
If you find errors, please leave a blog comment so others know about improvements.
Thanks!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=ef3e6b4b-9ac4-455b-b784-837646d5e8b4" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,ef3e6b4b-9ac4-455b-b784-837646d5e8b4.aspx</comments>
      <category>.NET</category>
      <category>2 Ohhhh</category>
      <category>ASP.NET</category>
      <category>C#</category>
      <category>Community</category>
      <category>this</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=be85284c-17d5-4382-bba1-36d1df701ca1</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,be85284c-17d5-4382-bba1-36d1df701ca1.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,be85284c-17d5-4382-bba1-36d1df701ca1.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=be85284c-17d5-4382-bba1-36d1df701ca1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Now that's what I call a <a href="http://dev.communityserver.org/bugs/ItemDetails.aspx?IssueId=2074&amp;ProjectId=101&amp;ProjectName=Community+Server">quick
response to my request</a>. Thanks! <a href="http://communityserver.org/">Community
Server</a> rocks.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=be85284c-17d5-4382-bba1-36d1df701ca1" />
      </body>
      <title>Community Server v1.2 will support setting the SMTP port number</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,be85284c-17d5-4382-bba1-36d1df701ca1.aspx</guid>
      <link>http://chrison.net/CommunityServerV12WillSupportSettingTheSMTPPortNumber.aspx</link>
      <pubDate>Sat, 15 Oct 2005 15:12:05 GMT</pubDate>
      <description>&lt;p&gt;
Now that's what I call a &lt;a href="http://dev.communityserver.org/bugs/ItemDetails.aspx?IssueId=2074&amp;amp;ProjectId=101&amp;amp;ProjectName=Community+Server"&gt;quick
response to my request&lt;/a&gt;. Thanks! &lt;a href="http://communityserver.org/"&gt;Community
Server&lt;/a&gt; rocks.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=be85284c-17d5-4382-bba1-36d1df701ca1" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,be85284c-17d5-4382-bba1-36d1df701ca1.aspx</comments>
      <category>Community</category>
      <category>this</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=e7a53005-299e-456e-9af2-40d927045d98</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,e7a53005-299e-456e-9af2-40d927045d98.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,e7a53005-299e-456e-9af2-40d927045d98.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=e7a53005-299e-456e-9af2-40d927045d98</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Rob Howard <a href="http://weblogs.asp.net/rhoward/archive/2005/10/03/426425.aspx">blogs
about this acquisition</a>. Cool things coming to Community Server!
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=e7a53005-299e-456e-9af2-40d927045d98" />
      </body>
      <title>Telligent acquires Dozing Dogs CMS</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,e7a53005-299e-456e-9af2-40d927045d98.aspx</guid>
      <link>http://chrison.net/TelligentAcquiresDozingDogsCMS.aspx</link>
      <pubDate>Mon, 03 Oct 2005 17:51:06 GMT</pubDate>
      <description>&lt;p&gt;
Rob Howard &lt;a href="http://weblogs.asp.net/rhoward/archive/2005/10/03/426425.aspx"&gt;blogs
about this acquisition&lt;/a&gt;. Cool things coming to Community Server!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=e7a53005-299e-456e-9af2-40d927045d98" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,e7a53005-299e-456e-9af2-40d927045d98.aspx</comments>
      <category>ASP.NET</category>
      <category>Community</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=c0389f43-ddbc-4cd6-ae94-0b982164338a</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,c0389f43-ddbc-4cd6-ae94-0b982164338a.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,c0389f43-ddbc-4cd6-ae94-0b982164338a.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=c0389f43-ddbc-4cd6-ae94-0b982164338a</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
At the MVP Summit, the EMEA / LATAM ASP.NET MVPs were partnering to prepare feedback
for the team (any more information and I have to shoot you, or shoot your lawyer if
you prefer). We were having a jolly good time (we all agreed to spend money on beer
and... but that's another story). At that point I suggested that we (book authors,
bloggers, article authors, et al) should slap a mandatory warning on our sample code
/ application: "Not built to scale."
</p>
        <p>
However, in the German community we have an application built to scale: <a href="http://codefairway.net/">CodeFairway.NET</a>.
I wrote an <a href="http://chrison.net/WarningLowFlyingGolfBalls.aspx">overview article</a>,
now <a href="http://alexonasp.net">Alex</a> followed up with an in-depth look at the
features, architecture and techniques of CFW. Read <a href="http://blogs.dotnetgerman.com/alexonasp.net/PermaLink,guid,68c2c73c-f9eb-4919-a8e1-1edf38affd8a.aspx">Code
Behind: CodeFairway.NET</a>.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=c0389f43-ddbc-4cd6-ae94-0b982164338a" />
      </body>
      <title>Built to scale</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,c0389f43-ddbc-4cd6-ae94-0b982164338a.aspx</guid>
      <link>http://chrison.net/BuiltToScale.aspx</link>
      <pubDate>Mon, 03 Oct 2005 15:24:41 GMT</pubDate>
      <description>&lt;p&gt;
At the MVP Summit, the EMEA / LATAM ASP.NET MVPs were partnering to prepare feedback
for the team (any more information and I have to shoot you, or shoot your lawyer if
you prefer). We were having a jolly good time (we all agreed to spend money on beer
and... but that's another story). At that point I suggested that we (book authors,
bloggers, article authors, et al) should slap a mandatory warning on our sample code
/ application: "Not built to scale."
&lt;/p&gt;
&lt;p&gt;
However, in the German community we have an application built to scale: &lt;a href="http://codefairway.net/"&gt;CodeFairway.NET&lt;/a&gt;.
I wrote an &lt;a href="http://chrison.net/WarningLowFlyingGolfBalls.aspx"&gt;overview article&lt;/a&gt;,
now &lt;a href="http://alexonasp.net"&gt;Alex&lt;/a&gt; followed up with an in-depth look at the
features, architecture and techniques of CFW. Read &lt;a href="http://blogs.dotnetgerman.com/alexonasp.net/PermaLink,guid,68c2c73c-f9eb-4919-a8e1-1edf38affd8a.aspx"&gt;Code
Behind: CodeFairway.NET&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=c0389f43-ddbc-4cd6-ae94-0b982164338a" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,c0389f43-ddbc-4cd6-ae94-0b982164338a.aspx</comments>
      <category>ASP.NET</category>
      <category>Community</category>
      <category>this</category>
      <category>Web Services</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=b3aedfc3-d34e-438f-8e94-51c0f55d34a5</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,b3aedfc3-d34e-438f-8e94-51c0f55d34a5.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,b3aedfc3-d34e-438f-8e94-51c0f55d34a5.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=b3aedfc3-d34e-438f-8e94-51c0f55d34a5</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The MVP Summit 2005 is over, and with the exception of Transportationgate, it was
a great event - even though I had attended PDC05, and worked with Whidbey for years
now. I don't primarily come for the news, but talking to other MVPs as well as product
group members.
</p>
        <p>
On the community side of things, <a href="http://alexonasp.net">Alex</a> and I put
the finishing touches on the localization feature of <a href="http://codefairway.net/">CodeFairway.NET</a>,
which now includes the ability to play a tournament in a specific timezone. 
</p>
        <p>
You don't know what <a href="http://codefairway.net/">CodeFairway.NET</a> means? Let
me introduce .NET Golf to you:
</p>
        <p>
          <img src="http://chrison.net/content/binary/golf_home.jpg" border="0" />
        </p>
        <p>
Now, that is intentionally a graphic, to show that sites made by programmers for programmers
need not be ugly but can be quite appealing. Here goes the text for easier reading:
</p>
        <p>
          <em>"What is .NET Golf?" How did the union of a programming technology and a lawn
sport come about? Well, the idea is simple and fascinating: in 'classical golf' the
winner is the player using the least number of strokes to hole out. We transferred
this concept to programming: whoever needs the fewest number of characters to solve
a given programming problem wins the tournament. Speed and elegance of the solution
are not criteria.</em>
        </p>
        <p>
          <em>Each tournament extends over a given time span, after the end of the tournament
we hold 'post mortems', i.e. the participants explain their solutions (so that there
may be a great wailing and gnashing of teeth behooving the creative abuse of the technology).</em>
        </p>
        <p>
          <em>.NET Golf is the successor of ASP Golf which was quite popular among German language
developers for a long time (the actual ancestor of code golf is Perl Golf). As many
golfers switched over to .NET, we decided to migrate this waste of time ^H^H^H^H^H^H^H^H^H^H^H^H^Hmost
excellent use of technology to .NET so that the envelope of programming could continually
be pushed further.</em>
        </p>
        <p>
Sounds interesting, doesn't it? That's what we thought and that's why we ran a <a href="http://codefairway.net/mvpsummit05/">tournament
at the MVP summit</a> (all English, you can browse it to learn more) to introduce
other MVPs to .NET Golf - and whet their appetite to be the host for .NET Golf in
their community. If you didn't get a chance to talk to me at the summit, here's what
we (German community members, so that there are no misunderstandings) offer:
we host the site for you on CodeFairway.NET, and we provide you with the automated
test system we have created so that there is little to no overhead for you. Your job:
translate the site into your community's native language, and come up with challenges
(we can help get you started). My MSN account to get in touch with me: christoph dot
wille at alphasierrapapa dot com (also my email alias if you prefer emailing me upfront).
</p>
        <p>
Funny enough at the MVP summit, for the very first time in history of our tournaments,
the VB.NET golfers won the tournament hands down. That might have changed if only
Karsten and the others would have paid more attention to the sessions ;-)
</p>
        <p>
The leaderboard for the first three looked like this (and yes, the Show link does
show the source of the submission - <a href="http://codefairway.net/mvpsummit05/solvedholes.aspx?action=leaderboard&amp;hole=21">check
it out</a>):
</p>
        <p>
          <img src="http://chrison.net/content/binary/golf_leaderboard.png" border="0" />
        </p>
        <p>
          <br />
It took them quite a while to get on the green, but as with every other tournament
I heard something like this: "I only wanted to play till 11:30PM, but at 1:30AM I
finally coaxed me to go to bed". Addictive. Even for a simple challenge such as the
one played at the MVP Summit:
</p>
        <p>
          <em>How can you tell whether three lines of a given length make up a triangle? Some
cases are obivious - equilateral triangles, isosceles triangles and triangles governed
by the Pythagorean theorem. General triangles are a different matter though. You are
now challenged to decide whether a given set of three integers represents the sides
of a triangle and indicate this by passing back true, otherwise passing back false
to the test application. Please note that "flat" triangles (triangles which have the
shorter sides add up to the length of the longer side) do not count as triangles.</em>
        </p>
        <p>
          <em>The class name for this challenge is Tee, the method name Off. The values for
the three sides are passed as a string (never empty, always three values contained)
to the Off method, the values are separated by a single space (eg "300 400 5000" which
obviously is not a triangle). The values are non-negative integers.</em>
        </p>
        <p>
So if you are interested in being the host for your community, get in touch with me.
.NET Golf is very popular: currently, Microsoft Austria is using our <a href="http://codefairway.net/de/">German
codefairway</a> to play a MSDN Connection tournament. Mario <a href="http://blogs.msdn.com/mszcool/archive/2005/10/01/475999.aspx">just
announced it (English)</a>.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=b3aedfc3-d34e-438f-8e94-51c0f55d34a5" />
      </body>
      <title>Warning: Low-Flying Golf Balls</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,b3aedfc3-d34e-438f-8e94-51c0f55d34a5.aspx</guid>
      <link>http://chrison.net/WarningLowFlyingGolfBalls.aspx</link>
      <pubDate>Sun, 02 Oct 2005 14:21:26 GMT</pubDate>
      <description>&lt;p&gt;
The MVP Summit 2005 is over, and with the exception of Transportationgate, it was
a great event - even though I had attended PDC05, and worked with Whidbey for years
now. I don't primarily come for the news, but talking to other MVPs as well as product
group members.
&lt;/p&gt;
&lt;p&gt;
On the community side of things, &lt;a href="http://alexonasp.net"&gt;Alex&lt;/a&gt; and I put
the finishing touches on the localization feature of &lt;a href="http://codefairway.net/"&gt;CodeFairway.NET&lt;/a&gt;,
which now includes the ability to play a tournament in a specific timezone. 
&lt;/p&gt;
&lt;p&gt;
You don't know what &lt;a href="http://codefairway.net/"&gt;CodeFairway.NET&lt;/a&gt; means? Let
me introduce .NET Golf to you:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/golf_home.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Now, that is intentionally a graphic, to show that sites made by programmers for programmers
need not be ugly but can be quite appealing. Here goes the text for easier reading:
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;"What is .NET Golf?" How did the union of a programming technology and a lawn
sport come about? Well, the idea is simple and fascinating: in 'classical golf' the
winner is the player using the least number of strokes to hole out. We transferred
this concept to programming: whoever needs the fewest number of characters to solve
a given programming problem wins the tournament. Speed and elegance of the solution
are not criteria.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Each tournament extends over a given time span, after the end of the tournament
we hold 'post mortems', i.e. the participants explain their solutions (so that there
may be a great wailing and gnashing of teeth behooving the creative abuse of the technology).&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;.NET Golf is the successor of ASP Golf which was quite popular among German language
developers for a long time (the actual ancestor of code golf is Perl Golf). As many
golfers switched over to .NET, we decided to migrate this waste of time ^H^H^H^H^H^H^H^H^H^H^H^H^Hmost
excellent use of technology to .NET so that the envelope of programming could continually
be pushed further.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Sounds interesting, doesn't it? That's what we thought and that's why we ran a &lt;a href="http://codefairway.net/mvpsummit05/"&gt;tournament
at the MVP summit&lt;/a&gt; (all English, you can browse it to learn more) to introduce
other MVPs to .NET Golf - and whet their appetite to be the host for .NET Golf in
their community. If you didn't get a chance to talk to me at the summit, here's what
we (German community members, so that there are no misunderstandings)&amp;nbsp;offer:
we host the site for you on CodeFairway.NET, and we provide you with the automated
test system we have created so that there is little to no overhead for you. Your job:
translate the site into your community's native language, and come up with challenges
(we can help get you started). My MSN account to get in touch with me: christoph dot
wille at alphasierrapapa dot com (also my email alias if you prefer emailing me upfront).
&lt;/p&gt;
&lt;p&gt;
Funny enough at the MVP summit, for the very first time in history of our tournaments,
the VB.NET golfers won the tournament hands down. That might have changed if only
Karsten and the others would have paid more attention to the sessions ;-)
&lt;/p&gt;
&lt;p&gt;
The leaderboard for the first three looked like this (and yes, the Show link does
show the source of the submission - &lt;a href="http://codefairway.net/mvpsummit05/solvedholes.aspx?action=leaderboard&amp;amp;hole=21"&gt;check
it out&lt;/a&gt;):
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/golf_leaderboard.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
It took them quite a while to get on the green, but as with every other tournament
I heard something like this: "I only wanted to play till 11:30PM, but at 1:30AM I
finally coaxed me to go to bed". Addictive. Even for a simple challenge such as the
one played at the MVP Summit:
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;How can you tell whether three lines of a given length make up a triangle? Some
cases are obivious - equilateral triangles, isosceles triangles and triangles governed
by the Pythagorean theorem. General triangles are a different matter though. You are
now challenged to decide whether a given set of three integers represents the sides
of a triangle and indicate this by passing back true, otherwise passing back false
to the test application. Please note that "flat" triangles (triangles which have the
shorter sides add up to the length of the longer side) do not count as triangles.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;The class name for this challenge is Tee, the method name Off. The values for
the three sides are passed as a string (never empty, always three values contained)
to the Off method, the values are separated by a single space (eg "300 400 5000" which
obviously is not a triangle). The values are non-negative integers.&lt;/em&gt; 
&lt;/p&gt;
&lt;p&gt;
So if you are interested in being the host for your community, get in touch with me.
.NET Golf is very popular: currently, Microsoft Austria is using our &lt;a href="http://codefairway.net/de/"&gt;German
codefairway&lt;/a&gt; to play a MSDN Connection tournament. Mario &lt;a href="http://blogs.msdn.com/mszcool/archive/2005/10/01/475999.aspx"&gt;just
announced it (English)&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=b3aedfc3-d34e-438f-8e94-51c0f55d34a5" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,b3aedfc3-d34e-438f-8e94-51c0f55d34a5.aspx</comments>
      <category>.NET</category>
      <category>Community</category>
      <category>this</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=1fcc902e-dd59-4950-96f5-9e70275d7ef0</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,1fcc902e-dd59-4950-96f5-9e70275d7ef0.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,1fcc902e-dd59-4950-96f5-9e70275d7ef0.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=1fcc902e-dd59-4950-96f5-9e70275d7ef0</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Although the files for this <a href="http://chrison.net/TechTalkRepeatNETUGStyria.aspx">TechTalk
repeat</a> are identical to the <a href="http://chrison.net/TechTalkDownloads.aspx">TechTalk
downloads</a>, I noticed that the download location has been <a href="http://www.microsoft.com/germany/msdn/techtalk/events/archiv.mspx#E03D0BAA">moved</a>.
For your convenience, here are the direct download links to the three respective files:
</p>
        <ul>
          <li>
            <a href="http://www.techtalk.ms/LinkClick.aspx?link=Downloads%2fTechtalkToolLinksFuerTeilnehmer.doc&amp;tabid=42&amp;mid=423">Aktuelle
Linkliste für alle Teilnehmer des TechTalks (Microsoft Word-Datei) (50,69 Kb)</a>
          </li>
          <li>
            <a href="http://www.techtalk.ms/LinkClick.aspx?link=Downloads%2fNETDevToolsSlides.zip&amp;tabid=42&amp;mid=423">PowerPoint-Slide
zum Vortrag (162,09 Kb)</a>
          </li>
          <li>
            <a href="http://www.techtalk.ms/LinkClick.aspx?link=Downloads%2fttdownload.zip&amp;tabid=42&amp;mid=423">TechTalk
Demo Files (6142,77 Kb)</a>
          </li>
        </ul>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=1fcc902e-dd59-4950-96f5-9e70275d7ef0" />
      </body>
      <title>Slides, Demos, Links for Yesterday's UG Talk</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,1fcc902e-dd59-4950-96f5-9e70275d7ef0.aspx</guid>
      <link>http://chrison.net/SlidesDemosLinksForYesterdaysUGTalk.aspx</link>
      <pubDate>Fri, 09 Sep 2005 05:42:23 GMT</pubDate>
      <description>&lt;p&gt;
Although the files for this &lt;a href="http://chrison.net/TechTalkRepeatNETUGStyria.aspx"&gt;TechTalk
repeat&lt;/a&gt; are identical to the &lt;a href="http://chrison.net/TechTalkDownloads.aspx"&gt;TechTalk
downloads&lt;/a&gt;, I noticed that the download location has been&amp;nbsp;&lt;a href="http://www.microsoft.com/germany/msdn/techtalk/events/archiv.mspx#E03D0BAA"&gt;moved&lt;/a&gt;.
For your convenience, here are the direct download links to the three respective files:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.techtalk.ms/LinkClick.aspx?link=Downloads%2fTechtalkToolLinksFuerTeilnehmer.doc&amp;amp;tabid=42&amp;amp;mid=423"&gt;Aktuelle
Linkliste für alle Teilnehmer des TechTalks (Microsoft Word-Datei) (50,69 Kb)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.techtalk.ms/LinkClick.aspx?link=Downloads%2fNETDevToolsSlides.zip&amp;amp;tabid=42&amp;amp;mid=423"&gt;PowerPoint-Slide
zum Vortrag (162,09 Kb)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.techtalk.ms/LinkClick.aspx?link=Downloads%2fttdownload.zip&amp;amp;tabid=42&amp;amp;mid=423"&gt;TechTalk
Demo Files (6142,77 Kb)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=1fcc902e-dd59-4950-96f5-9e70275d7ef0" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,1fcc902e-dd59-4950-96f5-9e70275d7ef0.aspx</comments>
      <category>.NET</category>
      <category>Community</category>
      <category>Project Management</category>
      <category>this</category>
      <category>Training and Conferences</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=ee0eefc1-400a-482e-a7ed-05906a000a38</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,ee0eefc1-400a-482e-a7ed-05906a000a38.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,ee0eefc1-400a-482e-a7ed-05906a000a38.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=ee0eefc1-400a-482e-a7ed-05906a000a38</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Yesterday, I attended Kevin Cox' talk about database mirroring in SQL Server 2005.
The event was organized by the SQL Server User Group Austria in Vienna, with Peter
Koen (old UG lead) inviting Kevin, and Jaser Elmorsy (new UG lead) organizing
it. Session description for the records: <em>Database mirroring is a new SQL 2005
feature for high availability. What happens if you combine mirroring with other features,
like snapshot and clustering? This presentation will teach you the basics of database
mirroring, then will discuss some advanced topics for common solutions.</em></p>
        <p>
Kevin also pointed us to the <a href="http://blogs.msdn.com/sqlcat/">SQLCAT blog</a> -
CAT being shorthand for Microsoft SQL Server Development Customer Advisory Team. The
description as well as Kevin promised that they will be posting demanding scenarios
and solutions to those in that very blog.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=ee0eefc1-400a-482e-a7ed-05906a000a38" />
      </body>
      <title>SQLUGA: SQL Server 2005 - Database Mirroring</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,ee0eefc1-400a-482e-a7ed-05906a000a38.aspx</guid>
      <link>http://chrison.net/SQLUGASQLServer2005DatabaseMirroring.aspx</link>
      <pubDate>Tue, 06 Sep 2005 05:33:57 GMT</pubDate>
      <description>&lt;p&gt;
Yesterday, I attended Kevin Cox' talk about database mirroring in SQL Server 2005.
The event was organized by the SQL Server User Group Austria in Vienna, with Peter
Koen (old UG lead)&amp;nbsp;inviting Kevin, and Jaser Elmorsy (new UG lead) organizing
it. Session description for the records: &lt;em&gt;Database mirroring is a new SQL 2005
feature for high availability. What happens if you combine mirroring with other features,
like snapshot and clustering? This presentation will teach you the basics of database
mirroring, then will discuss some advanced topics for common solutions.&lt;/em&gt; 
&lt;/p&gt;
&lt;p&gt;
Kevin also pointed us to the &lt;a href="http://blogs.msdn.com/sqlcat/"&gt;SQLCAT blog&lt;/a&gt; -
CAT being shorthand for Microsoft SQL Server Development Customer Advisory Team. The
description as well as Kevin promised that they will be posting demanding scenarios
and solutions to those in that very blog.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=ee0eefc1-400a-482e-a7ed-05906a000a38" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,ee0eefc1-400a-482e-a7ed-05906a000a38.aspx</comments>
      <category>Community</category>
      <category>SQL Server</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=7d0370a0-c901-4785-b083-d94c2039ecd1</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,7d0370a0-c901-4785-b083-d94c2039ecd1.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,7d0370a0-c901-4785-b083-d94c2039ecd1.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=7d0370a0-c901-4785-b083-d94c2039ecd1</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
On 12th of August, the Austrian .NET community is hosting a one-day conference on
security, targeted at developers (no surprise here). The topics for <a href="http://www.dotnetcommunityconference.com/tracksandsessions.aspx?ID=7">NCC
2005 A</a> include:
</p>
        <ul>
          <li>
Threat Modeling 
</li>
          <li>
What's new in .NET 2.0 Security 
</li>
          <li>
What's new in SQL Server 2005 Security 
</li>
          <li>
What's new in Windows Vista Security</li>
        </ul>
        <p>
Quite a nice line-up I'd say. This event is supported by Microsoft Austria, so attending
this event is free, except for your time, but I am sure security does warrant a day
of your time! <a href="http://www.dotnetcommunityconference.com/abstract.aspx?ID=7">Sign
up here</a></p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=7d0370a0-c901-4785-b083-d94c2039ecd1" />
      </body>
      <title>Community-driven Security Conference in Vienna, Austria</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,7d0370a0-c901-4785-b083-d94c2039ecd1.aspx</guid>
      <link>http://chrison.net/CommunitydrivenSecurityConferenceInViennaAustria.aspx</link>
      <pubDate>Tue, 02 Aug 2005 13:27:45 GMT</pubDate>
      <description>&lt;p&gt;
On 12th of August, the Austrian .NET community is hosting a one-day conference on
security, targeted at developers (no surprise here). The topics for &lt;a href="http://www.dotnetcommunityconference.com/tracksandsessions.aspx?ID=7"&gt;NCC
2005 A&lt;/a&gt; include:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Threat Modeling 
&lt;li&gt;
What's new in .NET 2.0 Security 
&lt;li&gt;
What's new in SQL Server 2005 Security 
&lt;li&gt;
What's new in Windows Vista Security&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Quite a nice line-up I'd say. This event is supported by Microsoft Austria, so attending
this event is free, except for your time, but I am sure security does warrant a day
of your time! &lt;a href="http://www.dotnetcommunityconference.com/abstract.aspx?ID=7"&gt;Sign
up here&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=7d0370a0-c901-4785-b083-d94c2039ecd1" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,7d0370a0-c901-4785-b083-d94c2039ecd1.aspx</comments>
      <category>.NET</category>
      <category>2 Ohhhh</category>
      <category>Community</category>
      <category>Security</category>
      <category>SQL Server</category>
      <category>this</category>
      <category>Training and Conferences</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=30b39cc2-8175-4b20-938d-60148fcea6de</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,30b39cc2-8175-4b20-938d-60148fcea6de.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,30b39cc2-8175-4b20-938d-60148fcea6de.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=30b39cc2-8175-4b20-938d-60148fcea6de</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This post is again motivated by last week's Community Bootcamp on ASP.NET 2.0, the <a href="http://www.dotnetgerman.com/community/cbc05/">CBC05</a>.
I presented "Under the Covers - Exploring Internals, Page Lifecycle and the Compilation
Mode" from TechEd, using the samples that Simon Calvert provided me with (special
thanks fly out to Simon, Ben Miller and Rich Ersek @MS for providing us with material
- I know I can be a royal pain in the posterior... sometimes at least). 
</p>
        <p>
The talk included a demo of a database-backed virtual path provider (files don't come
from the file system but a database, dynamically). Somehow we started talking about
how cool it would be if you could test your Web sites without checking them out
from source control in the first place - by simply writing a virtual path provider
that goes to the repository on demand. I wrote that idea down.
</p>
        <p>
Actually, I didn't think I'd get around to doing that. But yesterday I decided to
pester one of my devs on the <a href="http://www.icsharpcode.net/OpenSource/SD/Default.aspx">#develop</a> project,
namely <a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.DanielGrunwald">Daniel
Grunwald</a>. He has implemented the <a href="http://subversion.tigris.org">Subversion</a> addin
for our 2.0 version, so he had experience with NSvn, the managed API for talking to
Subversion. I sent a stripped down version of the vpath provider to him, and asked
him to replace database code with NSvn code where appropriate.
</p>
        <p>
It didn't take long, and I had a command-line verified version back, and all I had
to do was make sure that it works with ASP.NET 2.0. There were a few problems I ran
into (like Subversion is case-sensitive and I didn't want that for the Web scenario).
Some of the issues arose simply because client and Web developers have different backgrounds.
Talk about path separators. Or directories where you have to drop assemblies.
</p>
        <p>
Now, let's stop talking, let's take a look at the provider in action:
</p>
        <p>
          <a href="http://chrison.net/content/binary/SvnVPathProvider.wmv">SvnVPathProvider.wmv
(3.76 MB)</a>
        </p>
        <p>
Want to get your hands on that DemoSiteSvn directory with the current rendition of
the SubversionVirtualPathProvider? No problem, just a couple of notes up front on
what you should be aware of:
</p>
        <ul>
          <li>
Only file names are currently treated specially for casing. Ie directories still do
react in a case sensitive way. 
</li>
          <li>
The file name cracking code needs to be reviewed. Currently, this is a quick hack. 
</li>
          <li>
appSettings need to be placed in a separate .config file. Reason is that web.config
cannot be obtained via a VirtualPathProvider, and thus this file has to be checked
out separately. And I don't want to get in the way of automating this by requiring
entries in web.config. 
</li>
          <li>
Package it as an assembly, so only the \bin folder needs to be copied to get up and
running. 
</li>
          <li>
The VirtualPathProvider requires (at the very least) anonymous access to the
repository. Passing security tokens is not implemented.</li>
        </ul>
        <p>
With those notes out of the way, thanks fly out to the ASP.NET team for providing
me with the sample of their virtual path provider in the first place. It has been
a tremendous help to get this thing off the ground. And maybe in turn this sample
will help others to get started:
</p>
        <p>
          <a href="http://chrison.net/content/binary/SvnVppDemo.zip">SvnVppDemo.zip (972.37
KB)</a>
        </p>
        <p>
          <strong>Installation note</strong>: the two DLLs in the system32 folder need to be
dropped in the respective folder of your system. Do not place them into \bin. Unless
you want to get into trouble, that is.
</p>
        <p>
What is left to say? Oh, the source code, of course! I thought you might be interested
in reading it online instead of having to download an almost 1MB-size file first.
Here it is (<em>App_Code\SubversionVirtualPathProvider.cs</em>):
</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.IO;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Collections;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Globalization;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Configuration;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Text;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Web;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Web.Util;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Web.Hosting;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Web.Caching;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> NSvn.Core;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> NSvn.Common;<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">namespace</span> ICSharpCode.Web.Providers<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> SubversionVirtualPathProvider
: VirtualPathProvider<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">#region</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> HashCodeCombiner<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">internal</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">sealed</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> HashCodeCombiner<br />
        {<br />
            <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//
Start with a seed</span><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">long</span> _combinedHash <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> 5381;<br />
            <br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">internal</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> AddLong(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">long</span> l)<br />
            {<br />
                _combinedHash <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> ((_combinedHash
&lt;&lt; 5) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> _combinedHash)
^ l;<br />
            }<br />
            <br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">internal</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> CombinedHashString<br />
            {<br />
                get<br />
                {<br />
                    <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> _combinedHash.ToString(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"x"</span>,
CultureInfo.InvariantCulture);<br />
                }<br />
            }<br />
}<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">#endregion</span><br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">#region</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> SubversionVirtualFile<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">internal</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> SubversionVirtualFile
: VirtualFile<br />
    {<br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> fullPath;<br />
        DirectoryEntry entry;<br />
            <br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span> SubversionVirtualFile(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualPath, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> fullPath,
DirectoryEntry entry)<br />
                : <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">base</span>(virtualPath)<br />
        {<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">this</span>.fullPath <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> fullPath;<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">this</span>.entry <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> entry;<br />
        }<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">override</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bool</span> IsDirectory
{<br />
            get {<br />
                <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> entry.NodeKind
== NodeKind.Directory;<br />
            }<br />
        }<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">override</span> Stream
concat()<br />
        {<br />
            Client client <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> Client();<br />
            MemoryStream
ms <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> MemoryStream();<br />
            client.Cat(ms,
fullPath, Revision.Head);<br /><br />
            <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//
.Cat closes the stream, so we have to copy it</span><br />
            MemoryStream
ms2 <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> MemoryStream(ms.GetBuffer());<br />
            ms2.Position <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">return</span> ms2;<br />
        }<br />
}<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">#endregion</span><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">static</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> AppInitialize()<br />
    {<br />
        SubversionVirtualPathProvider provider <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> SubversionVirtualPathProvider();<br />
        HostingEnvironment.RegisterVirtualPathProvider(provider);<br />
    }<br />
        <br />
    <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> GetSvnFullpath(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualPath)<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">bool</span>.Parse(ConfigurationManager.AppSettings[<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"svnvppStripVdir"</span>]))<br />
        {<br />
            <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//
this will break root Webs, StripVdir should be the default however</span><br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span> pos <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> virtualPath.IndexOf('<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">/</span>',
1);<br />
            virtualPath <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> virtualPath.Substring(pos,
virtualPath.Length <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">-</span> pos);<br />
        }<br /><br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> ConfigurationManager.AppSettings[<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"svnvppRepositoryUrl"</span>]<br />
            <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> virtualPath;<br />
        }<br /><br />
    <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> GetSvnFullpath(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualPath, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> fileName)<br />
    {<br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> FixupSvnFullpath(GetSvnFullpath(virtualPath),
fileName);<br />
    }<br /><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><font color="#000000">    </font>//
Subversion is case sensitive, this we switch the filename here</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><font color="#000000">    </font>string</span> FixupSvnFullpath(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> svnPath, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> fileName)<br />
    {<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><font color="#000000">        </font>int</span> pos <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> svnPath.LastIndexOf('<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">/</span>');<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><font color="#000000">        </font>string</span> parentDirectory <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> svnPath.Substring(0,
pos <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> 1);<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><font color="#000000">        </font>return</span> parentDirectory <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> fileName;<br />
    }<br />
        <br />
    DirectoryEntry GetEntry(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualPath)<br />
    {<br />
        Client svnClient <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> Client();<br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> fullPath <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> GetSvnFullpath(virtualPath);<br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span> pos <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> fullPath.LastIndexOf('<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">/</span>');<br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> parentDirectory <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> fullPath.Substring(0,
pos);<br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> entryName <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> fullPath.Substring(pos <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> 1);<br /><br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">try</span><br />
        {<br />
            DirectoryEntry[]
entries <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> svnClient.List(parentDirectory,
Revision.Head, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">false</span>);<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">foreach</span> (DirectoryEntry
entry <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">in</span> entries) <br />
            {   <br />
                <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> (0
== String.Compare(entry.Path, entryName, <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">return</span> entry;<br />
            }<br /><br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>;<br />
        } 
<br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">catch</span> (SvnClientException
ex) 
<br />
        {<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> (ex.ErrorCode
== 160013) <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//
parent directory not found</span><br />
                <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>;<br /><br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">throw</span>;<br />
        }<br />
    }<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">override</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bool</span> FileExists(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualPath)<br />
        {<br />
            DirectoryEntry
e <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> GetEntry(virtualPath);<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> (e
!<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 />
                <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> e.NodeKind
== NodeKind.File;<br /><br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> Previous.FileExists(virtualPath);<br />
        }<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">override</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bool</span> DirectoryExists(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualDir)<br />
        {<br />
            DirectoryEntry
e <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> GetEntry(virtualDir);<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> (e
!<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 />
                <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> e.NodeKind
== NodeKind.Directory;<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> Previous.FileExists(virtualDir);<br />
        }<br />
        <br />
        <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//
Obtain the file. This will only be called if the hash that we return is</span><br />
        <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//
different than that the runtime holds on to as a cached indicator.</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">override</span> VirtualFile
GetFile(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualPath)<br />
        {<br />
            DirectoryEntry
e <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> GetEntry(virtualPath);<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> (e
!<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 />
                <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> SubversionVirtualFile(virtualPath,
GetSvnFullpath(virtualPath, e.Path), e);<br />
            <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//
Default to the previous implementation</span><br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> Previous.GetFile(virtualPath);<br />
        }<br />
        <br />
        <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
///////////////////////////////////////////////////////////////</span><br />
        <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
Return a hash value indicating a key to test this file and dependencies have not been</span><br />
        <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
modified</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">override</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> GetFileHash(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualPath,
IEnumerable virtualPathDependencies)<br />
        {<br />
            HashCodeCombiner
hashCodeCombiner <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> HashCodeCombiner();<br />
            <br />
            ArrayList
unrecognizedDependencies <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> ArrayList();<br />
            <br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">foreach</span> (<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualDependency <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">in</span> virtualPathDependencies)<br />
            {<br />
                DirectoryEntry
e <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> GetEntry(virtualDependency);<br />
                <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> (e
!<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 />
                    hashCodeCombiner.AddLong(e.Size);<br />
                    hashCodeCombiner.AddLong(e.CreatedRevision);<br />
                } <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">else</span> {<br />
                    unrecognizedDependencies.Add(unrecognizedDependencies);<br />
                }<br />
            }<br />
            <br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> result <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> hashCodeCombiner.CombinedHashString;<br />
            <br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> (unrecognizedDependencies.Count
&gt; 0)<br />
            {<br />
                result
+= Previous.GetFileHash(virtualPath, unrecognizedDependencies);<br />
            }<br />
            <br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> result;<br />
        }<br />
        <br />
        <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
///////////////////////////////////////////////////////////////</span><br />
        <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
The cache dependency is a specialized object that means that the runtime</span><br />
        <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
can perform file monitoring and change notifications directly</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">override</span> CacheDependency
GetCacheDependency(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualPath,
IEnumerable virtualPathDependencies, DateTime utcStart)<br />
        {<br />
            <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//
This VPP does not create CacheDependencies</span><br />
            DirectoryEntry
e <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> GetEntry(virtualPath);<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> (e
!<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 />
                <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>;<br />
            <br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> Previous.GetCacheDependency(virtualPath,
virtualPathDependencies, utcStart);<br />
        }<br />
    }<br />
}<br /></span>
        </p>
        <p>
 
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=30b39cc2-8175-4b20-938d-60148fcea6de" />
      </body>
      <title>Writing a Subversion-backed VirtualPathProvider for ASP.NET 2.0</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,30b39cc2-8175-4b20-938d-60148fcea6de.aspx</guid>
      <link>http://chrison.net/WritingASubversionbackedVirtualPathProviderForASPNET20.aspx</link>
      <pubDate>Wed, 27 Jul 2005 06:18:56 GMT</pubDate>
      <description>&lt;p&gt;
This post is again motivated by last week's Community Bootcamp on ASP.NET 2.0, the &lt;a href="http://www.dotnetgerman.com/community/cbc05/"&gt;CBC05&lt;/a&gt;.
I presented "Under the Covers - Exploring Internals, Page Lifecycle and the Compilation
Mode" from TechEd, using the samples that Simon Calvert provided me with (special
thanks fly out to Simon, Ben Miller and Rich Ersek @MS for providing us with material
- I know I can be a royal pain in the posterior... sometimes at least). 
&lt;/p&gt;
&lt;p&gt;
The talk included a demo of a database-backed virtual path provider (files don't come
from the file system but a database, dynamically). Somehow we started talking about
how cool it would&amp;nbsp;be if you could test your Web sites without checking them out
from source control in the first place - by simply writing a virtual path provider
that goes to the repository on demand. I wrote that idea down.
&lt;/p&gt;
&lt;p&gt;
Actually, I didn't think I'd get around to doing that. But yesterday I decided to
pester one of my devs on the &lt;a href="http://www.icsharpcode.net/OpenSource/SD/Default.aspx"&gt;#develop&lt;/a&gt; project,
namely &lt;a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.DanielGrunwald"&gt;Daniel
Grunwald&lt;/a&gt;. He has implemented the &lt;a href="http://subversion.tigris.org"&gt;Subversion&lt;/a&gt; addin
for our 2.0 version, so he had experience with NSvn, the managed API for talking to
Subversion. I sent a stripped down version of the vpath provider to him, and asked
him to replace database code with NSvn code where appropriate.
&lt;/p&gt;
&lt;p&gt;
It didn't take long, and I had a command-line verified version back, and all I had
to do was make sure that it works with ASP.NET 2.0. There were a few problems I ran
into (like Subversion is case-sensitive and I didn't want that for the Web scenario).
Some of the issues arose simply because client and Web developers have different backgrounds.
Talk about path separators. Or directories where you have to drop assemblies.
&lt;/p&gt;
&lt;p&gt;
Now, let's stop talking, let's take a look at the provider in action:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/SvnVPathProvider.wmv"&gt;SvnVPathProvider.wmv
(3.76 MB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Want to get your hands on that DemoSiteSvn directory with the current rendition of
the SubversionVirtualPathProvider? No problem, just a couple of notes up front on
what you should be aware of:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Only file names are currently treated specially for casing. Ie directories still do
react in a case sensitive way. 
&lt;li&gt;
The file name cracking code needs to be reviewed. Currently, this is a quick hack. 
&lt;li&gt;
appSettings need to be placed in a separate .config file. Reason is that web.config
cannot be obtained via a VirtualPathProvider, and thus this file has to be checked
out separately. And I don't want to get in the way of automating this by requiring
entries in web.config. 
&lt;li&gt;
Package it as an assembly, so only the \bin folder needs to be copied to get up and
running. 
&lt;li&gt;
The VirtualPathProvider requires (at the very least)&amp;nbsp;anonymous access to the
repository. Passing security tokens is not implemented.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
With those notes out of the way, thanks fly out to the ASP.NET team for providing
me with the sample of their virtual path provider in the first place. It has been
a tremendous help to get this thing off the ground. And maybe in turn this sample
will help others to get started:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/SvnVppDemo.zip"&gt;SvnVppDemo.zip (972.37
KB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Installation note&lt;/strong&gt;: the two DLLs in the system32 folder need to be
dropped in the respective folder of your system. Do not place them into \bin. Unless
you want to get into trouble, that is.
&lt;/p&gt;
&lt;p&gt;
What is left to say? Oh, the source code, of course! I thought you might be interested
in reading it online instead of having to download an almost 1MB-size file first.
Here it is (&lt;em&gt;App_Code\SubversionVirtualPathProvider.cs&lt;/em&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;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.IO;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Collections;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Globalization;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Configuration;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Text;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Web;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Web.Util;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Web.Hosting;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Web.Caching;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; NSvn.Core;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; NSvn.Common;&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;namespace&lt;/span&gt; ICSharpCode.Web.Providers&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; SubversionVirtualPathProvider
: VirtualPathProvider&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;#region&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; HashCodeCombiner&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;internal&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;sealed&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; HashCodeCombiner&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
Start with a seed&lt;/span&gt;
&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;private&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;long&lt;/span&gt; _combinedHash &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; 5381;&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;&amp;nbsp;&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;internal&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; AddLong(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;long&lt;/span&gt; l)&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;&amp;nbsp;{&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_combinedHash &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; ((_combinedHash
&amp;lt;&amp;lt; 5) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; _combinedHash)
^ l;&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;&amp;nbsp;}&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;&amp;nbsp;&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;internal&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; CombinedHashString&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;&amp;nbsp;{&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; _combinedHash.ToString(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"x"&lt;/span&gt;,
CultureInfo.InvariantCulture);&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;&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;&amp;nbsp;&amp;nbsp;&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;#endregion&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;#region&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; SubversionVirtualFile&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;internal&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; SubversionVirtualFile
: VirtualFile&lt;br&gt;
&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;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; fullPath;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DirectoryEntry entry;&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;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; SubversionVirtualFile(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualPath, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; fullPath,
DirectoryEntry entry)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;: &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;base&lt;/span&gt;(virtualPath)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;this&lt;/span&gt;.fullPath &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; fullPath;&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;this&lt;/span&gt;.entry &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; entry;&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;&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;&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;override&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt; IsDirectory
{&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;&amp;nbsp;get {&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; entry.NodeKind
== NodeKind.Directory;&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;&amp;nbsp;}&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;&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;&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;override&lt;/span&gt; Stream
concat()&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Client client &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; Client();&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;&amp;nbsp;MemoryStream
ms &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; MemoryStream();&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;&amp;nbsp;client.Cat(ms,
fullPath, Revision.Head);&lt;br&gt;
&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
.Cat closes the stream, so we have to copy it&lt;/span&gt;
&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;&amp;nbsp;MemoryStream
ms2 &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; MemoryStream(ms.GetBuffer());&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;&amp;nbsp;ms2.Position &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; 0;&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; ms2;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;#endregion&lt;/span&gt;
&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;static&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; AppInitialize()&lt;br&gt;
&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;SubversionVirtualPathProvider provider &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; SubversionVirtualPathProvider();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HostingEnvironment.RegisterVirtualPathProvider(provider);&lt;br&gt;
&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;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; GetSvnFullpath(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualPath)&lt;br&gt;
&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;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt;.Parse(ConfigurationManager.AppSettings[&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"svnvppStripVdir"&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;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
this will break root Webs, StripVdir should be the default however&lt;/span&gt;
&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt; pos &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; virtualPath.IndexOf('&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;/&lt;/span&gt;',
1);&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;&amp;nbsp;virtualPath &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; virtualPath.Substring(pos,
virtualPath.Length &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;-&lt;/span&gt; pos);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; ConfigurationManager.AppSettings[&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"svnvppRepositoryUrl"&lt;/span&gt;]&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; virtualPath;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; GetSvnFullpath(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualPath, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; fileName)&lt;br&gt;
&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;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; FixupSvnFullpath(GetSvnFullpath(virtualPath),
fileName);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;//
Subversion is case sensitive, this we switch the filename here&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;string&lt;/span&gt; FixupSvnFullpath(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; svnPath, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; fileName)&lt;br&gt;
&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;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;int&lt;/span&gt; pos &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; svnPath.LastIndexOf('&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;/&lt;/span&gt;');&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;string&lt;/span&gt; parentDirectory &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; svnPath.Substring(0,
pos &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; 1);&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;return&lt;/span&gt; parentDirectory &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; fileName;&lt;br&gt;
&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;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DirectoryEntry GetEntry(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualPath)&lt;br&gt;
&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;Client svnClient &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; Client();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; fullPath &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; GetSvnFullpath(virtualPath);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt; pos &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; fullPath.LastIndexOf('&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;/&lt;/span&gt;');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; parentDirectory &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; fullPath.Substring(0,
pos);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; entryName &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; fullPath.Substring(pos &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; 1);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;try&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;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DirectoryEntry[]
entries &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; svnClient.List(parentDirectory,
Revision.Head, &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;foreach&lt;/span&gt; (DirectoryEntry
entry &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;in&lt;/span&gt; entries)&amp;nbsp;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (0
== String.Compare(entry.Path, entryName, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;true&lt;/span&gt;))&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; entry;&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;&amp;nbsp;}&lt;br&gt;
&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&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;&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;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;catch&lt;/span&gt; (SvnClientException
ex) 
&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (ex.ErrorCode
== 160013) &lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
parent directory not found&lt;/span&gt;
&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&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;
&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;throw&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;
&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;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;override&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt; FileExists(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualPath)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DirectoryEntry
e &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; GetEntry(virtualPath);&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (e
!&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; e.NodeKind
== NodeKind.File;&lt;br&gt;
&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; Previous.FileExists(virtualPath);&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;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;override&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt; DirectoryExists(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualDir)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DirectoryEntry
e &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; GetEntry(virtualDir);&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (e
!&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; e.NodeKind
== NodeKind.Directory;&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; Previous.FileExists(virtualDir);&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;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
Obtain the file. This will only be called if the hash that we return is&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
different than that the runtime holds on to as a cached indicator.&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;override&lt;/span&gt; VirtualFile
GetFile(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualPath)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DirectoryEntry
e &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; GetEntry(virtualPath);&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (e
!&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; SubversionVirtualFile(virtualPath,
GetSvnFullpath(virtualPath, e.Path), e);&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
Default to the previous implementation&lt;/span&gt;
&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; Previous.GetFile(virtualPath);&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;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
///////////////////////////////////////////////////////////////&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
Return a hash value indicating a key to test this file and dependencies have not been&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
modified&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;override&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; GetFileHash(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualPath,
IEnumerable virtualPathDependencies)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HashCodeCombiner
hashCodeCombiner &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; HashCodeCombiner();&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;&amp;nbsp;&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;&amp;nbsp;ArrayList
unrecognizedDependencies &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; ArrayList();&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;&amp;nbsp;&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;foreach&lt;/span&gt; (&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualDependency &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;in&lt;/span&gt; virtualPathDependencies)&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;&amp;nbsp;{&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DirectoryEntry
e &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; GetEntry(virtualDependency);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (e
!&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hashCodeCombiner.AddLong(e.Size);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hashCodeCombiner.AddLong(e.CreatedRevision);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;else&lt;/span&gt; {&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unrecognizedDependencies.Add(unrecognizedDependencies);&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;&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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; result &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; hashCodeCombiner.CombinedHashString;&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;&amp;nbsp;&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (unrecognizedDependencies.Count
&amp;gt; 0)&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;&amp;nbsp;{&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result
+= Previous.GetFileHash(virtualPath, unrecognizedDependencies);&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;&amp;nbsp;}&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;&amp;nbsp;&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; result;&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;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
///////////////////////////////////////////////////////////////&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
The cache dependency is a specialized object that means that the runtime&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
can perform file monitoring and change notifications directly&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;override&lt;/span&gt; CacheDependency
GetCacheDependency(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualPath,
IEnumerable virtualPathDependencies, DateTime utcStart)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
This VPP does not create CacheDependencies&lt;/span&gt;
&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;&amp;nbsp;DirectoryEntry
e &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; GetEntry(virtualPath);&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;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (e
!&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&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;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; Previous.GetCacheDependency(virtualPath,
virtualPathDependencies, utcStart);&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;}&lt;br&gt;
}&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://chrison.net/aggbug.ashx?id=30b39cc2-8175-4b20-938d-60148fcea6de" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,30b39cc2-8175-4b20-938d-60148fcea6de.aspx</comments>
      <category>2 Ohhhh</category>
      <category>ASP.NET</category>
      <category>Community</category>
      <category>Subversion</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=2b89a7a2-8d20-404b-8aba-008c6fe26e8d</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,2b89a7a2-8d20-404b-8aba-008c6fe26e8d.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,2b89a7a2-8d20-404b-8aba-008c6fe26e8d.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=2b89a7a2-8d20-404b-8aba-008c6fe26e8d</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">The registration for this year's <a href="http://www.dotnetcommunityconference.com/">.NET
Community Conference</a> in Austria went live today (<a href="http://www.dotnetcommunityconference.com/abstract.aspx?ID=7">register
here</a>, it's free). The thread of this years rendition is security: threat modeling,
.NET 2.0 security features, SQL Server 2005 security and more. Definitely worth your
time, if you have time to spare, join us on 12th of August in Vienna!<img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=2b89a7a2-8d20-404b-8aba-008c6fe26e8d" /></body>
      <title>NCC 2005 A</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,2b89a7a2-8d20-404b-8aba-008c6fe26e8d.aspx</guid>
      <link>http://chrison.net/NCC2005A.aspx</link>
      <pubDate>Tue, 26 Jul 2005 13:37:13 GMT</pubDate>
      <description>The registration for this year's &lt;a href="http://www.dotnetcommunityconference.com/"&gt;.NET
Community Conference&lt;/a&gt; in Austria went live today (&lt;a href="http://www.dotnetcommunityconference.com/abstract.aspx?ID=7"&gt;register
here&lt;/a&gt;, it's free). The thread of this years rendition is security: threat modeling,
.NET 2.0 security features, SQL Server 2005 security and more. Definitely worth your
time, if you have time to spare, join us on 12th of August in Vienna!&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=2b89a7a2-8d20-404b-8aba-008c6fe26e8d" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,2b89a7a2-8d20-404b-8aba-008c6fe26e8d.aspx</comments>
      <category>Community</category>
      <category>Security</category>
      <category>this</category>
      <category>Training and Conferences</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=c776faf3-471f-43f7-b19e-cdc0dcadff99</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,c776faf3-471f-43f7-b19e-cdc0dcadff99.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,c776faf3-471f-43f7-b19e-cdc0dcadff99.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=c776faf3-471f-43f7-b19e-cdc0dcadff99</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
On Friday, it was my turn as speaker at the <a href="http://www.dotnetgerman.com/community/cbc05/">Community
Bootcamp 2005</a> aka <a href="http://www.dotnetgerman.com/community/cbc05/">CBC05</a>.
One of the topics at hand was "The Provider Model", with a focus on Membership providers.
Those are the ones most likely being extended / written from scratch, and we did an
exercise in that very area: Extend the SqlMembershipProvider to audit successful and
failed logins similar to *nix. The solution I present today is a streamlined solution
programmed by Alexander Schoeppl, one of the attendees.
</p>
        <p>
          <strong>Step 1: Create the table</strong>
        </p>
        <pre>CREATE TABLE [dbo].[myLoginAuditing](<br />
 [username] [varchar](255) NOT NULL,<br />
 [numberofSuccessfulLogins] [int] NOT NULL,<br />
 [numberofFailedLogins] [int] NOT NULL,<br />
 [lastFailedLogin] [datetime] NOT NULL,<br />
 [lastFailedLoginIP] [varchar](15) NOT NULL)</pre>
        <p>
          <strong>Step 2: Create the stored procedure</strong>
        </p>
        <pre>create procedure myLogUserVisit(<br />
  @username as Varchar(255), 
<br />
  @success as int,<br />
  @lastfailedLoginIP as varchar(15))<br />
as<br />
   IF ( EXISTS ( SELECT username<br />
                 
FROM   dbo.myLoginAuditing<br />
                 
WHERE  username = @username ) )<br />
    BEGIN<br />
    if (@success = 1)<br />
    Begin<br />
      update myLoginAuditing set 
<br />
numberofSuccessfulLogins = numberofSuccessfulLogins + 1 
<br />
        where username = @username<br />
    End<br />
    else<br />
    begin<br />
      update myLoginAuditing set 
<br />
numberofFailedLogins = numberofFailedLogins + 1,<br />
                   
lastFailedLogin = GetDate(),<br />
                   
lastfailedLoginIP = @lastFailedLoginIP<br />
        where username = @username<br />
    end<br />
  END<br />
  ELSE<br />
  BEGIN<br />
    if (@success = 1)<br />
    Begin<br />
      insert into myLoginAuditing (username, numberofSuccessfulLogins, 
<br />
numberoffailedlogins, lastfailedlogin, lastfailedloginip) 
<br />
values (@username, 1, 0, '01.01.1900', '')<br />
    End<br />
    else<br />
    begin<br />
      insert into myLoginAuditing (username, numberofSuccessfulLogins, 
<br />
numberoffailedlogins, lastfailedlogin, lastfailedloginip) 
<br />
values (@username, 0, 1, GetDate(), @lastfailedLoginIP)<br />
    end    
<br />
  END<br /></pre>
        <p>
Alexander did a smart thing - he looked at the various aspnet* sp's.
</p>
        <p>
          <strong>Step 3: Write the Membership provider</strong>
        </p>
        <p>
The class skeleton looks like this:
</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">public</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> MyMembershipProvider
: SqlMembershipProvider 
<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">override</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bool</span> ValidateUser(<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 />
}<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">override</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> Initialize(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> name,
System.Collections.Specialized.NameValueCollection config)<br />
{<br />
}<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">override</span> MembershipUser
GetUser(<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">bool</span> userIsOnline)<br />
{<br />
}<br />
}<br /></span>
        </p>
        <p>
Initialize is the easy but essential part - we need the connection string name for
later:
</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">private</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> connectionStringName;<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">override</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> Initialize(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> name,
System.Collections.Specialized.NameValueCollection config)<br />
{<br />
connectionStringName <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> config[<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"connectionStringName"</span>];<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">base</span>.Initialize(name,
config);<br />
}</span>
        </p>
        <p>
Now we can validate the user - well, the base class does that. We only do the auditing
part:
</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">public</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">override</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bool</span> ValidateUser(<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 />
HttpContext.Current.Trace.Write(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"ValidateUser:entry"</span>);<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bool</span> bSuccess <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">base</span>.ValidateUser(username,
password);<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> connectionString <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;<br /><br />
SqlConnection conn <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> SqlConnection(connectionString);<br />
SqlCommand cmd <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> SqlCommand(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"exec
myLogUserVisit @username, @success, @IP"</span>, conn);<br /><br />
cmd.Parameters.AddWithValue(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"@username"</span>,
username);<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> (bSuccess) 
<br />
  cmd.Parameters.AddWithValue(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"@success"</span>,
1);<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">else</span><br />
  cmd.Parameters.AddWithValue(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"@success"</span>,
0);<br /><br />
cmd.Parameters.AddWithValue(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"@IP"</span>,
HttpContext.Current.Request.UserHostAddress);<br /><br />
conn.Open();<br />
cmd.ExecuteNonQuery();<br />
conn.Close();<br /><br />
HttpContext.Current.Trace.Write(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"ValidateUser:exit"</span>);<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> bSuccess;<br />
}</span>
        </p>
        <p>
          <strong>Step 4: Set it up - web.config</strong>
        </p>
        <pre>  &lt;appSettings/&gt;<br />
  &lt;connectionStrings&gt;<br />
    &lt;add name="MyNWind" connectionString="Data Source=cbc05vpc\cbc05;Initial
Catalog=Northwind;User=sa;Password=P@ssw0rd"/&gt;<br />
  &lt;/connectionStrings&gt;<br />
  
<br />
  &lt;system.web&gt;<br />
    &lt;membership defaultProvider="SuperDuperMSProv"&gt;<br />
      &lt;providers&gt;<br />
        &lt;clear/&gt;<br />
        &lt;add name="SuperDuperMSProv" connectionStringName="MyNWind"
type="MyMembershipProvider"/&gt;<br />
      &lt;/providers&gt;<br />
    &lt;/membership&gt;</pre>
        <p>
          <strong>Step 5: View the auditing information - default.aspx.cs</strong>
        </p>
        <p>
The final "UI" looks like this:
</p>
        <img src="http://chrison.net/content/binary/cbc05membershipprovider.png" border="0" />
        <p>
The source code is rather simple:
</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">void</span> Page_Load(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">object</span> sender,
EventArgs e)<br />
{<br />
MyMembershipUser currentUser <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> (MyMembershipUser)Membership.GetUser();<br /><br />
Label1.Text <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> currentUser.FullName;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> lcConnection <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> ConfigurationManager.ConnectionStrings[<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"MyNWind"</span>].ConnectionString;<br /><br />
SqlConnection conn <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> SqlConnection(lcConnection);<br /><br />
SqlCommand cmd <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> SqlCommand(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"select
* from myLoginAuditing where username=@username"</span>, conn);<br />
cmd.Parameters.AddWithValue(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"@Username"</span>,
currentUser.UserName);<br /><br />
conn.Open();<br /><br />
SqlDataReader reader <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> cmd.ExecuteReader();<br /><br />
GridView1.DataSource <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> reader;<br />
GridView1.DataBind();<br /><br />
reader.Close();<br />
conn.Close();<br />
}</span>
        </p>
        <p>
Done. By the way, did you notice something? Right! Alexander never fell into the trap
of SQL Injection.
</p>
        <p>
          <a href="http://chrison.net/content/binary/ExtendingMembershipProviderDemo.zip">ExtendingMembershipProviderDemo.zip
(5.64 KB)</a>
        </p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=c776faf3-471f-43f7-b19e-cdc0dcadff99" />
      </body>
      <title>Adding auditing capabilities to SqlMembershipProvider</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,c776faf3-471f-43f7-b19e-cdc0dcadff99.aspx</guid>
      <link>http://chrison.net/AddingAuditingCapabilitiesToSqlMembershipProvider.aspx</link>
      <pubDate>Mon, 25 Jul 2005 17:46:16 GMT</pubDate>
      <description>&lt;p&gt;
On Friday, it was my turn as speaker at the &lt;a href="http://www.dotnetgerman.com/community/cbc05/"&gt;Community
Bootcamp 2005&lt;/a&gt; aka &lt;a href="http://www.dotnetgerman.com/community/cbc05/"&gt;CBC05&lt;/a&gt;.
One of the topics at hand was "The Provider Model", with a focus on Membership providers.
Those are the ones most likely being extended / written from scratch, and we did an
exercise in that very area: Extend the SqlMembershipProvider to audit successful and
failed logins similar to *nix. The solution I present today is a streamlined solution
programmed by Alexander Schoeppl, one of the attendees.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Step 1: Create the table&lt;/strong&gt;
&lt;/p&gt;
&lt;pre&gt;CREATE TABLE [dbo].[myLoginAuditing](&lt;br&gt;
&amp;nbsp;[username] [varchar](255) NOT NULL,&lt;br&gt;
&amp;nbsp;[numberofSuccessfulLogins] [int] NOT NULL,&lt;br&gt;
&amp;nbsp;[numberofFailedLogins] [int] NOT NULL,&lt;br&gt;
&amp;nbsp;[lastFailedLogin] [datetime] NOT NULL,&lt;br&gt;
&amp;nbsp;[lastFailedLoginIP] [varchar](15) NOT NULL)&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Step 2: Create the stored procedure&lt;/strong&gt;
&lt;/p&gt;
&lt;pre&gt;create procedure myLogUserVisit(&lt;br&gt;
&amp;nbsp; @username as Varchar(255), 
&lt;br&gt;
&amp;nbsp; @success as int,&lt;br&gt;
&amp;nbsp; @lastfailedLoginIP as varchar(15))&lt;br&gt;
as&lt;br&gt;
&amp;nbsp;&amp;nbsp; IF ( EXISTS ( SELECT 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
FROM&amp;nbsp;&amp;nbsp; dbo.myLoginAuditing&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
WHERE&amp;nbsp; username = @username ) )&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (@success = 1)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Begin&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; update myLoginAuditing set 
&lt;br&gt;
numberofSuccessfulLogins = numberofSuccessfulLogins + 1 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where username = @username&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; update myLoginAuditing set 
&lt;br&gt;
numberofFailedLogins = numberofFailedLogins + 1,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
lastFailedLogin = GetDate(),&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
lastfailedLoginIP = @lastFailedLoginIP&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where username = @username&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br&gt;
&amp;nbsp; END&lt;br&gt;
&amp;nbsp; ELSE&lt;br&gt;
&amp;nbsp; BEGIN&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (@success = 1)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Begin&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert into myLoginAuditing (username, numberofSuccessfulLogins, 
&lt;br&gt;
numberoffailedlogins, lastfailedlogin, lastfailedloginip) 
&lt;br&gt;
values (@username, 1, 0, '01.01.1900', '')&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert into myLoginAuditing (username, numberofSuccessfulLogins, 
&lt;br&gt;
numberoffailedlogins, lastfailedlogin, lastfailedloginip) 
&lt;br&gt;
values (@username, 0, 1, GetDate(), @lastfailedLoginIP)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; end&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp; END&lt;br&gt;
&lt;/pre&gt;
&lt;p&gt;
Alexander did a smart thing - he looked at the various aspnet* sp's.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Step 3: Write the Membership provider&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
The class skeleton looks like this:
&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;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; MyMembershipProvider
: SqlMembershipProvider 
&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;override&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt; ValidateUser(&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;
{&lt;br&gt;
}&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;override&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; Initialize(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; name,
System.Collections.Specialized.NameValueCollection config)&lt;br&gt;
{&lt;br&gt;
}&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;override&lt;/span&gt; MembershipUser
GetUser(&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;bool&lt;/span&gt; userIsOnline)&lt;br&gt;
{&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Initialize is the easy but essential part - we need the connection string name for
later:
&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;private&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; connectionStringName;&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;override&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; Initialize(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; name,
System.Collections.Specialized.NameValueCollection config)&lt;br&gt;
{&lt;br&gt;
connectionStringName &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; config[&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"connectionStringName"&lt;/span&gt;];&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;base&lt;/span&gt;.Initialize(name,
config);&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Now we can validate the user - well, the base class does that. We only do the auditing
part:
&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;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;override&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt; ValidateUser(&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;
{&lt;br&gt;
HttpContext.Current.Trace.Write(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"ValidateUser:entry"&lt;/span&gt;);&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt; bSuccess &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;base&lt;/span&gt;.ValidateUser(username,
password);&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; connectionString &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;&lt;br&gt;
&lt;br&gt;
SqlConnection conn &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; SqlConnection(connectionString);&lt;br&gt;
SqlCommand cmd &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; SqlCommand(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"exec
myLogUserVisit @username, @success, @IP"&lt;/span&gt;, conn);&lt;br&gt;
&lt;br&gt;
cmd.Parameters.AddWithValue(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"@username"&lt;/span&gt;,
username);&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (bSuccess) 
&lt;br&gt;
&amp;nbsp; cmd.Parameters.AddWithValue(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"@success"&lt;/span&gt;,
1);&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;else&lt;/span&gt; 
&lt;br&gt;
&amp;nbsp; cmd.Parameters.AddWithValue(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"@success"&lt;/span&gt;,
0);&lt;br&gt;
&lt;br&gt;
cmd.Parameters.AddWithValue(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"@IP"&lt;/span&gt;,
HttpContext.Current.Request.UserHostAddress);&lt;br&gt;
&lt;br&gt;
conn.Open();&lt;br&gt;
cmd.ExecuteNonQuery();&lt;br&gt;
conn.Close();&lt;br&gt;
&lt;br&gt;
HttpContext.Current.Trace.Write(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"ValidateUser:exit"&lt;/span&gt;);&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; bSuccess;&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Step 4: Set it up - web.config&lt;/strong&gt;
&lt;/p&gt;
&lt;pre&gt;&amp;nbsp; &amp;lt;appSettings/&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;connectionStrings&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add name="MyNWind" connectionString="Data Source=cbc05vpc\cbc05;Initial
Catalog=Northwind;User=sa;Password=P@ssw0rd"/&amp;gt;&lt;br&gt;
&amp;nbsp; &amp;lt;/connectionStrings&amp;gt;&lt;br&gt;
&amp;nbsp; 
&lt;br&gt;
&amp;nbsp; &amp;lt;system.web&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;membership defaultProvider="SuperDuperMSProv"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;providers&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;clear/&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add name="SuperDuperMSProv" connectionStringName="MyNWind"
type="MyMembershipProvider"/&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/providers&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/membership&amp;gt;&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Step 5: View the auditing information - default.aspx.cs&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
The final "UI" looks like this:
&lt;/p&gt;
&lt;img src="http://chrison.net/content/binary/cbc05membershipprovider.png" border=0&gt; 
&lt;p&gt;
The source code is rather simple:
&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;protected&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; Page_Load(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;object&lt;/span&gt; sender,
EventArgs e)&lt;br&gt;
{&lt;br&gt;
MyMembershipUser currentUser &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; (MyMembershipUser)Membership.GetUser();&lt;br&gt;
&lt;br&gt;
Label1.Text &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; currentUser.FullName;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; lcConnection &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; ConfigurationManager.ConnectionStrings[&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"MyNWind"&lt;/span&gt;].ConnectionString;&lt;br&gt;
&lt;br&gt;
SqlConnection conn &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; SqlConnection(lcConnection);&lt;br&gt;
&lt;br&gt;
SqlCommand cmd &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; SqlCommand(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"select
* from myLoginAuditing where username=@username"&lt;/span&gt;, conn);&lt;br&gt;
cmd.Parameters.AddWithValue(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"@Username"&lt;/span&gt;,
currentUser.UserName);&lt;br&gt;
&lt;br&gt;
conn.Open();&lt;br&gt;
&lt;br&gt;
SqlDataReader reader &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; cmd.ExecuteReader();&lt;br&gt;
&lt;br&gt;
GridView1.DataSource &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; reader;&lt;br&gt;
GridView1.DataBind();&lt;br&gt;
&lt;br&gt;
reader.Close();&lt;br&gt;
conn.Close();&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Done. By the way, did you notice something? Right! Alexander never fell into the trap
of SQL Injection.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/ExtendingMembershipProviderDemo.zip"&gt;ExtendingMembershipProviderDemo.zip
(5.64 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=c776faf3-471f-43f7-b19e-cdc0dcadff99" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,c776faf3-471f-43f7-b19e-cdc0dcadff99.aspx</comments>
      <category>2 Ohhhh</category>
      <category>ASP.NET</category>
      <category>Community</category>
      <category>Security</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=bd304e5c-645c-44cd-9f3c-5c7b5e9c4b7f</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,bd304e5c-645c-44cd-9f3c-5c7b5e9c4b7f.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,bd304e5c-645c-44cd-9f3c-5c7b5e9c4b7f.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=bd304e5c-645c-44cd-9f3c-5c7b5e9c4b7f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">The German .NET community's July event,
the <a href="http://www.dotnetgerman.com/Community/CBC05/">ASP.NET 2.0 Community Boot
Camp</a> aka <a href="http://www.dotnetgerman.com/Community/CBC05/">CBC05</a> is now
fully booked! It feels absolutely great that we (<a href="http://www.dotnetgerman.com/Community/CBC05/Speaker.aspx">speakers</a> are
almost exclusively <a href="http://mvp.support.microsoft.com/Default.aspx">MVPs</a>)
were able to organize a five day training event on ASP.NET 2.0 by the community for
the community. See you in Bad Ischl in July!<img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=bd304e5c-645c-44cd-9f3c-5c7b5e9c4b7f" /></body>
      <title>Community Bootcamp 2005 Fully Booked</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,bd304e5c-645c-44cd-9f3c-5c7b5e9c4b7f.aspx</guid>
      <link>http://chrison.net/CommunityBootcamp2005FullyBooked.aspx</link>
      <pubDate>Sun, 26 Jun 2005 09:08:55 GMT</pubDate>
      <description>The German .NET community's&amp;nbsp;July event, the &lt;a href="http://www.dotnetgerman.com/Community/CBC05/"&gt;ASP.NET
2.0 Community Boot Camp&lt;/a&gt; aka &lt;a href="http://www.dotnetgerman.com/Community/CBC05/"&gt;CBC05&lt;/a&gt; is
now fully booked! It feels absolutely great that we (&lt;a href="http://www.dotnetgerman.com/Community/CBC05/Speaker.aspx"&gt;speakers&lt;/a&gt; are
almost exclusively &lt;a href="http://mvp.support.microsoft.com/Default.aspx"&gt;MVPs&lt;/a&gt;)
were able to organize a five day training event on ASP.NET 2.0&amp;nbsp;by the community&amp;nbsp;for
the community. See you in Bad Ischl in July!&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=bd304e5c-645c-44cd-9f3c-5c7b5e9c4b7f" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,bd304e5c-645c-44cd-9f3c-5c7b5e9c4b7f.aspx</comments>
      <category>2 Ohhhh</category>
      <category>ASP.NET</category>
      <category>Community</category>
      <category>this</category>
      <category>Training and Conferences</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=33f1cbfb-6b96-4957-be5e-edc6522592fa</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,33f1cbfb-6b96-4957-be5e-edc6522592fa.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,33f1cbfb-6b96-4957-be5e-edc6522592fa.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=33f1cbfb-6b96-4957-be5e-edc6522592fa</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Details on Brian Goldfarb's blog. <a href="http://blogs.msdn.com/bgold/archive/2005/05/24/421477.aspx">Read
the announcement</a> / <a href="http://beta.asp.net">Go there</a><img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=33f1cbfb-6b96-4957-be5e-edc6522592fa" /></body>
      <title>http://beta.asp.net Launch</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,33f1cbfb-6b96-4957-be5e-edc6522592fa.aspx</guid>
      <link>http://chrison.net/httpbetaaspnetLaunch.aspx</link>
      <pubDate>Wed, 25 May 2005 21:55:01 GMT</pubDate>
      <description>Details on Brian Goldfarb's blog. &lt;a href="http://blogs.msdn.com/bgold/archive/2005/05/24/421477.aspx"&gt;Read
the announcement&lt;/a&gt;&amp;nbsp;/ &lt;a href="http://beta.asp.net"&gt;Go there&lt;/a&gt;&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=33f1cbfb-6b96-4957-be5e-edc6522592fa" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,33f1cbfb-6b96-4957-be5e-edc6522592fa.aspx</comments>
      <category>2 Ohhhh</category>
      <category>ASP.NET</category>
      <category>Community</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=3342e9f9-c7da-423a-97e8-933e6bcb136d</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,3342e9f9-c7da-423a-97e8-933e6bcb136d.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,3342e9f9-c7da-423a-97e8-933e6bcb136d.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=3342e9f9-c7da-423a-97e8-933e6bcb136d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">I'll be off to Vienna tomorrow for the
regional get-together. Camera is charging right next to me...<img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=3342e9f9-c7da-423a-97e8-933e6bcb136d" /></body>
      <title>Regional MVP Get-Together, Vienna</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,3342e9f9-c7da-423a-97e8-933e6bcb136d.aspx</guid>
      <link>http://chrison.net/RegionalMVPGetTogetherVienna.aspx</link>
      <pubDate>Thu, 28 Apr 2005 13:36:27 GMT</pubDate>
      <description>I'll be off to Vienna tomorrow for the regional get-together. Camera is charging right next to me...&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=3342e9f9-c7da-423a-97e8-933e6bcb136d" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,3342e9f9-c7da-423a-97e8-933e6bcb136d.aspx</comments>
      <category>Community</category>
      <category>this</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=637abc97-4c14-4cbc-b62a-0ba1b6a58294</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,637abc97-4c14-4cbc-b62a-0ba1b6a58294.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,637abc97-4c14-4cbc-b62a-0ba1b6a58294.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=637abc97-4c14-4cbc-b62a-0ba1b6a58294</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">I just registered for the <a href="http://msevents-eu.microsoft.com/CUI/EventDetail.aspx?EventID=118756760&amp;Culture=de-DE">Community
Day: Indigo</a> in Munich (7th of April). Talks will be held by <a href="http://weblogs.asp.net/cweyer">Christian
Weyer</a> and <a href="http://weblogs.asp.net/dparys">Darius Parys</a>. It is free,
so sign up.<img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=637abc97-4c14-4cbc-b62a-0ba1b6a58294" /></body>
      <title>Community Day: Indigo</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,637abc97-4c14-4cbc-b62a-0ba1b6a58294.aspx</guid>
      <link>http://chrison.net/CommunityDayIndigo.aspx</link>
      <pubDate>Thu, 10 Mar 2005 01:37:56 GMT</pubDate>
      <description>I just registered for the &lt;a href="http://msevents-eu.microsoft.com/CUI/EventDetail.aspx?EventID=118756760&amp;amp;Culture=de-DE"&gt;Community
Day: Indigo&lt;/a&gt; in Munich (7th of April).&amp;nbsp;Talks will be held by &lt;a href="http://weblogs.asp.net/cweyer"&gt;Christian
Weyer&lt;/a&gt; and &lt;a href="http://weblogs.asp.net/dparys"&gt;Darius Parys&lt;/a&gt;. It is free,
so sign up.&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=637abc97-4c14-4cbc-b62a-0ba1b6a58294" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,637abc97-4c14-4cbc-b62a-0ba1b6a58294.aspx</comments>
      <category>.NET</category>
      <category>Community</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=3f5f3789-88e4-41de-8374-e344a6e01bd9</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,3f5f3789-88e4-41de-8374-e344a6e01bd9.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,3f5f3789-88e4-41de-8374-e344a6e01bd9.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=3f5f3789-88e4-41de-8374-e344a6e01bd9</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Carsten and I just returned from a Web Developer Meeting of the <a href="http://www.netda.net/">.NET
Developers Association</a>. For us, building forty is just a block away, so we decided
to sit in on <a href="http://www.reliablesoftware.com/">Michael Stiefel</a>'s talk
on <a href="http://msdn.microsoft.com/architecture/soa/default.aspx">SOA</a>. You
can download the presentation and source code <a href="http://www.reliablesoftware.com/presentations.html">here</a>.
</p>
        <p>
Michael (who still remembered me from a book publishing summit waaay back) recommended
that we (as in all attendees) check out the Metropolis Webcasts: <em>Pat Helland relates
the evolution of technology architectures to the evolution of city planning and shows
us how far we have yet to go.</em></p>
        <ul>
          <li>
            <a href="http://msdn.microsoft.com/seminar/shared/asp/view.asp?url=/architecture/media/en/metrov2_part1/manifest.xml">Metropolis
: Envisioning the Service-Oriented Enterprise (Part 1)</a> <em>In this part,
Pat introduces the Metropolis analogy.</em></li>
          <li>
            <a href="http://msdn.microsoft.com/seminar/shared/asp/view.asp?url=/architecture/media/en/metrov2_part2/manifest.xml">Metropolis
: Envisioning the Service-Oriented Enterprise (Part 2)</a> <em>In this part,
Pat introduces the concept of services.</em></li>
          <li>
            <a href="http://msdn.microsoft.com/seminar/shared/asp/view.asp?url=/architecture/media/en/metrov2_part3/manifest.xml">Metropolis
: Envisioning the Service-Oriented Enterprise (Part 3)</a> <em>In this part,
Pat describes the guidance provided by the Metropolis analogy</em></li>
        </ul>
        <p>
The Microsoft Architect Journal also has an article on <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnmaj/html/aj2metrop.asp">Metropolis</a>. 
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=3f5f3789-88e4-41de-8374-e344a6e01bd9" />
      </body>
      <title>.NET DA: Securing Service Oriented Architecture (SOA) with Microsoft's WSE 2.0</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,3f5f3789-88e4-41de-8374-e344a6e01bd9.aspx</guid>
      <link>http://chrison.net/NETDASecuringServiceOrientedArchitectureSOAWithMicrosoftsWSE20.aspx</link>
      <pubDate>Tue, 08 Mar 2005 05:28:48 GMT</pubDate>
      <description>&lt;p&gt;
Carsten and I just returned from a Web Developer Meeting of the &lt;a href="http://www.netda.net/"&gt;.NET
Developers Association&lt;/a&gt;. For us, building forty is just a block away, so we decided
to sit in on &lt;a href="http://www.reliablesoftware.com/"&gt;Michael Stiefel&lt;/a&gt;'s talk
on &lt;a href="http://msdn.microsoft.com/architecture/soa/default.aspx"&gt;SOA&lt;/a&gt;. You
can download the presentation and source code &lt;a href="http://www.reliablesoftware.com/presentations.html"&gt;here&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Michael (who still remembered me from a book publishing summit waaay back) recommended
that we (as in all attendees) check out the Metropolis Webcasts: &lt;em&gt;Pat Helland relates
the evolution of technology architectures to the evolution of city planning and shows
us how far we have yet to go.&lt;/em&gt; 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://msdn.microsoft.com/seminar/shared/asp/view.asp?url=/architecture/media/en/metrov2_part1/manifest.xml"&gt;Metropolis
: Envisioning the Service-Oriented Enterprise (Part 1)&lt;/a&gt;&amp;nbsp;&lt;em&gt;In this part,
Pat introduces the Metropolis analogy.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://msdn.microsoft.com/seminar/shared/asp/view.asp?url=/architecture/media/en/metrov2_part2/manifest.xml"&gt;Metropolis
: Envisioning the Service-Oriented Enterprise (Part 2)&lt;/a&gt;&amp;nbsp;&lt;em&gt;In this part,
Pat introduces the concept of services.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://msdn.microsoft.com/seminar/shared/asp/view.asp?url=/architecture/media/en/metrov2_part3/manifest.xml"&gt;Metropolis
: Envisioning the Service-Oriented Enterprise (Part 3)&lt;/a&gt;&amp;nbsp;&lt;em&gt;In this part,
Pat describes the guidance provided by the Metropolis analogy&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The Microsoft Architect Journal also has an article on &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnmaj/html/aj2metrop.asp"&gt;Metropolis&lt;/a&gt;. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=3f5f3789-88e4-41de-8374-e344a6e01bd9" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,3f5f3789-88e4-41de-8374-e344a6e01bd9.aspx</comments>
      <category>.NET</category>
      <category>Community</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=3ccb116a-8290-4169-9937-606430bb5dc9</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,3ccb116a-8290-4169-9937-606430bb5dc9.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,3ccb116a-8290-4169-9937-606430bb5dc9.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=3ccb116a-8290-4169-9937-606430bb5dc9</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In my spare time (ok, some might argue about my definition of "spare time") I run
the German ASP and .NET mailing lists, and my official title there is Bastard Listmaster
from Hell (BLfH for short; me and my assistant have a <a href="http://www.himmelherrgottsakramentzefixhallelujascheissglumpatverreckts.com/">German-language
blog</a> too). 
</p>
        <p>
That's not quite the point though. Both the assistant and himself are also tester
on the <a href="http://www.icsharpcode.net/opensource/sd/">#develop project</a>, which
led to the usual team Ts. Those were available for quite some time, but the shop language
was German - but now Spreadshirt enabled us to switch to English, and the <a href="http://blfhshop.spreadshirt.de/">BLfH
shop</a> is now open for international business. Next task: add a cool T-shirt for <a href="http://codefairway.net">.NET
Golf</a>. Oh, btw, a new hole starts today at 4pm CET, German-speaking programmers
welcome!
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=3ccb116a-8290-4169-9937-606430bb5dc9" />
      </body>
      <title>BLfH Shop</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,3ccb116a-8290-4169-9937-606430bb5dc9.aspx</guid>
      <link>http://chrison.net/BLfHShop.aspx</link>
      <pubDate>Wed, 09 Feb 2005 07:56:27 GMT</pubDate>
      <description>&lt;p&gt;
In my spare time (ok, some might argue about my definition of "spare time") I run
the German ASP and .NET mailing lists, and my official title there is Bastard Listmaster
from Hell (BLfH for short; me and my assistant have a &lt;a href="http://www.himmelherrgottsakramentzefixhallelujascheissglumpatverreckts.com/"&gt;German-language
blog&lt;/a&gt; too). 
&lt;/p&gt;
&lt;p&gt;
That's not quite the point though. Both the assistant and himself are also tester
on the &lt;a href="http://www.icsharpcode.net/opensource/sd/"&gt;#develop project&lt;/a&gt;, which
led to the usual team Ts. Those were available for quite some time, but the shop language
was German - but now Spreadshirt enabled us to switch to English, and the &lt;a href="http://blfhshop.spreadshirt.de/"&gt;BLfH
shop&lt;/a&gt; is now open for international business. Next task: add a cool T-shirt for &lt;a href="http://codefairway.net"&gt;.NET
Golf&lt;/a&gt;. Oh, btw, a new hole starts today at 4pm CET, German-speaking programmers
welcome!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=3ccb116a-8290-4169-9937-606430bb5dc9" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,3ccb116a-8290-4169-9937-606430bb5dc9.aspx</comments>
      <category>Community</category>
      <category>this</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=02bbd6b2-ee57-4705-95cc-867699ca0ad6</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,02bbd6b2-ee57-4705-95cc-867699ca0ad6.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,02bbd6b2-ee57-4705-95cc-867699ca0ad6.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=02bbd6b2-ee57-4705-95cc-867699ca0ad6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This year's community wintercamp is over - we had two great days spanning three days.
Included here are only two photos - one from Friday's evening "Bratl in der Rein"
in the restaurant Moststadl in Ebensee, and the second one from Saturday's skiing
in the Dachstein West resort. 
</p>
        <p>
          <img src="http://chrison.net/content/binary/wintercamp05friday.JPG" alt="Friday" width="400" height="460" />
        </p>
        <img src="http://chrison.net/content/binary/wintercamp05scenery.JPG" alt="Saturday" width="600" height="450" />
        <p>
        </p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=02bbd6b2-ee57-4705-95cc-867699ca0ad6" />
      </body>
      <title>Community Wintercamp 2005 is over</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,02bbd6b2-ee57-4705-95cc-867699ca0ad6.aspx</guid>
      <link>http://chrison.net/CommunityWintercamp2005IsOver.aspx</link>
      <pubDate>Sun, 30 Jan 2005 18:29:41 GMT</pubDate>
      <description>&lt;p&gt;
This year's community wintercamp is over - we had two great days spanning three days.
Included here are only two photos - one from Friday's evening "Bratl in der Rein"
in the restaurant Moststadl in Ebensee, and the second one from Saturday's skiing
in the Dachstein West resort. 
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/wintercamp05friday.JPG" alt="Friday" width="400" height="460"&gt;
&lt;/p&gt;
&lt;img src="http://chrison.net/content/binary/wintercamp05scenery.JPG" alt="Saturday" width="600" height="450"&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=02bbd6b2-ee57-4705-95cc-867699ca0ad6" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,02bbd6b2-ee57-4705-95cc-867699ca0ad6.aspx</comments>
      <category>Community</category>
      <category>this</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=111d1aec-ecd5-4841-bcd8-23ce2e87ed8e</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,111d1aec-ecd5-4841-bcd8-23ce2e87ed8e.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,111d1aec-ecd5-4841-bcd8-23ce2e87ed8e.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=111d1aec-ecd5-4841-bcd8-23ce2e87ed8e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Next Friday, the German <a href="http://www.aspgerman.com/">ASP</a> and <a href="http://www.dotnetgerman.com/">.NET</a> communities
will converge in Bad Ischl, Austria, for their annual non-technical meeting: the <a href="http://www.aspgerman.com/listentreffen/wintercamp2005/">Community
Wintercamp 2005</a>. On the agenda, so to speak: skiing, sledging, local hospitality
(not to mix up with local hospitals!) and a lesson in beer brewing as well as consumption.
It looks like the weather is very, very kind to us too: snow all over the place and
it'll keep snowing for the next few days. Hooray!
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=111d1aec-ecd5-4841-bcd8-23ce2e87ed8e" />
      </body>
      <title>One Week...</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,111d1aec-ecd5-4841-bcd8-23ce2e87ed8e.aspx</guid>
      <link>http://chrison.net/OneWeek.aspx</link>
      <pubDate>Fri, 21 Jan 2005 11:44:21 GMT</pubDate>
      <description>&lt;p&gt;
Next Friday, the German &lt;a href="http://www.aspgerman.com/"&gt;ASP&lt;/a&gt; and &lt;a href="http://www.dotnetgerman.com/"&gt;.NET&lt;/a&gt; communities
will converge in Bad Ischl, Austria, for their annual non-technical meeting: the &lt;a href="http://www.aspgerman.com/listentreffen/wintercamp2005/"&gt;Community
Wintercamp 2005&lt;/a&gt;.&amp;nbsp;On the agenda, so to speak: skiing, sledging, local hospitality
(not to mix up with local hospitals!) and a lesson in beer brewing as well as consumption.
It looks like the weather is very, very kind to us too: snow all over the place and
it'll keep snowing for the next few days. Hooray!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=111d1aec-ecd5-4841-bcd8-23ce2e87ed8e" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,111d1aec-ecd5-4841-bcd8-23ce2e87ed8e.aspx</comments>
      <category>Community</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=4bdffce6-4d2a-444f-9961-2f4bc760326d</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,4bdffce6-4d2a-444f-9961-2f4bc760326d.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,4bdffce6-4d2a-444f-9961-2f4bc760326d.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=4bdffce6-4d2a-444f-9961-2f4bc760326d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://blogs.dotnetgerman.com/rackechs/">Bernhard</a> came back from the
holidays with a great idea for our next hole of .NET Golf on the <a href="http://codefairway.net/de/">code
fairway</a> (currently only German, but we do plan to offer the fairway to non-German
communities). We have ironed out the details, and come up with a test implementation together
with <a href="http://www.icsharpcode.net/pub/relations/krueger.aspx">Mike</a> (of <a href="http://www.icsharpcode.net/opensource/sd/">#develop</a> fame).
Hopefully, we'll (<a href="http://blogs.dotnetgerman.com/alexonasp.net/">Alex</a>,
that is) also be able to get the automated tester up and running for this hole. In
closing: this time, we do have a grand prize for the winner!
</p>
        <p>
So, if you are German speaking and an avid .NET programmer, come join us on the <a href="http://codefairway.net/de/">fairway</a>!
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=4bdffce6-4d2a-444f-9961-2f4bc760326d" />
      </body>
      <title>Upcoming: our next hole on the code fairway</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,4bdffce6-4d2a-444f-9961-2f4bc760326d.aspx</guid>
      <link>http://chrison.net/UpcomingOurNextHoleOnTheCodeFairway.aspx</link>
      <pubDate>Sun, 16 Jan 2005 16:17:45 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://blogs.dotnetgerman.com/rackechs/"&gt;Bernhard&lt;/a&gt; came back from the
holidays with a great idea for our next hole of .NET Golf on the &lt;a href="http://codefairway.net/de/"&gt;code
fairway&lt;/a&gt;&amp;nbsp;(currently only German, but we do plan to offer the fairway to non-German
communities). We have ironed out the details, and come up with a test implementation&amp;nbsp;together
with &lt;a href="http://www.icsharpcode.net/pub/relations/krueger.aspx"&gt;Mike&lt;/a&gt; (of &lt;a href="http://www.icsharpcode.net/opensource/sd/"&gt;#develop&lt;/a&gt; fame).
Hopefully, we'll (&lt;a href="http://blogs.dotnetgerman.com/alexonasp.net/"&gt;Alex&lt;/a&gt;,
that is) also be able to get the automated tester up and running for this hole. In
closing: this time, we do have a grand prize for the winner!
&lt;/p&gt;
&lt;p&gt;
So, if you are German speaking and an avid .NET programmer, come join us on the &lt;a href="http://codefairway.net/de/"&gt;fairway&lt;/a&gt;!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=4bdffce6-4d2a-444f-9961-2f4bc760326d" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,4bdffce6-4d2a-444f-9961-2f4bc760326d.aspx</comments>
      <category>Community</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=46b303db-d840-4d70-baa9-ecb5320a6aa6</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,46b303db-d840-4d70-baa9-ecb5320a6aa6.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,46b303db-d840-4d70-baa9-ecb5320a6aa6.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=46b303db-d840-4d70-baa9-ecb5320a6aa6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
It feels good to be no longer grounded by the doctor, especially because this means
that my Webcast next week is no longer in danger of being cancelled: ".NET development
for free with <a href="http://www.icsharpcode.net/opensource/sd/">#develop</a>" (<a href="http://www.microsoft.com/germany/msdn/webcasts/detail.aspx?id=100337">MSDN:
.NET-Entwicklung zum Nulltarif mit SharpDevelop</a> is the orginial title, because
this Webcast is in German). I will be talking about what cool things you can do with
#develop, how it was built, and what the future holds for this free (cost-wise et
al) lightweight development environment. Join Uwe and me on Monday 17th @ 4pm
(understanding German being a rather big bonus).
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=46b303db-d840-4d70-baa9-ecb5320a6aa6" />
      </body>
      <title>Next Monday: MSDN Webcast by His Chrisness</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,46b303db-d840-4d70-baa9-ecb5320a6aa6.aspx</guid>
      <link>http://chrison.net/NextMondayMSDNWebcastByHisChrisness.aspx</link>
      <pubDate>Wed, 12 Jan 2005 12:22:22 GMT</pubDate>
      <description>&lt;p&gt;
It feels good to be no longer grounded by the doctor, especially because this means
that my Webcast next week is no longer in danger of being cancelled: ".NET development
for free with &lt;a href="http://www.icsharpcode.net/opensource/sd/"&gt;#develop&lt;/a&gt;" (&lt;a href="http://www.microsoft.com/germany/msdn/webcasts/detail.aspx?id=100337"&gt;MSDN:
.NET-Entwicklung zum Nulltarif mit SharpDevelop&lt;/a&gt; is the orginial title, because
this Webcast is in German). I will be talking about what cool things you can do with
#develop, how it was built, and what the future holds for this free (cost-wise et
al)&amp;nbsp;lightweight development environment. Join Uwe and me on Monday 17th @ 4pm
(understanding German being a rather big bonus).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=46b303db-d840-4d70-baa9-ecb5320a6aa6" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,46b303db-d840-4d70-baa9-ecb5320a6aa6.aspx</comments>
      <category>.NET</category>
      <category>Community</category>
      <category>this</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=90a9b1f3-591d-4bd2-87c1-e3460a5c7e67</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,90a9b1f3-591d-4bd2-87c1-e3460a5c7e67.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,90a9b1f3-591d-4bd2-87c1-e3460a5c7e67.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=90a9b1f3-591d-4bd2-87c1-e3460a5c7e67</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I simply couldn't resist: Yes, I am again|still <a href="http://mvp.support.microsoft.com/">MVP</a> for
Visual Developer - ASP/ASP.NET. Admittedly, this doesn't quite reflect on this
blog for a couple of reasons, the main one being that my MVP-worthyness stems from
the time I do (bad pun intended) on German mailing lists and Web sites (see "Deutsche
Resourcen" in the left-hand navigation bar to get an idea). In other news, I of course
don't do community because of the award - it is a really nice recognition of
my work on part of MS, and there of course is one  benefit of the MVP award that
stands out: getting access to other community people around the globe as well as MS
product teams, which allows me to get better information to my communities.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=90a9b1f3-591d-4bd2-87c1-e3460a5c7e67" />
      </body>
      <title>MVP Award Awarded Again</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,90a9b1f3-591d-4bd2-87c1-e3460a5c7e67.aspx</guid>
      <link>http://chrison.net/MVPAwardAwardedAgain.aspx</link>
      <pubDate>Wed, 05 Jan 2005 08:59:29 GMT</pubDate>
      <description>&lt;p&gt;
I simply couldn't resist: Yes, I am again|still &lt;a href="http://mvp.support.microsoft.com/"&gt;MVP&lt;/a&gt; for
Visual Developer - ASP/ASP.NET. Admittedly, this&amp;nbsp;doesn't quite reflect on this
blog for a couple of reasons, the main one being that my MVP-worthyness stems from
the time I do (bad pun intended) on German mailing lists and Web sites (see "Deutsche
Resourcen" in the left-hand navigation bar to get an idea). In other news, I of course
don't do community because of the award -&amp;nbsp;it is a really nice recognition of
my work on part of MS, and there of course is one &amp;nbsp;benefit of the MVP award that
stands out: getting access to other community people around the globe as well as MS
product teams, which allows me to get better information to my communities.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=90a9b1f3-591d-4bd2-87c1-e3460a5c7e67" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,90a9b1f3-591d-4bd2-87c1-e3460a5c7e67.aspx</comments>
      <category>Community</category>
      <category>this</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=3ce4f4ca-ddd8-4598-8348-afac99e046df</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,3ce4f4ca-ddd8-4598-8348-afac99e046df.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,3ce4f4ca-ddd8-4598-8348-afac99e046df.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=3ce4f4ca-ddd8-4598-8348-afac99e046df</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Last week I did a three day course for <a href="http://weblogs.asp.net/Peter_Koen">Peter</a>'s <a href="http://www.sqlexperts.at/">Sql
Server User Group Austria</a> (SSUGA). The reason it is part of the Summer Academy
is that it originally was scheduled for summer, but I got the slot which ended up
colliding with about everybody's holiday plans - so we decided to reschedule, and
last week it finally happened (right smack when the snowfalls started... so much for
the title).
</p>
        <p>
What did we cover? Well, obviously not everything of <a href="http://chrison.net/PermaLink,guid,c864cf6f-50a3-42ba-be44-1fdd23f50caa.aspx">the
advanced stuff I planned</a>, however we did get the basics covered very well, so
we could build on that for DAAB, <a href="http://www.ericjsmith.net/codesmith/">CodeSmith</a> and <a href="http://www.olymars.net/">Olymars</a>.
For the German-speaking among my blog readers, a more detailed course outline follows
(like I said earlier, we did cover almost everything):
</p>
        <p>
"Dieser Kurs richtet sich an professionelle Entwickler die für das Design und
die Entwicklung von Daten-zentrierten, verteilten Applikationen verantwortlich sind.
Teilnehmer haben bereits Erfahrung mit Visual Studio .NET 2003, bevorzugt im Bereich
der Webapplikationsentwicklung. Die Kursbeispiele werden in C# präsentiert, die
verwendete Datenbank ist die MSDE.
</p>
        <p>
In diesem Kurs werden disconnected (DataSet) als auch connected Szenarien des ADO.NET
Datenbankzugriff-APIs behandelt. Ebenso kommt XML Integration nicht zu kurz, Data
Binding, Transaktionen sowie architekturelle Themen.
</p>
        <p>
Inhalte:
</p>
        <ul>
          <li>
ADO.NET Grundlagen / Architektur 
</li>
          <li>
Connected Szenarien 
</li>
          <li>
Disconnected Szenarien 
</li>
          <li>
Data Binding in WebForms and WinForms 
</li>
          <li>
DataSet/XML Integration, Typisierte DataSets 
</li>
          <li>
Design von Data Tier Komponenten, durchreichen von Daten über Tiers 
</li>
          <li>
Arbeiten mit dem SQL Server Centric .NET Code Generator 
</li>
          <li>
Provider Model Design Pattern"</li>
        </ul>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=3ce4f4ca-ddd8-4598-8348-afac99e046df" />
      </body>
      <title>SSUGA "Summer" Academy: ADO.NET, 16th - 18th November</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,3ce4f4ca-ddd8-4598-8348-afac99e046df.aspx</guid>
      <link>http://chrison.net/SSUGASummerAcademyADONET16th18thNovember.aspx</link>
      <pubDate>Mon, 22 Nov 2004 18:55:39 GMT</pubDate>
      <description>&lt;p&gt;
Last week I did a three day course for &lt;a href="http://weblogs.asp.net/Peter_Koen"&gt;Peter&lt;/a&gt;'s &lt;a href="http://www.sqlexperts.at/"&gt;Sql
Server User Group Austria&lt;/a&gt; (SSUGA). The reason it is part of the Summer Academy
is that it originally was scheduled for summer, but I got the slot which ended up
colliding with about everybody's holiday plans - so we decided to reschedule, and
last week it finally happened (right smack when the snowfalls started... so much for
the title).
&lt;/p&gt;
&lt;p&gt;
What did we cover? Well, obviously not everything of &lt;a href="http://chrison.net/PermaLink,guid,c864cf6f-50a3-42ba-be44-1fdd23f50caa.aspx"&gt;the
advanced stuff I planned&lt;/a&gt;, however we did get the basics covered very well, so
we could build on that for DAAB, &lt;a href="http://www.ericjsmith.net/codesmith/"&gt;CodeSmith&lt;/a&gt; and &lt;a href="http://www.olymars.net/"&gt;Olymars&lt;/a&gt;.
For the German-speaking among my blog readers, a more detailed course outline follows
(like I said earlier, we did cover almost everything):
&lt;/p&gt;
&lt;p&gt;
"Dieser Kurs richtet sich an professionelle Entwickler die f&amp;#252;r das Design und
die Entwicklung von Daten-zentrierten, verteilten Applikationen verantwortlich sind.
Teilnehmer haben bereits Erfahrung mit Visual Studio .NET 2003, bevorzugt im Bereich
der Webapplikationsentwicklung. Die Kursbeispiele werden in C# pr&amp;#228;sentiert, die
verwendete Datenbank ist die MSDE.
&lt;/p&gt;
&lt;p&gt;
In diesem Kurs werden disconnected (DataSet) als auch connected Szenarien des ADO.NET
Datenbankzugriff-APIs behandelt. Ebenso kommt XML Integration nicht zu kurz, Data
Binding, Transaktionen sowie architekturelle Themen.
&lt;/p&gt;
&lt;p&gt;
Inhalte:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
ADO.NET Grundlagen / Architektur 
&lt;li&gt;
Connected Szenarien 
&lt;li&gt;
Disconnected Szenarien 
&lt;li&gt;
Data Binding in WebForms and WinForms 
&lt;li&gt;
DataSet/XML Integration, Typisierte DataSets 
&lt;li&gt;
Design von Data Tier Komponenten, durchreichen von Daten &amp;#252;ber Tiers 
&lt;li&gt;
Arbeiten mit dem SQL Server Centric .NET Code Generator 
&lt;li&gt;
Provider Model Design Pattern"&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=3ce4f4ca-ddd8-4598-8348-afac99e046df" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,3ce4f4ca-ddd8-4598-8348-afac99e046df.aspx</comments>
      <category>Community</category>
      <category>Training and Conferences</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=800856c3-d8ef-4a0d-a581-a9b6e40e83c2</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,800856c3-d8ef-4a0d-a581-a9b6e40e83c2.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,800856c3-d8ef-4a0d-a581-a9b6e40e83c2.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=800856c3-d8ef-4a0d-a581-a9b6e40e83c2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This week Microsoft invited quite a few community influencers (I totally hate it when
someone uses the term "community leader") to meet in Barcelona. Tuesday at the airport,
I met my fellow Austrians <a href="http://weblogs.asp.net/cnagel/">Christian Nagel</a> (INETA,
Regional Director) and <a href="http://www.thinktecture.com/staff/ingo/weblog/">Ingo
Rammer</a> (Regional Director, MVP). As they were doing a presentation on community
Wednesday afternoon, we decided to find ourselves a nice cafeteria and let creativity
flow to add more "juice" to the slides (photos to follow: Ingo, Christian).
</p>
        <p>
          <img height="467" src="http://chrison.net/content/binary/bcn0402.jpg" width="350" border="0" />
        </p>
        <p>
          <img height="467" src="http://chrison.net/content/binary/bcn0403.jpg" width="350" border="0" />
        </p>
        <p>
Being in the community (see "Deutsche Resourcen" in the blogroll sidebar) for quite
a long time, I was able to provide input into what makes communities tick - online
as well as offline.
</p>
        <p>
In case you were wondering how far we'd go to find a cafeteria - it was visible in
the background of Ingo:
</p>
        <p>
          <img height="291" src="http://chrison.net/content/binary/bcn0401.jpg" width="350" border="0" />
        </p>
        <p>
Before continuing with the scheduled program, one view from the hotel:
</p>
        <p>
          <img height="467" src="http://chrison.net/content/binary/bcn0404.jpg" width="350" border="0" />
        </p>
        <p>
Nice view. But we didn't come for the nice view, nice weather and hospitality. We
came for providing input to various community issues and initiatives. And that we
have done - the good, the bad and the ugly (they were asking for it). Hopefully it
helps to shape the efforts of Microsoft in a way that creates maximum momentum for
communities without any side effects - admittedly a very optimum scenario, but hey,
we are optimists, otherwise we wouldn't spend time for community.
</p>
        <p>
Aside from various discussion points on community, there is one conclusion I'd single
out as most important that I came back with from the event: Dear community influencers,
don't get suckered into the future-only drive. .NET 1.1 is exciting. Communicate that
message. Just because you have mastered (to a degree) .NET 1.1 doesn't mean it is
boring and the entire world has to wait for vNext holding their breath - repeat after
me: .NET 1.1 IS EXCITING!
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=800856c3-d8ef-4a0d-a581-a9b6e40e83c2" />
      </body>
      <title>Connect Event, Barcelona, 20. - 21. October</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,800856c3-d8ef-4a0d-a581-a9b6e40e83c2.aspx</guid>
      <link>http://chrison.net/ConnectEventBarcelona2021October.aspx</link>
      <pubDate>Sat, 23 Oct 2004 17:21:26 GMT</pubDate>
      <description>&lt;p&gt;
This week Microsoft invited quite a few community influencers (I totally hate it when
someone uses the term "community leader") to meet in Barcelona. Tuesday at the airport,
I met my fellow Austrians &lt;a href="http://weblogs.asp.net/cnagel/"&gt;Christian Nagel&lt;/a&gt; (INETA,
Regional Director) and &lt;a href="http://www.thinktecture.com/staff/ingo/weblog/"&gt;Ingo
Rammer&lt;/a&gt; (Regional Director, MVP). As they were doing a presentation on community
Wednesday afternoon, we decided to find ourselves a nice cafeteria and let creativity
flow to add more "juice" to the slides (photos to follow: Ingo, Christian).
&lt;/p&gt;
&lt;p&gt;
&lt;img height=467 src="http://chrison.net/content/binary/bcn0402.jpg" width=350 border=0&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img height=467 src="http://chrison.net/content/binary/bcn0403.jpg" width=350 border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Being in the community (see "Deutsche Resourcen" in the blogroll sidebar) for quite
a long time, I was able to provide input into what makes communities tick - online
as well as offline.
&lt;/p&gt;
&lt;p&gt;
In case you were wondering how far we'd go to find a cafeteria - it was visible in
the background of Ingo:
&lt;/p&gt;
&lt;p&gt;
&lt;img height=291 src="http://chrison.net/content/binary/bcn0401.jpg" width=350 border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Before continuing with the scheduled program, one view from the hotel:
&lt;/p&gt;
&lt;p&gt;
&lt;img height=467 src="http://chrison.net/content/binary/bcn0404.jpg" width=350 border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Nice view. But we didn't come for the nice view, nice weather and hospitality. We
came for providing input to various community issues and initiatives. And that we
have done - the good, the bad and the ugly (they were asking for it). Hopefully it
helps to shape the efforts of Microsoft in a way that creates maximum momentum for
communities without any side effects - admittedly a very optimum scenario, but hey,
we are optimists, otherwise we wouldn't spend time for community.
&lt;/p&gt;
&lt;p&gt;
Aside from various discussion points on community, there is one conclusion I'd single
out as most important that I came back with from the event: Dear community influencers,
don't get suckered into the future-only drive. .NET 1.1 is exciting. Communicate that
message. Just because you have mastered (to a degree) .NET 1.1 doesn't mean it is
boring and the entire world has to wait for vNext holding their breath - repeat after
me: .NET 1.1 IS EXCITING!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=800856c3-d8ef-4a0d-a581-a9b6e40e83c2" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,800856c3-d8ef-4a0d-a581-a9b6e40e83c2.aspx</comments>
      <category>Community</category>
      <category>this</category>
    </item>
  </channel>
</rss>