<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" 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:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>BizTalk</title>
        <link>http://geekswithblogs.net/TimH/category/2067.aspx</link>
        <description>BizTalk</description>
        <language>en-NZ</language>
        <copyright>Tim Huffam</copyright>
        <managingEditor>timhuffam@gmail.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <item>
            <title>Task Oriented Programming</title>
            <link>http://geekswithblogs.net/TimH/archive/2008/09/09/task-oriented-programming.aspx</link>
            <description>&lt;p&gt;For some time I've been wondering if there's a better way to program business logic.  Years ago I used to write COBOL, then moved onto a 4GL, bla bla bla... and today I find myself well entrenched in OO with Microsoft's .Net.  Development times don't seem to be much better these days - and the complexity of things seems to have mushroomed.  &lt;/p&gt;
&lt;p&gt;We went from barely-a-3GL to 4GL back to 3GL plus an explosion of things you need to consider.  We started with procedural code then moved to OO and seem to have got stuck there.  But somehow I think we need to revise our use of OO.  Business logic is predominantly procedural code - even if written in OO; it starts, follows a process, performing stuff until finished eg Customer.UpdateCreditLimit()&lt;/p&gt;
&lt;p&gt;OO is really good for modelling things - as per the classic OO examples of a bicycle or car.  And thus they model business things quite well too - like an Invoice or a Customer.  &lt;/p&gt;
&lt;p&gt;However, I've found that the more object oriented the code gets - the less productive, maintainable and flexible it becomes.  Not saying leave OO - far from it - it's brilliant.  It's just that we need to learn when to say 'when'.   The use of patterns has helped a huge amount - but these can also caused similar problems - when being applied where they aren't really needed - resulting in overly complex software (read: inflexible and unmaintainable and unproductive).  It's a fine line - and it's not easy to get the balance.&lt;/p&gt;
&lt;p&gt;A major break through in this area is &lt;a href="http://msdn.microsoft.com/en-us/library/bb397926.aspx"&gt;LINQ&lt;/a&gt;.  This has meant we have less clutter in our apps catering for ORM (brilliant).  This has resulted in code very similar to the old 4GL days (essentially 4GLs were just SQL based code anyway) - where all you care/code about is the business logic - caring not a jot about how or where a Customer or Order got created - and in this age of SOA - that becomes more important (as a Customer could come from many different sources - local RDBMS, company ERP, external CRM etc).  I guess you could say LINQ allows you to focus your code to be more domain specific (not saying it's a DSL).&lt;/p&gt;
&lt;p&gt;I have been playing with workflows for donkeys of years and found that although the individual workflow systems themselves can range from very simple to incredibly complex - the individual tasks they perform need not be.   This had lead me to start thinking about applying this principle to code design at a reasonably low level....  what if we developed tasks as objects.  Each task has just one job (I've heard some people say this is how objects 'should' be coded anyway).  It has properties that can be get/set.  Keeping things dead simple, eg:&lt;font color="#0000ff" size="2"&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt; &lt;font color="#0000ff" size="2"&gt;class&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New" color="#2b91af" size="2"&gt;AdderTask&lt;br /&gt;
&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;int&lt;/font&gt;&lt;font size="2"&gt; &lt;font color="#000000"&gt;Addend1 {&lt;/font&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;;&lt;/font&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;set&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;; }&lt;br /&gt;
&lt;/font&gt;    &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;int&lt;/font&gt;&lt;font size="2"&gt; &lt;font color="#000000"&gt;Addend2 {&lt;/font&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;;&lt;/font&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;set&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;; }&lt;/font&gt;&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;int&lt;/font&gt;&lt;font size="2"&gt; &lt;font color="#000000"&gt;Result {&lt;/font&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;;&lt;/font&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;set&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;; }&lt;/font&gt;&lt;br /&gt;
    &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; AdderTask(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;int&lt;/font&gt;&lt;font size="2"&gt; addend1, &lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New" size="2"&gt; addend2)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New" size="2"&gt;Addend1 = addend1;&lt;br /&gt;
        &lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;Addend2 = addend2;&lt;br /&gt;
    }&lt;br /&gt;
&lt;/font&gt;    &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;AdderTask&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt; &lt;/font&gt;&lt;font face="Courier New" color="#000000"&gt;Execute()&lt;br /&gt;
    &lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;{&lt;br /&gt;
        Result = Addend1 + Addend2;&lt;br /&gt;
&lt;/font&gt;        &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;this&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;font color="#000000"&gt;;&lt;br /&gt;
&lt;/font&gt;  &lt;font color="#000000"&gt;  &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New" color="#000000" size="2"&gt;}&lt;br /&gt;
}&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;To run this you'd simply do this:&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff" size="2"&gt;int&lt;/font&gt;&lt;font size="2"&gt; &lt;font color="#000000"&gt;result =&lt;/font&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;AdderTask&lt;/font&gt;&lt;font color="#000000" size="2"&gt;(1, 2).Execute().Result;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#000000" size="2"&gt;Exposing the task's properties means you can build up get and set statements - and because the Execute method returns the task object itself you can easily use it in a single line as if it was a method on it's own - or retrieve it's property values after the Execute (these tasks would easily be adapted to work within a workflow system).&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#000000" size="2"&gt;This style lends itself to expanding; rather like building blocks, you can build large workflows out of these task oriented blocks.  The workflows themselves coded just like these tasks - whereby all the business logic resides within the Execute() method.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#000000" size="2"&gt;Adding LINQ to the mix takes this to the next level - allowing you to build software that is simple to develop and understand.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#000000" size="2"&gt;I've been building a sizable system using this technique and I'm finding that I'm converting code developed using standard OO practices over to this methodology as it makes code more easily reused - but most importantly: easier to read and maintain.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;In summary:&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;font size="2"&gt;All input and output parameters should be implemented as properties (getter and setter accessors).&lt;/font&gt; &lt;/li&gt;
    &lt;li&gt;&lt;font size="2"&gt;Provide a constructor that accepts all required parameters. A default constructor (with no parameters) is optional (I've found I never need these - but if you were to use these tasks in a workflow system they may need this).&lt;/font&gt; &lt;/li&gt;
    &lt;li&gt;&lt;font size="2"&gt;Provide an Execute() method that takes no parameters and returns the object instance eg &lt;font face="Courier New"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;this&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; &lt;/li&gt;
    &lt;li&gt;&lt;font size="2"&gt;The object should clean up after itself.  &lt;/font&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;font size="2"&gt;Other notes:&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;font size="2"&gt;Originally I created a similar type of class for workflows - but I found that these ended up being no different in concept to tasks.  Likewise I've found that some tasks needed to call other tasks - so I've ended up just implementing everything as tasks.  On reflection this is actually quite valid - because, as I found when building large orchestrations using Biztalk, workflows become atomic tasks themselves when used within the context of a large orchestration (which may run many workflows and external tasks) - and the orchestration, from a highlevel could also be considered an atomic task.&lt;/font&gt; &lt;/li&gt;
    &lt;li&gt;&lt;font size="2"&gt;I've found using System.Transactions.TransactionScope great for scoping transactions around many tasks when creating a macro task that runs many sub tasks.&lt;/font&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Suggestions/comments very welcome - I'd like others to expand or comment on this.&lt;/p&gt;
&lt;p&gt;&lt;font color="#000000" size="2"&gt;Tim&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=125008"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=125008" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/TimH/aggbug/125008.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tim Huffam</dc:creator>
            <guid>http://geekswithblogs.net/TimH/archive/2008/09/09/task-oriented-programming.aspx</guid>
            <pubDate>Mon, 08 Sep 2008 12:10:06 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TimH/comments/125008.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TimH/archive/2008/09/09/task-oriented-programming.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/TimH/comments/commentRss/125008.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TimH/services/trackbacks/125008.aspx</trackback:ping>
        </item>
        <item>
            <title>VS Collection Manager location.  Registering/enabling html help collections.</title>
            <link>http://geekswithblogs.net/TimH/archive/2006/07/13/85016.aspx</link>
            <description>&lt;P&gt;Use the Collection Manager to enable/disable which html help collections are available to your Visual Studio IDE (dynamic help etc).&lt;/P&gt;
&lt;P&gt;For VS.NET 2003 use: ms-help://MS.VSCC.2003/VSCCCommon/cm/CollectionManager.htm&lt;/P&gt;
&lt;P&gt;For VS2005 use: ms-help://MS.VSCC.v80/dv_vscccommon/local/CollectionManager.htm&lt;/P&gt;
&lt;P&gt;For more info see the &lt;A href="http://www.helpware.net/mshelp2/h2faq.htm#remove_a_plugin"&gt;FAQ&lt;/A&gt; at the Helpware Group's &lt;A href="http://www.helpware.net"&gt;web site&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;HTH&lt;/P&gt;
&lt;P&gt;Tim&lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=85016"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=85016" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/TimH/aggbug/85016.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tim Huffam</dc:creator>
            <guid>http://geekswithblogs.net/TimH/archive/2006/07/13/85016.aspx</guid>
            <pubDate>Wed, 12 Jul 2006 20:52:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TimH/comments/85016.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TimH/archive/2006/07/13/85016.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/TimH/comments/commentRss/85016.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TimH/services/trackbacks/85016.aspx</trackback:ping>
        </item>
        <item>
            <title>Case insensitive XPath</title>
            <link>http://geekswithblogs.net/TimH/archive/2006/07/06/84229.aspx</link>
            <description>&lt;P&gt;XPath statements are case sensitive.&amp;nbsp; To get around this use the following example to convert all data to lower case before performing the equality check:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;/bookstore/book[translate(@category, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '" + searchtext.ToLower() + "']&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Thanks very much&amp;nbsp;to &lt;A href="http://geekswithblogs.net/ranganh/archive/2005/09/12/53520.aspx"&gt;Harish&lt;/A&gt; for this!&lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=84229"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=84229" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/TimH/aggbug/84229.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tim Huffam</dc:creator>
            <guid>http://geekswithblogs.net/TimH/archive/2006/07/06/84229.aspx</guid>
            <pubDate>Wed, 05 Jul 2006 23:01:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TimH/comments/84229.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TimH/archive/2006/07/06/84229.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/TimH/comments/commentRss/84229.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TimH/services/trackbacks/84229.aspx</trackback:ping>
        </item>
        <item>
            <title>Error (m_safeCertContext is an invalid handle.) when accessing a client certificate using .NET 2.0/VS2005 </title>
            <link>http://geekswithblogs.net/TimH/archive/2006/04/18/75477.aspx</link>
            <description>&lt;P&gt;This error (m_safeCertContext is an invalid handle.) occurs when you try to access a client cert (or a member of the cert) from a ASP.NET 2.0 application developed using VS2005 eg:&lt;/P&gt;&lt;FONT color=#008080&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#008080&gt;X509Certificate&lt;/FONT&gt; cert = &lt;FONT color=#0000ff&gt;new&lt;/FONT&gt; &lt;FONT color=#008080&gt;X509Certificate&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;(Request.ClientCertificate.Certificate);&lt;BR&gt;&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt; certSerial =&amp;nbsp;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;cert.GetSerialNumberString();&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;The error is thrown because no valid certificate is found.&amp;nbsp; This can be caused by either:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;A problem with the cert.&amp;nbsp; A common reason for this in a development environment is one of the cert properties differing from that of the environment eg&amp;nbsp;cert common name does not match the site name.&amp;nbsp; I guess this would also occur if the cert had expired.&lt;/LI&gt;
&lt;LI&gt;The cert did not get passed to the request.&amp;nbsp; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;If the cert has not been passed to the request.&amp;nbsp; Then it's probably because you've not setup the website to be able to accept certs.&amp;nbsp; To do this you need to do the following:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Host the project from IIS - not the thin web server that is bundled with VS2005.&lt;/LI&gt;
&lt;OL&gt;
&lt;LI&gt;From within VS2005 select File - New Web Site.&lt;/LI&gt;
&lt;LI&gt;Select the Location of HTTP then enter the path eg: &lt;A href="http://localhost/MyWebSite"&gt;http://localhost/MyWebSite&lt;/A&gt;.&amp;nbsp; Note that you don't have to use HTTPS just yet (I find it easier for development to use HTTP then when deploying to UAT or Production to use HTTPS).&lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;Code up a test form.&lt;/LI&gt;
&lt;LI&gt;Go into IIS Admin - right click on the new app (MyWebSite) and select Properties.&lt;/LI&gt;
&lt;LI&gt;On the Directory Security tab, click Edit... under 'Secure communications'.&lt;/LI&gt;
&lt;LI&gt;Make sure 'Accept client certificates' is checked.&lt;/LI&gt;
&lt;LI&gt;When you&amp;nbsp;run your app - make sure you use HTTPS in the url eg: &lt;A href="https://localhost/MyWebSite"&gt;https://localhost/MyWebSite&lt;/A&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;A href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=232760&amp;amp;SiteID=1"&gt;Here's&lt;/A&gt; another article about&amp;nbsp;this.&lt;/P&gt;
&lt;P&gt;HTH&lt;/P&gt;
&lt;P&gt;Tim&lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=75477"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=75477" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/TimH/aggbug/75477.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tim Huffam</dc:creator>
            <guid>http://geekswithblogs.net/TimH/archive/2006/04/18/75477.aspx</guid>
            <pubDate>Tue, 18 Apr 2006 01:58:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TimH/comments/75477.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TimH/archive/2006/04/18/75477.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/TimH/comments/commentRss/75477.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TimH/services/trackbacks/75477.aspx</trackback:ping>
        </item>
        <item>
            <title>Log4Net - writing to windows event log with ASP.NET</title>
            <link>http://geekswithblogs.net/TimH/archive/2006/04/13/75063.aspx</link>
            <description>&lt;P&gt;I found that there were a couple of things required to get this working - over and above the samples shown &lt;A href="http://logging.apache.org/log4net/release/config-examples.html#eventlogappender"&gt;here&lt;/A&gt;.&amp;nbsp; &lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;To initialize Log4Net and to tell it to load it's configuration from the web.config file add the following line to the &lt;FONT face="Courier New" size=2&gt;Application_Start&lt;/FONT&gt; method within Global.aspx:&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;log4net.Config.XmlConfigurator.Configure();&lt;/FONT&gt; &lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;To make sure all unhandled exceptions are logged add the following line to the Application_Error method within Global.aspx:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT face="Courier New" color=#0000ff size=2&gt;Log.Fatal("An uncaught exception occurred", this.Server.GetLastError());&lt;BR&gt;&lt;/FONT&gt;For this to work you'll need to define the Log member eg:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT face="Courier New" color=#0000ff size=2&gt;private static ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);&lt;BR&gt;&lt;/FONT&gt;will also need to add the following so you can access the Log4Net and reflection classes:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT face="Courier New" color=#0000ff size=2&gt;using log4net;&lt;BR&gt;&lt;FONT face="Times New Roman" color=#000000 size=3&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;using System.Reflection;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;Add code in your app to write logs - this is done the same way as step 2 (define a Log member and use one of it's log writing methods eg Log.Info(), Log.Warn(), Log.Error() and Log.Fatal().&amp;nbsp;&amp;nbsp; These writing methods take a string and/or and exception as input parameters.&lt;/LI&gt;
&lt;LI&gt;Register your app with the event log.&amp;nbsp; You can do this either with an installer or manually (ie code it using the System.Diagnostics.EventLog.CreateEventSource() method).&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Add nodes within the app config file to configure Log4Net.&amp;nbsp; Note that params LogName and ApplicationName are optional (although I couldnt get it to work without at least specifying the ApplicationName - as that's what you register with the eventlog) The following is an example from a web.config (note that both the configSections and the log4net section are directly beneath the root configuration node - ie not within system.web):&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;configSections&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;section&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;name&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="log4net"&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;type&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="log4net.Config.Log4NetConfigurationSectionHandler,log4net"&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;/&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000&gt;configSections&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;log4net&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;debug&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;="false"&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;appender&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;name&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="EventLogAppender"&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;type&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;="log4net.Appender.EventLogAppender"&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;param&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;name&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="LogName"&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;value&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="MyLog"&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;param&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;name&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="ApplicationName"&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;value&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="MyApp"&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;layout&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;type&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;="log4net.Layout.PatternLayout"&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;conversionPattern&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;value&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;/&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000&gt;layout&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000&gt;appender&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;root&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;priority&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;value&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="DEBUG"&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;/&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000&gt;appender-ref&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000&gt;ref&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;="EventLogAppender"&lt;/FONT&gt;&lt;FONT color=#ff00ff&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000&gt;root&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;lt;/&lt;/FONT&gt;&lt;FONT color=#800000&gt;log4net&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;&amp;gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#000000 size=3&gt;
&lt;P&gt;&lt;STRONG&gt;Additional Resources:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Tom Gilki has written a good article explaining basic use of Log4Net found &lt;A href="http://tom.gilki.org/programming/net/120604/"&gt;here&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;If you are having security problems writing to the event log have a look at MS's solution &lt;A href="http://support.microsoft.com/default.aspx?scid=kb;en-us;329291"&gt;here&lt;/A&gt;&amp;nbsp;or my solution &lt;A href="http://geekswithblogs.net/timh/archive/2005/10/05/56029.aspx"&gt;here&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;Scott Colestock has a great article documenting how to use Log4Net with Biztalk &lt;A href="http://www.traceofthought.net/PermaLink,guid,62b858b4-d8ba-4fc4-92aa-35a4ff1ba00a.aspx"&gt;here&lt;/A&gt;&amp;nbsp;(a lot of useful info here even if you're not using Biztalk).&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;HTH&lt;/P&gt;
&lt;P&gt;Tim&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=75063"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=75063" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/TimH/aggbug/75063.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tim Huffam</dc:creator>
            <guid>http://geekswithblogs.net/TimH/archive/2006/04/13/75063.aspx</guid>
            <pubDate>Wed, 12 Apr 2006 19:48:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TimH/comments/75063.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TimH/archive/2006/04/13/75063.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/TimH/comments/commentRss/75063.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TimH/services/trackbacks/75063.aspx</trackback:ping>
        </item>
        <item>
            <title>How to determine assembly and .NET CLR runtime versions at runtime.</title>
            <link>http://geekswithblogs.net/TimH/archive/2006/03/28/73621.aspx</link>
            <description>&lt;P&gt;This really very simple, once you know how....&lt;/P&gt;
&lt;P&gt;To get the version of the currently running assembly:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000080 size=2&gt;System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();&lt;BR&gt;System.Reflection.AssemblyName assemblyName = assembly.GetName();&lt;BR&gt;Version assemblyVersion =&amp;nbsp; assemblyName.Version;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;To get the version of the CLR runtime:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#000080 size=2&gt;Version CLRVersion = Environment.Version;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=73621"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=73621" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/TimH/aggbug/73621.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tim Huffam</dc:creator>
            <guid>http://geekswithblogs.net/TimH/archive/2006/03/28/73621.aspx</guid>
            <pubDate>Tue, 28 Mar 2006 03:14:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TimH/comments/73621.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TimH/archive/2006/03/28/73621.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/TimH/comments/commentRss/73621.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TimH/services/trackbacks/73621.aspx</trackback:ping>
        </item>
        <item>
            <title>Serialization: How to serialize and deserialize using C# .NET</title>
            <link>http://geekswithblogs.net/TimH/archive/2006/02/09/68857.aspx</link>
            <description>&lt;P&gt;&lt;FONT size=2&gt;&lt;STRONG&gt;Serialize &lt;/STRONG&gt;(convert an object instance to an XML document):&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&lt;FONT face="Courier New"&gt;// Assuming obj is an instance of an object&lt;BR&gt;XmlSerializer ser = &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt; XmlSerializer(obj.GetType());&lt;BR&gt;System.Text.StringBuilder sb = new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt; System.Text.StringBuilder();&lt;BR&gt;System.IO.StringWriter writer = new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt; System.IO.StringWriter(sb);&lt;BR&gt;ser.Serialize(writer, obj);&lt;BR&gt;XmlDocument doc = new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt; XmlDocument();&lt;BR&gt;doc.LoadXml(sb.ToString());&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;STRONG&gt;Deserialize &lt;/STRONG&gt;(convert an XML document into an object instance):&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&lt;FONT face="Courier New"&gt;//Assuming doc is an XML document containing a serialized object and objType is a System.Type&amp;nbsp;set to the type of the object.&lt;BR&gt;XmlNodeReader reader = &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;new&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt; XmlNodeReader(doc.DocumentElement);&lt;BR&gt;XmlSerializer ser = new&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt; XmlSerializer(objType);&lt;BR&gt;object&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt; obj = ser.Deserialize(reader);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;// Then you just need to cast obj into whatever type it is eg:&lt;BR&gt;MyClass myObj = (MyClass)obj;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;HTH&lt;BR&gt;Tim&lt;/FONT&gt;&lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=68857"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=68857" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/TimH/aggbug/68857.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tim Huffam</dc:creator>
            <guid>http://geekswithblogs.net/TimH/archive/2006/02/09/68857.aspx</guid>
            <pubDate>Thu, 09 Feb 2006 01:59:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TimH/comments/68857.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TimH/archive/2006/02/09/68857.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/TimH/comments/commentRss/68857.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TimH/services/trackbacks/68857.aspx</trackback:ping>
        </item>
        <item>
            <title>Turning off .NET security</title>
            <link>http://geekswithblogs.net/TimH/archive/2005/12/02/61891.aspx</link>
            <description>&lt;P&gt;When you're developing .NET apps the .NET security can be a right pain in the butt, so to avoid any more head aches you can simply turn it off by using the caspol utility eg:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT face="Courier New"&gt;caspol -s off&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;While this is somewhat overkill (much like cutting your toe nails with a sythe), it certainly gets you up and running in no time.&amp;nbsp; However the problems come when you start moving from your dev platform, onto testing &amp;amp; prod environments.&amp;nbsp;&amp;nbsp; But hopefully with you'll implement a more thorough approach.&lt;/P&gt;
&lt;P&gt;This works fine for .NET 1.0/1.1, however for .NET 2.0 they have changed this so you can no longer ditch security in such a wide sweeping fashion.&amp;nbsp; Here they still allow &lt;FONT face="Courier New"&gt;'caspol -s off'&lt;/FONT&gt; however&amp;nbsp;it is only effective while the cmd shell is open.&amp;nbsp; Another method for .NET 2.0, is via the .NET Configuration tool - just update the security settings for the zone you use.&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;HTH&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;Tim&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/P&gt;&lt;/FONT&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=61891"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=61891" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/TimH/aggbug/61891.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tim Huffam</dc:creator>
            <guid>http://geekswithblogs.net/TimH/archive/2005/12/02/61891.aspx</guid>
            <pubDate>Thu, 01 Dec 2005 21:03:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TimH/comments/61891.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TimH/archive/2005/12/02/61891.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/TimH/comments/commentRss/61891.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TimH/services/trackbacks/61891.aspx</trackback:ping>
        </item>
        <item>
            <title>"Error 1308. Source file not found" occurs when installing MSDN Library</title>
            <link>http://geekswithblogs.net/TimH/archive/2005/10/19/57399.aspx</link>
            <description>&lt;P&gt;This error occurs if you try to install the MSDN library using a network or localdrive install - where you've copied the content of the CD's/ISO's into separate directories, eg:&lt;/P&gt;
&lt;P&gt;c:\msdn_2005Oct_disc1&lt;BR&gt;c:\msdn_2005Oct_disc2&lt;BR&gt;c:\msdn_2005Oct_disc3&lt;/P&gt;
&lt;P&gt;To solve this problem, copy the contents of all dirs into 1, eg just copy the Program Files directory from all other disc dirs (in this example (c:\msdn_2005Oct_disc2 &amp;amp; c:\msdn_2005Oct_disc3) into the first disc dir (c:\msdn_2005Oct_disc1).&lt;/P&gt;
&lt;P&gt;Then re-run the install frmo the first disc dir (c:\msdn_2005Oct_disc1).&lt;/P&gt;
&lt;P&gt;HTH&lt;/P&gt;
&lt;P&gt;Tim&lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=57399"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=57399" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/TimH/aggbug/57399.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tim Huffam</dc:creator>
            <guid>http://geekswithblogs.net/TimH/archive/2005/10/19/57399.aspx</guid>
            <pubDate>Tue, 18 Oct 2005 21:57:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TimH/comments/57399.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TimH/archive/2005/10/19/57399.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/TimH/comments/commentRss/57399.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TimH/services/trackbacks/57399.aspx</trackback:ping>
        </item>
        <item>
            <title>Config error: Failed to deploy Biztalk system assembly... DefaultPipelines.dll</title>
            <link>http://geekswithblogs.net/TimH/archive/2005/07/07/45679.aspx</link>
            <description>&lt;P&gt;When running the config wizard for BizTalk2004 (on windows 2003) the following error occurred:&lt;/P&gt;
&lt;P&gt;Failed to deploy Biztalk system assembly "C:\Program Files\Microsoft BizTalk Server 2004\Microsoft.BizTalk.DefaultPipelines.dll". Unspecified exception: Unable to generate a temporary class (result=1). &lt;BR&gt;error CS2001: Source file 'C:\WINDOWS\TEMP\dbqvusoe.0.cs' could not be found. &lt;BR&gt;error CS2008: No inputs specified.&lt;/P&gt;
&lt;P&gt;The solution is to give the 'NETWORK SERVICE' user read and write access to the c:\windows\temp directory.&lt;/P&gt;
&lt;P&gt;Thanks to Asbj&amp;#248;rn for this : &lt;A href="http://www.biztalkug.com/Newsgroups/setup/88013.aspx"&gt;http://www.biztalkug.com/Newsgroups/setup/88013.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;HTH&lt;/P&gt;
&lt;P&gt;Tim&lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=45679"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=45679" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/TimH/aggbug/45679.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Tim Huffam</dc:creator>
            <guid>http://geekswithblogs.net/TimH/archive/2005/07/07/45679.aspx</guid>
            <pubDate>Thu, 07 Jul 2005 10:49:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/TimH/comments/45679.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/TimH/archive/2005/07/07/45679.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/TimH/comments/commentRss/45679.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/TimH/services/trackbacks/45679.aspx</trackback:ping>
        </item>
    </channel>
</rss>