<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Glavs Blog</title><link>http://weblogs.asp.net/pglavich/default.aspx</link><description>The dotDude of .Net</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Getting better performance in web apps with a few lines of script</title><link>http://weblogs.asp.net/pglavich/archive/2009/06/27/getting-better-performance-in-web-apps-with-a-few-lines-of-script.aspx</link><pubDate>Sat, 27 Jun 2009 09:53:45 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7135447</guid><dc:creator>Glav</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/pglavich/rsscomments.aspx?PostID=7135447</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2009/06/27/getting-better-performance-in-web-apps-with-a-few-lines-of-script.aspx#comments</comments><description>&lt;p&gt;We had a situation where a web application was utilising near 100% of CPU all the time under light load and it was proving very hard to reduce this significantly through code optimisation. We were performance testing and profiling, but only seeing marginal gains.&lt;/p&gt;  &lt;p&gt;The infrastructure that was hosting the web application was as follows:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Virtual Server (Hosted via VMWare Server) running Windows Server 2003 64 bit&lt;/li&gt;    &lt;li&gt;.Net 3.5&lt;/li&gt;    &lt;li&gt;Dual Virtual CPUs &lt;/li&gt;    &lt;li&gt;2 Gb of memory.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Now I am not a big fan of virtualisation for hosting high performance web sites but we were stuck with this. At any rate, we had consistently high CPU utilisation for seemingly no real reason. Some of the most simple requests were generating high CPU usage.&lt;/p&gt;  &lt;p&gt;After some investigation, and also the help of a friend and very smart dude, &lt;a href="http://weblogs.asp.net/OWScott/"&gt;Scott Forsyth&lt;/a&gt; (who works for &lt;a href="http://www.orcsweb.com/"&gt;Orcsweb&lt;/a&gt; a high profile web hosting company) we decided to try setting Internet Information Services to 32 bit mode to see if any difference was seen.&lt;/p&gt;  &lt;p&gt;To cut a long story short, we changed Internet Information Services to run in 32 bit mode. This simple switch, yielded &lt;strong&gt;significant lower CPU utilisation&lt;/strong&gt; and in some case, almost &lt;strong&gt;cut the CPU utilisation in half!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Why would this be so? Well, it turns out there are a few reasons for this. Probably the primary reason is the fact the we get less information within the level 1 cache of the processor because of the increased structure size (pointers are bigger) within 64 bit systems. The same information in a 64 bit system occupies more memory than its 32 bit counterpart, therefore we can fit less into the processor cache. More information on this can be found &lt;a href="http://blogs.msdn.com/joshwil/archive/2006/07/18/670090.aspx"&gt;here&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Its really easy to change IIS to 32 bit mode. The steps are:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;To enable 32 bit mode on IIS in 64 bit windows, at a command prompt type:     &lt;br /&gt;&lt;font size="2" face="Courier New"&gt;cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1&lt;/font&gt;&lt;/li&gt;    &lt;li&gt;Once this is done, 32 bit mode is enabled but we need to ensure that the 32 bit DLL’s are used as IIS will still have the 64 bit DLL’s defined for the ISAPI handler. To do this, all we have to do is re-register ASP.NET. At a command prompt, simply type:     &lt;br /&gt;&lt;font size="2" face="Courier New"&gt;%SYSTEMROOT%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe –i&lt;/font&gt;&lt;/li&gt;    &lt;li&gt;Finally, just make sure the status ASP.NET version 2.0.50727 (32-bit)&amp;#160; in the web services extension, within IIS, is set to allowed.     &lt;br /&gt;(More information on this process can be found &lt;a href="http://support.microsoft.com/kb/894435"&gt;here&lt;/a&gt; &lt;a href="http://support.microsoft.com/kb/894435"&gt;http://support.microsoft.com/kb/894435&lt;/a&gt;)&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;And that’s it. A few lines of script, and we had effectively reduced CPU utilisation by somewhere in between 30% and 50%!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Conclusion&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;So my rule is this, If you are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Running Windows server in 64 bit mode.&lt;/li&gt;    &lt;li&gt;Running a standard .Net web application&lt;/li&gt;    &lt;li&gt;Do not need a large memory address space (ie. over 4 gigabytes)&lt;/li&gt;    &lt;li&gt;Have no special 64 bit optimisations&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Then this change will yield immediate performance improvements in your application, and in some cases (dependent on what your application does), yield significant performance improvements.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7135447" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/pglavich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/IIS/default.aspx">IIS</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Performance/default.aspx">Performance</category></item><item><title>FromTheGrey – Arts Site</title><link>http://weblogs.asp.net/pglavich/archive/2009/05/10/fromthegrey-arts-site.aspx</link><pubDate>Sun, 10 May 2009 02:08:56 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7080166</guid><dc:creator>Glav</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/pglavich/rsscomments.aspx?PostID=7080166</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2009/05/10/fromthegrey-arts-site.aspx#comments</comments><description>&lt;p&gt;Recently, I have been working on creating an arts based website called “&lt;a href="http://FromTheGrey.com"&gt;FromTheGrey&lt;/a&gt;” at &lt;a href="http://FromTheGrey.com"&gt;http://FromTheGrey.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Its a site devoted to showcasing the pictures and artwork created by my wife Michele. Previously, Michele has been very reluctant to showcase these pieces, but I really like them, as do many others I know, so it took some time and coaxing to convince Michele to show them to the world.&lt;/p&gt;  &lt;p&gt;However, I finally managed to do. As a result, “&lt;a href="http://FromTheGrey.com" target="_blank"&gt;FromTheGrey&lt;/a&gt;” was born. Its a relatively simple site but I hope you like the art on the site and if so, would really appreciate you recommending it to others.&lt;/p&gt;  &lt;p&gt;Its currently simple but functional, and will have many more pieces of work from Michele on there, as well as enhanced styling and functionality.&lt;/p&gt;  &lt;p&gt;For now though, we would love your feedback which can be submitted via the &lt;a href="http://fromthegrey.com/ContactUs.aspx" target="_blank"&gt;Contact Form&lt;/a&gt; on the site.&lt;/p&gt;  &lt;p&gt;For the technically inclined, it utilises ASP.NET 3.5 Webforms, &lt;a href="http://jquery.com/" target="_blank"&gt;jQuery 1.3.2&lt;/a&gt;, and &lt;a href="http://jquery.com/" target="_blank"&gt;jQuery&lt;/a&gt; plugins for the dialog box and gallery effects, &lt;a href="http://jquery.com/demo/thickbox/" target="_blank"&gt;Thickbox&lt;/a&gt; and &lt;a href="http://devkick.com/lab/galleria/" target="_blank"&gt;Galleria&lt;/a&gt; respectively.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7080166" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/pglavich/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/General/default.aspx">General</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/ASP.NET+AJAX/default.aspx">ASP.NET AJAX</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/jquery/default.aspx">jquery</category></item><item><title>AjaxView – Javascript profiling</title><link>http://weblogs.asp.net/pglavich/archive/2009/05/10/ajaxview-javascript-profiling.aspx</link><pubDate>Sun, 10 May 2009 00:25:36 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7080153</guid><dc:creator>Glav</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/pglavich/rsscomments.aspx?PostID=7080153</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2009/05/10/ajaxview-javascript-profiling.aspx#comments</comments><description>&lt;p&gt;A little while ago, I &lt;a href="http://weblogs.asp.net/pglavich/archive/2008/06/03/profiling-your-ajax-applications-using-ajaxview.aspx"&gt;posted&lt;/a&gt; about a tool called &lt;a href="http://code.msdn.microsoft.com/AjaxView" target="_blank"&gt;AjaxView&lt;/a&gt; to allow you to profile javascript code within your web applications.&lt;/p&gt;  &lt;p&gt;Well, I was contacted by Adam who is working on this tool about its latest incarnation. It appears had a lot of work done to it, and now looks quite slick and is really nice to use. Previously, it was quite raw in use and also with the metrics its provides. Now, it acts very similar to one of my favourite profilers, &lt;a href="http://www.red-gate.com/products/ants_profiler/index.htm" target="_blank"&gt;Ants Profiler&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;What does it do?&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This tool injects profiling code into your javascript that enables it to analyse your javascript code and provide accurate metrics around all the operations being performed, including anonymous functions. It then provides these metrics to the Visual Studio performance tools for you to view in a very simple and familiar manner.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;How do you use it?&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;You need to be using IIS7 in Integrated mode for this tool to work. A full set of install instructions is listed &lt;a href="http://code.msdn.microsoft.com/AjaxView/Release/ProjectReleases.aspx?ReleaseId=2594" target="_blank"&gt;here&lt;/a&gt; along with the installation files. It installs pretty easily.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;What do you get?&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In short, you get detailed metrics on each page and javascript file in your site. When access a site with the AjaxView profile tools installed, all metric information is automatically being recorded. You can then access a web site on your local machine that is installed when AjaxView is installed. (Something like &lt;a href="http://localhost/AjaxView"&gt;http://localhost/AjaxView&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;When you do that, you can view the session profiles you have created (or the default one that is created for you on install). Something like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/pglavich/image_6374FCAE.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/pglavich/image_thumb_4EDF8763.png" width="522" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Select any of the files on the right which constitute all the files access by your web app (either a page or javascript file). Select the ‘Get profile data’ button and it launches Visual Studio and provides the profile metric data so that you can view it within Visual Studio. You end up getting access to detailed multiple views like the ones shown below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/pglavich/image_214E41D3.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/pglavich/image_thumb_39618661.png" width="387" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/pglavich/image_7F621DA7.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/pglavich/image_thumb_2D8BF395.png" width="644" height="118" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/pglavich/image_37906EF3.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/pglavich/image_thumb_53DDB113.png" width="644" height="108" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;All in all, a pretty useful tool to look at your Javascript performance. I recommend you take a look. Get it from &lt;a href="http://code.msdn.microsoft.com/AjaxView" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7080153" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/pglavich/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Web+2.0/default.aspx">Web 2.0</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/ASP.NET+AJAX/default.aspx">ASP.NET AJAX</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/jquery/default.aspx">jquery</category></item><item><title>Regaining results from a performance test run</title><link>http://weblogs.asp.net/pglavich/archive/2009/04/29/regaining-results-from-a-performance-test-run.aspx</link><pubDate>Wed, 29 Apr 2009 12:48:33 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7064546</guid><dc:creator>Glav</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/pglavich/rsscomments.aspx?PostID=7064546</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2009/04/29/regaining-results-from-a-performance-test-run.aspx#comments</comments><description>&lt;p&gt;I have been doing a lot of performance testing lately, and one of the worst things that can happen during a performance run, is when you don’t get any results. Performance testing is expensive, from a time and resources perspective, so getting results from a run is paramount.&lt;/p&gt;  &lt;p&gt;In my scenario, I have everything automated to kick off a performance run, at 7.00pm every night, run for 12 hours, then terminate. I collect metrics via Visual Studio Team Suite which is used to drive my performance tests, but I also have automated the collection of performance metrics on all related servers (web, sql etc…)&lt;/p&gt;  &lt;p&gt;On one of my recent runs, I came into the office in the morning, and checked on the test rig. The test appeared to be still running, even well beyond the termination time. VSTS reported that it was trying to abort the test, but things were still running. Some of the test agents refused to respond.&lt;/p&gt;  &lt;p&gt;I pressed the stop button to stop the test in VSTS and while I was waiting for that, loaded up the test results so far. The business were eagerly awaiting the results of the tests and it looked promising so far.&lt;/p&gt;  &lt;p&gt;Visual Studio began to refuse to respond after a while and was continuing to try and stop the test. After a long wait, I simply killed off the &lt;font size="2" face="Courier New"&gt;devenv.exe&lt;/font&gt; process, and restarted the Visual Studio Test controller service.&lt;/p&gt;  &lt;p&gt;I then went to load my test data from the run. Oh dear, the test run that I was looking at not more than half an hour ago, did not appear. Nothing listed on the ‘Completed Tests’ tab, and nothing within the ‘Manage Test Results’ option either.&lt;/p&gt;  &lt;p&gt;Crap. A business person walks by and asks how the test run went. “Still analysing the data” was my response. Double crap. What to do.&lt;/p&gt;  &lt;p&gt;After looking at the SQL database where the load results are stored, it was apparent there was a bunch of data in there, that simply was not showing. Looking through the raw data did not appeal to me very much.&lt;/p&gt;  &lt;p&gt;I had a look in the&lt;font size="2" face="Courier New"&gt; ‘LoadTest’&lt;/font&gt; table in the LoadTest database I was using to see if there was any data.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/pglavich/image_4D1C360B.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/pglavich/image_thumb_6ED7E8CF.png" width="299" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I noticed there was no ‘&lt;font size="2" face="Courier New"&gt;End Time&lt;/font&gt;’ defined for my run. It was simply set to NULL&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/pglavich/image_5E9BFB09.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/pglavich/image_thumb_757ACC85.png" width="566" height="250" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;. The Start Date was correct, so I simply copied the &lt;font size="2" face="Courier New"&gt;StartTime&lt;/font&gt; to the &lt;font size="2" face="Courier New"&gt;EndTime&lt;/font&gt; column, changed the date to the next day, and set the time to AM instead of PM (thus setting my 12 hour run).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/pglavich/image_79387155.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/pglavich/image_thumb_492E1FD4.png" width="558" height="214" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;And now I have normal access to all my test results. Whew…. crisis averted.&lt;/p&gt;  &lt;p&gt;Hope this helps someone.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7064546" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/pglavich/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/debugging/default.aspx">debugging</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/General/default.aspx">General</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Performance/default.aspx">Performance</category></item><item><title>Animated SiteMap Ajax Control</title><link>http://weblogs.asp.net/pglavich/archive/2009/02/12/animated-sitemap-ajax-control.aspx</link><pubDate>Thu, 12 Feb 2009 11:18:53 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6898407</guid><dc:creator>Glav</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/pglavich/rsscomments.aspx?PostID=6898407</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2009/02/12/animated-sitemap-ajax-control.aspx#comments</comments><description>&lt;p&gt;Today, I finally released on &lt;a href="http://www.codeplex.com/animatedsitemap"&gt;Codeplex&lt;/a&gt; a control that I had been working on over a year ago, called the &lt;a href="http://www.codeplex.com/animatedsitemap"&gt;Animated SIteMap Control&lt;/a&gt;. Its an &lt;a href="http://www.codeplex.com/AjaxControlToolkit"&gt;AJAX Control toolkit&lt;/a&gt; control and it has been prototype form for a very long time now.&lt;/p&gt;  &lt;p&gt;I had planned on releasing it into the &lt;a href="http://www.codeplex.com/AjaxControlToolkit"&gt;AJAX Control toolkit&lt;/a&gt; but I got sidetracked and haven’t touched this in over a year. It works fine and probably needs a little refinement but has configurable animation speeds, full support for CSS styling and various other options.&lt;/p&gt;  &lt;p&gt;Basically, it creates an ‘exploding’ like circular animation of the nodes defined in your web.sitemap file. You can drill down into nodes that have subnodes, or step back from the selected node, and the nodes of the same level are all animated in a circular fashion around the main or home node.&lt;/p&gt;  &lt;p&gt;You can view a very small and brief example of this &lt;a href="http://www.theglavs.com/ControlTestPage.aspx"&gt;here&lt;/a&gt;: &lt;a title="http://www.theglavs.com/ControlTestPage.aspx" href="http://www.theglavs.com/ControlTestPage.aspx"&gt;http://www.theglavs.com/ControlTestPage.aspx&lt;/a&gt;. Feel free to download it and use it if you like it. Hopefully, you may get the time to contribute to it and make it better. I know my time is short and I just didn’t want to waste it. Perhaps even a jQuery port might come of it.&lt;/p&gt;  &lt;p&gt;At any rate, if you end up using it, changing it or whatever, I would love to know. Hope you like it.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6898407" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/pglavich/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Component/default.aspx">Component</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Controls/default.aspx">Controls</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Community+News/default.aspx">Community News</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/ASP.NET+AJAX/default.aspx">ASP.NET AJAX</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Control+Toolkit/default.aspx">Control Toolkit</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/AJAX+Control+toolkit/default.aspx">AJAX Control toolkit</category></item><item><title>EOAST #4 – Evolution of a software thingy Part 4</title><link>http://weblogs.asp.net/pglavich/archive/2009/01/26/eoast-4-evolution-of-a-software-thingy-part-4.aspx</link><pubDate>Mon, 26 Jan 2009 01:45:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6860387</guid><dc:creator>Glav</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/pglavich/rsscomments.aspx?PostID=6860387</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2009/01/26/eoast-4-evolution-of-a-software-thingy-part-4.aspx#comments</comments><description>&lt;p&gt;So its been ages since my last post on this pet project of mine. Its time to get down to the nitty gritty on this and see if it is actually working the way I want it to. Hopefully, you have read parts &lt;a href="http://weblogs.asp.net/pglavich/archive/2008/08/04/eoast-evolution-of-a-software-thingy-part-1.aspx" mce_href="http://weblogs.asp.net/pglavich/archive/2008/08/04/eoast-evolution-of-a-software-thingy-part-1.aspx"&gt;one&lt;/a&gt;, &lt;a href="http://weblogs.asp.net/pglavich/archive/2008/08/11/eoast-evolution-of-a-software-thingy-part-2.aspx" mce_href="http://weblogs.asp.net/pglavich/archive/2008/08/11/eoast-evolution-of-a-software-thingy-part-2.aspx"&gt;two&lt;/a&gt; and &lt;a href="http://weblogs.asp.net/pglavich/archive/2008/09/09/eoast-evolution-of-a-software-thingy-part-3.aspx" mce_href="http://weblogs.asp.net/pglavich/archive/2008/09/09/eoast-evolution-of-a-software-thingy-part-3.aspx"&gt;three&lt;/a&gt; in previous posts to get a good idea on what I am trying to achieve.&lt;/p&gt;  &lt;p&gt;Basically, its a collect, store and display mechanism to store almost any information in a SQL database. You only need concentrate on implementing collection logic, or only display logic or both if you so choose. Its up to you. The storage and querying of this information is done for you, as is the scheduling of collection. Additionally, its gotta be real robust. If someone writes a crappy information provider, the system should not die. Also, I want to be able to map an information provider to one or more display providers, all easily.&lt;/p&gt;  &lt;p&gt;I have dubbed this the &lt;i&gt;InformationAggregator&lt;/i&gt;.&lt;/p&gt;  &lt;p&gt;So I am happy to say its actually working reasonably well at the moment. Since its a pet project of mine, the fact it is actually up to a reasonable level of functionality is quite an achievement. Normally I kinda let things go once I have satisfied my initial curiosity, or whatever it was that got me interested in doing it. What I haven’t really spent much time with is the user interface. Its really just a set of buttons on a form to exercise the API.&lt;/p&gt;  &lt;p&gt;At any rate, the basic details are as follows.&lt;/p&gt;  &lt;p&gt;There are 2 main assemblies: &lt;font size="2" face="courier "&gt;InformationAggregator.Core.dll&lt;/font&gt; and &lt;font size="2" face="Courier New"&gt;Information.Aggregator.Engine.dll&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;If you want to implement an information collection provider or an information display module, you only need to reference the Core assembly. The Engine assembly contains all the functionality to start the hosting and collection engine.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Note: Since this codebase is always being revised, its prone to change so there maybe much refactoring in the future. In fact, part of it will be happening after this post ":-)&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;Writing an Information Collection provider&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Say you want to write a module which collects email, accepts user input, reads a users twitter entries, or some other information collection mechanism. You only need to Implement 2 interfaces: &lt;font size="2" face="Courier New"&gt;IPluginModule&lt;/font&gt;, &amp;amp; &lt;font size="2" face="Courier New"&gt;IInformationProvider&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;font size="2" face="Courier New"&gt;IPluginModule&lt;/font&gt; has only 1 method, &lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;i&gt;QueryPluginResponse QueryPluginModule()&lt;/i&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;which acts to provide some metadata around itself. Here is an example:&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;public QueryPluginResponse QueryPluginModule()      &lt;br&gt;{       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; QueryPluginResponse response = new QueryPluginResponse();       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.MajorVersion = 1;       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.MinorVersion = 0;       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.PluginDescription = "Test Manual Collection. Only sends information to engine once collected from keyboard entry";       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.PluginName = "ManualCollector";       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.Publisher = "Glav";       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.PublisherLink = "&lt;/font&gt;&lt;a href="http://www.theglavs.com%22;" mce_href="http://www.theglavs.com&amp;quot;;"&gt;&lt;font size="2" face="Courier New"&gt;http://www.theglavs.com";&lt;/font&gt;&lt;/a&gt;     &lt;br&gt;&lt;font size="2" face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.RevisionNumber = 0;      &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.SupportsCollectionNotification = false;       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.TypeOfService = ServiceType.InformationProvider; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return response;      &lt;br&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;IInformationProvider &lt;/font&gt;also requires the implementation of only 1 method,&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;i&gt;List&amp;lt;GenericInformationItem&amp;gt; GetAllInformation()&lt;/i&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Here is an example:&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;public List&amp;lt;GenericInformationItem&amp;gt; GetAllInformation()      &lt;br&gt;{       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;GenericInformationItem&amp;gt; list = new List&amp;lt;GenericInformationItem&amp;gt;(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Random rnd = new Random(DateTime.Now.Millisecond);      &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; 3; i++)       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GenericInformationItem item = new GenericInformationItem();       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; item.Author = "Paul Glavich"; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; item.BodyTextData = string.Format("This is dummy body entry ID:# {0}. The current date is {1} and the time is {2}", rnd.Next(1,200),DateTime.Now.ToLongDateString(), DateTime.Now.ToLongTimeString());      &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; item.InformationSource = "Unit Test";       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; item.ReceivedDateTime = DateTime.Now;       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; item.Originator = "TestInformationProvider";       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; item.PublishDate = DateTime.Now;       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; item.SourceProvider = PROVIDER_NAME;       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; item.Summary = "Just a test item"; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; item.Title = string.Format("Test Item #{0}", i);      &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Add(item);       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return list;      &lt;br&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This implementation simply sends 3 items of information to the InformationAggregator engine when its asked to do so. This particular implementation is well suited to periodic, or scheduled collection. The engine can be asked to collect information from modules every minute, hour, day, week etc.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image.png" mce_href="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image.png"&gt;&lt;img src="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_thumb.png" title="image" style="border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" mce_src="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_thumb.png" width="373" border="0" height="318"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The engine also supports manual collection where it does not schedule collection at specific intervals, but waits for the provider to send it information. A third option is where the engine instructs the module to begin collection, then returns to its business, allowing that module to take its sweet time about collection (it may be very time consuming) and then send it the collected items. Status events of the collection process is also supported.&lt;/p&gt;  &lt;p&gt;Note that the implementation is very simple. It would be easy to write some logic to query some RSS feeds, twitter feeds, or whatever. All the scheduling and storage is performed via the engine through configuration. Currently I have a very crude user interface (and a I mean very crude) to control all this. Basically some buttons to exercise the functionality of the API:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_3.png" mce_href="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_3.png"&gt;&lt;img src="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_thumb_3.png" title="image" style="border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" mce_src="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_thumb_3.png" width="424" border="0" height="328"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Only collection modules that have been registered, have their items accepted and stored via the engine in the database. When registering, the IQueryModule interface is invoked to gather and display some metadata to display for confirmation when registering:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_4.png" mce_href="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_4.png"&gt;&lt;img src="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_thumb_4.png" title="image" style="border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" mce_src="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_thumb_4.png" width="493" border="0" height="255"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;Writing an Information Display provider&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;To display information, again we implement only 2 interfaces: &lt;font size="2" face="Courier New"&gt;IPluginModule&lt;/font&gt;, &amp;amp; &lt;font size="2" face="Courier New"&gt;IInformationDiplay&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;IPluginModule&lt;/font&gt; was already discussed above and is a pre-requisite for any module, either display or collection.&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;IInformationDiplay&lt;/font&gt; has 2 methods to implement:&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;void PushInformation(List&amp;lt;GenericInformationItem&amp;gt; infoItems ); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;void PushStatus(QueryPluginResponse plugin, int percentCollectionCompleted, CollectionStatus statusIndicator, string statusMessage);&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;The ‘&lt;font size="2" face="Courier New"&gt;&lt;i&gt;PushInformation&lt;/i&gt;&lt;/font&gt;’ method has the information ‘&lt;i&gt;pushed&lt;/i&gt;’ to it, and you can do what you want with the info from there. (Note: Not really happy with these method names, but I’ll leave them for now)&lt;/p&gt;  &lt;p&gt;The ‘&lt;font size="2" face="Courier New"&gt;&lt;i&gt;PushStatus&lt;/i&gt;&lt;/font&gt;’ method gets called repeatedly during the collection phase, if the information provider is providing this information.&lt;/p&gt;  &lt;p&gt;The display provider can be a simply console app, or more typically, a WPF application. These all need to be registered as described above.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_5.png" mce_href="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_5.png"&gt;&lt;img src="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_thumb_5.png" title="image" style="border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" alt="image" mce_src="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_thumb_5.png" width="415" border="0" height="215"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;However, one more pre-requisite is required if its a WPF application. A parameterised constructor must be provided that accepts the WPF window to be used for display. The engine will search the WPF application for this constructor and construct an instance of this window when creating this module, and maintain this, so that display items can be sent to the module, and threading affinity can be easily achieved.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;Linking providers to display modules.&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;So we can easily create an information collection provider. We can also easily create a display provider. How do we get information from collection provider to display provider. We simply map one or more collection modules to a display provider. Here is an example of the (again very crude) UI to do this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_6.png" mce_href="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_6.png"&gt;&lt;img src="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_thumb_6.png" title="image" style="border-width: 0px; display: inline;" alt="image" mce_src="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_thumb_6.png" width="529" border="0" height="197"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This UI shows 2 information providers, ManualCollector and TestInformationProvider. Currently, only the WPFDisplayProvider#2 is mapped to the TestInformationProvider, with the BalloonPopup display provider available, but not mapped to this module. This means that any information that the TestInformationProvider collects, is currently automatically sent to the WPFDisplayProvider#2. If we want that information to be sent to 2 display providers, we can simply click on the BalloonPopup display provider and move it into the mapped display providers.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_7.png" mce_href="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_7.png"&gt;&lt;img src="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_thumb_7.png" title="image" style="border-width: 0px; display: inline;" alt="image" mce_src="http://www.theglavs.com/article_Images/EOAST4EvolutionofasoftwarethingyPart4_114E5/image_thumb_7.png" width="538" border="0" height="200"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Now when the engine starts, all information collected by the TestInformationProvider is automatically sent to both the WPFDisplayProvider#2 and the BalloonPopup display provider. Basically you can pick and choose how your information is collected, and how it is displayed.&lt;/p&gt;  &lt;p&gt;So thats the concept. Control the collection of your information, and choose a display method that matches what you want. Additionally, have the information stored in an easily queryable store. &lt;/p&gt;  &lt;p&gt;There is actually much more, but I’ll leave it for now. Next step will be a demo, so look for a short video on how it works and specifically the WPF implementation of the display providers.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6860387" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/pglavich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/WPF/default.aspx">WPF</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/WCF/default.aspx">WCF</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>Some interesting links for ASP.NET</title><link>http://weblogs.asp.net/pglavich/archive/2009/01/09/some-interesting-links-for-asp-net.aspx</link><pubDate>Fri, 09 Jan 2009 06:29:51 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6828926</guid><dc:creator>Glav</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/pglavich/rsscomments.aspx?PostID=6828926</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2009/01/09/some-interesting-links-for-asp-net.aspx#comments</comments><description>&lt;p&gt;Its been a while since I have done any technical stuff as I have been on holidays, relaxing, and generally a lot of nothing. Certainly nothing technical related and have really enjoyed spending time with friends and family.&lt;/p&gt;  &lt;p&gt;Over this period, &lt;a href="http://morewally.com/cs/blogs/wallym/default.aspx"&gt;Wally&lt;/a&gt; has produced some good material around ASP.NET which I feel obligated to share with you….. (ok, so maybe Wally coerced me a bit….)&lt;/p&gt;  &lt;p&gt;Firstly, &lt;a href="http://morewally.com/cs/blogs/wallym/default.aspx"&gt;Wally&lt;/a&gt; has done a new ASP.NET Podcast:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://aspnetpodcast.com/CS11/blogs/asp.net_podcast/archive/2009/01/06/asp-net-podcast-show-134-general-thoughts-on-windows-azure-audio-only.aspx"&gt;ASP.NET Podcast Show #134 - General Thoughts on Windows Azure - Audio only&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Some good discussion around Cloud computing and Windows Azure in there.&lt;/p&gt;  &lt;p&gt;Also, &lt;a href="http://morewally.com/cs/blogs/wallym/default.aspx"&gt;Wally&lt;/a&gt; has produced an e-Book on some of the ASP.NET 3.5 SP1 features and its located &lt;a href="http://www.wrox.com/WileyCDA/WroxTitle/New-Features-in-ASP-NET-3-5-Service-Pack-1.productCd-0470457341.html"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Go check em out. Make &lt;a href="http://morewally.com/cs/blogs/wallym/default.aspx"&gt;Wally&lt;/a&gt; a happy &lt;a href="http://morewally.com/cs/blogs/wallym/default.aspx"&gt;Wally&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6828926" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/pglavich/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/podcast/default.aspx">podcast</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Web+2.0/default.aspx">Web 2.0</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Community+News/default.aspx">Community News</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/ASP.NET+AJAX/default.aspx">ASP.NET AJAX</category></item><item><title>New ASP.NET Podcast on jQuery support</title><link>http://weblogs.asp.net/pglavich/archive/2008/12/06/new-asp-net-podcast-on-jquery-support.aspx</link><pubDate>Sat, 06 Dec 2008 05:08:33 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6768002</guid><dc:creator>Glav</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/pglavich/rsscomments.aspx?PostID=6768002</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/12/06/new-asp-net-podcast-on-jquery-support.aspx#comments</comments><description>&lt;p&gt;&lt;a target="_blank" href="http://morewally.com/cs/Default.aspx"&gt;Wally&lt;/a&gt; has done another good podcast which can be found &lt;a target="_blank" href="http://aspnetpodcast.com/CS11/blogs/asp.net_podcast/archive/2008/12/03/asp-net-podcast-show-128-ajax-with-jquery.aspx"&gt;here&lt;/a&gt; on &lt;a target="_blank" href="http://jquery.com/"&gt;jQuery&lt;/a&gt; support in Visual Studio 2008 and how it compares to ASP.NET AJAX by way of some simple examples.&lt;/p&gt; &lt;p&gt;&lt;a target="_blank" href="http://jquery.com/"&gt;jQuery&lt;/a&gt; is a great AJAX library and well worth investing some time in getting familiar with. In fact, you can start right now by listening to the &lt;a target="_blank" href="http://aspnetpodcast.com/CS11/blogs/asp.net_podcast/archive/2008/12/03/asp-net-podcast-show-128-ajax-with-jquery.aspx"&gt;podcast&lt;/a&gt; :-)&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6768002" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/pglavich/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Community+News/default.aspx">Community News</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/ASP.NET+AJAX/default.aspx">ASP.NET AJAX</category></item><item><title>Debugging Silverlight apps using WinDbg</title><link>http://weblogs.asp.net/pglavich/archive/2008/12/03/debugging-silverlight-apps-using-windbg.aspx</link><pubDate>Wed, 03 Dec 2008 00:29:12 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6763291</guid><dc:creator>Glav</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/pglavich/rsscomments.aspx?PostID=6763291</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/12/03/debugging-silverlight-apps-using-windbg.aspx#comments</comments><description>&lt;p&gt;While working on a silverlight application for my current engagement, we were seeing some weird memory issues and application crashes. I won't bore you with the initial investigation of the issue, but it turns out we need to delve deep into what was going on behind the scenes. A fellow colleague and friend, &lt;a target="_blank" href="http://miguelmadero.blogspot.com/"&gt;Miguel Madero&lt;/a&gt;, was also encountering similar issues. He also did some work in debugging the issues he was seeing,&amp;nbsp; and because they were similar to mine, I had a little headstart in where to look. Note: I know that &lt;a target="_blank" href="http://miguelmadero.blogspot.com/"&gt;Miguel&lt;/a&gt; will also be publishing some debugging tips around Silverlight and he is a Silverlight gun so keep an eye on his &lt;a target="_blank" href="http://miguelmadero.blogspot.com/"&gt;blog&lt;/a&gt; for more details.&lt;/p&gt; &lt;p&gt;At any rate, our silverlight apps, after opening certain pages many times (&amp;gt; 8), the application would crash. No real information why, and the Visual Studio debugger wasn't helping a lot as the exception it was faulting on was just the final exception when things got too much.&lt;/p&gt; &lt;p&gt;In Visual Studio, turning on Catch all first chance exceptions wasn't helping either as there were too many other first chance exceptions that were confusing things (and yes, many framework related ones).&lt;/p&gt; &lt;p&gt;So, using &lt;a target="_blank" href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx"&gt;WinDbg&lt;/a&gt;, we decided to dig deeper. The rest of this post shows how we debugged some silverlight issues using &lt;a target="_blank" href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx"&gt;WinDbg&lt;/a&gt; using some general examples, and a few specific ones.&lt;/p&gt; &lt;p&gt;&lt;u&gt;Getting Started.&lt;/u&gt;&lt;/p&gt; &lt;p&gt;You can create crash dumps to examine using a tool like &lt;a target="_blank" href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx"&gt;adplus&lt;/a&gt; (&lt;a target="_blank" href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx"&gt;part of the debugging tools&lt;/a&gt;) which I did, but I also prefer to attach to the running process itself where possible so I shall use that here.&lt;/p&gt; &lt;p&gt;1. Loaded up WinDbg&lt;/p&gt; &lt;p&gt;2. Loaded the SOS module for silverlight which is the managed debugging extension.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/SilverlightViewModelsandObservableCollec_10021/image.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/SilverlightViewModelsandObservableCollec_10021/image_thumb.png" width="519" height="213"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;3. Set the symbol path to a local directory on my system as well as the microsoft symbol servers when the tool needs to download/resolve symbols.&lt;/p&gt; &lt;p&gt;You can do this via the command line&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/SilverlightViewModelsandObservableCollec_10021/image_3.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/SilverlightViewModelsandObservableCollec_10021/image_thumb_3.png" width="497" height="76"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;or via the user interface&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/SilverlightViewModelsandObservableCollec_10021/image_4.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/SilverlightViewModelsandObservableCollec_10021/image_thumb_4.png" width="494" height="310"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;4. Fire up your SIlverlight application in a standard Internet Explorer browser window. Do not invoke debugging within Visual Studio (ie. press the 'Play' button or hit 'F5' to start the app) as this will attach its own debugger. Then attach WinDbg to the 'iexplore.exe' process.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/SilverlightViewModelsandObservableCollec_10021/image_5.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/SilverlightViewModelsandObservableCollec_10021/image_thumb_5.png" width="334" height="166"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/SilverlightViewModelsandObservableCollec_10021/image_6.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/SilverlightViewModelsandObservableCollec_10021/image_thumb_6.png" width="258" height="374"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;5. Now we are ready to begin actual debugging. Typing 'g' into the command line gets the debugee running, and WinDbg monitors the application for first chance exceptions.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/SilverlightViewModelsandObservableCollec_10021/image_7.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/SilverlightViewModelsandObservableCollec_10021/image_thumb_7.png" width="475" height="143"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;One thing that is not so apparent within Silverlight, particularly when using the MVVM (Model-View-ViewModel) pattern which typically uses DataBinding extensively, is when data binding errors occur. The framework tends to hide these little gems away, and sometimes, it just appears like its not working. Note that these will also appear in the Visual Studio debug output window but I find it actually easier to have the WinDbg window running side by side with the browser to watch all exceptions as they occur.&lt;/p&gt; &lt;p&gt;By way of example, lets imagine the view model has this property, SelectedThing.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/SilverlightViewModelsandObservableCollec_10021/image_8.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/SilverlightViewModelsandObservableCollec_10021/image_thumb_8.png" width="453" height="258"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Now lets also imagine we have a ComboBox databound to this using the following XAML.&lt;/p&gt; &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;lt;ComboBox x:Name="DropList" Grid.Row="1" Height="30"&amp;nbsp; &lt;font color="#0000ff"&gt;ItemsSource="{Binding SomeData}"&lt;/font&gt; DisplayMemberPath="Name" &lt;font color="#0000ff"&gt;SelectedIndex="{Binding SelectedThing, Mode=TwoWay}"&lt;/font&gt; /&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Finally, when we fill up/gather our data, we set the SelectedThing to an initial value:&lt;/p&gt; &lt;p&gt;&lt;font size="2" face="Courier New"&gt;SelectedThing = SomeData[0];&lt;/font&gt;&lt;/p&gt; &lt;p&gt;The astute among you can probably already see where the error is, but lets persist for the sake of example. We load the app and see that the ComboBox is not having its selected item bound to anything.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/SilverlightViewModelsandObservableCollec_10021/image_9.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/SilverlightViewModelsandObservableCollec_10021/image_thumb_9.png" width="430" height="274"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;At this stage, no errors are prevalent, other than we have no SelectedItem in the ComboBox. Hpwever, looking at the WinDbg window, shows us that there were some exceptions occurring.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/SilverlightViewModelsandObservableCollec_10021/image_10.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/SilverlightViewModelsandObservableCollec_10021/image_thumb_10.png" width="476" height="83"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Specifically, we can see that an exception occurred with a BindingExpression, in which a converter failed to convert a value for 'SomeItem'. The entire message is shown below, and its pretty verbose about what failed.&lt;/p&gt; &lt;p&gt;(Again, this is the same output as the Visual Studio debug output window)&lt;/p&gt; &lt;p&gt;&lt;font size="2" face="Courier New"&gt;System.Windows.Data Error: 'MS.Internal.Data.DynamicValueConverter' converter failed to convert value 'TestSLCrap.SomeItem' (type 'TestSLCrap.SomeItem'); BindingExpression: Path='SelectedThing' DataItem='TestSLCrap.ViewModel' (HashCode=64479624); target element is 'System.Windows.Controls.ComboBox' (Name='DropList'); target property is 'SelectedIndex' (type 'System.Int32').. System.InvalidOperationException: Can't convert type TestSLCrap.SomeItem to type System.Int32.&lt;br&gt;&amp;nbsp;&amp;nbsp; at MS.Internal.Data.DefaultValueConverter.Create(Type sourceType, Type targetType, Boolean targetToSource)&lt;br&gt;&amp;nbsp;&amp;nbsp; at MS.Internal.Data.DynamicValueConverter.EnsureConverter(Type sourceType, Type targetType)&lt;br&gt;&amp;nbsp;&amp;nbsp; at MS.Internal.Data.DynamicValueConverter.Convert(Object value, Type targetType, Object parameter, CultureInfo culture)&lt;br&gt;&amp;nbsp;&amp;nbsp; at System.Windows.Data.BindingExpression.ConvertToTarget(Object value).&lt;/font&gt;  &lt;p&gt;It tells us the value to convert, the binding path and the property. Pretty easy to fix. In the XAML we simply change this:&lt;/p&gt; &lt;p&gt;&lt;font size="2" face="Courier New"&gt;SelectedIndex="{Binding SelectedThing, Mode=TwoWay}"&lt;/font&gt;&lt;/p&gt; &lt;p&gt;to this:&lt;/p&gt; &lt;p&gt;&lt;font size="2" face="Courier New"&gt;SelectedItem="{Binding SelectedThing, Mode=TwoWay}"&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Again, pretty simple and actually an easy error to do if you are going fast and accepting the Intellisense suggested property without really looking. To bring this back to my problematic silverlight app I mentioned, while debugging I found numerous instances of binding issues where properties were NULL when not expected and a few others. Eliminating these certainly made the app run better but it was still crashing.&lt;/p&gt; &lt;p&gt;So, I gotta dig deeper. I had a look at some of the exceptions on the heap.&lt;/p&gt; &lt;p&gt;&lt;font size="2" face="Courier New"&gt;0:005&amp;gt; !dumpheap -type Exception&lt;br&gt;Address MT Size&lt;br&gt;03a21024 038c72d0 72&lt;br&gt;03a2106c 038c7398 72&lt;br&gt;03a210b4 038c7458 72&lt;br&gt;03a210fc 038c750c 72&lt;br&gt;03a21144 038c750c 72&lt;br&gt;03a24edc 060a5668 32&lt;br&gt;03a25a4c 060d51e4 32&lt;br&gt;03a25a6c 060d52c0 32&lt;br&gt;03a2dac4 060dd240 32&lt;br&gt;03a3d254 0321f48c 12&lt;br&gt;03a3d26c 0321f510 12&lt;br&gt;total 11 objects&lt;br&gt;Statistics:&lt;br&gt;MT Count TotalSize Class Name &lt;br&gt;0321f510 1 12 System.Text.DecoderExceptionFallback&lt;br&gt;0321f48c 1 12 System.Text.EncoderExceptionFallback&lt;br&gt;060dd240 1 32 System.EventHandler`1[[System.Windows.ApplicationUnhandledExceptionEventArgs, System.Windows]]&lt;br&gt;060d52c0 1 32 MS.Internal.Error+GetExceptionTextDelegate&lt;br&gt;060d51e4 1 32 MS.Internal.Error+ClearExceptionDelegate&lt;br&gt;060a5668 1 32 System.UnhandledExceptionEventHandler&lt;br&gt;038c7458 1 72 System.ExecutionEngineException&lt;br&gt;038c7398 1 72 System.StackOverflowException&lt;br&gt;038c72d0 1 72 System.OutOfMemoryException&lt;br&gt;038c750c 2 144 System.Threading.ThreadAbortException&lt;br&gt;Total 11 objects&lt;br&gt;&lt;/font&gt; &lt;p&gt;Hmmm, not too much interesting here as these exceptions. Lets dump the current stack objects to see what that yields:&lt;/p&gt;&lt;pre&gt;0:005&amp;gt; !dso
OS Thread Id: 0xa54 (5)
ESP/REG  Object   Name
0179E85C 04084278 Views.DataDisplayView
0179E880 03a82684 System.Windows.CoreDependencyProperty
0179E884 04084278 Views.DataDisplayView
0179E89C 04084278 Views.DataDisplayView
0179E8BC 03a82684 System.Windows.CoreDependencyProperty
0179E8C0 04084278 Views.DataDisplayView
0179E8CC 0450f6d8 System.Windows.Controls.RadioButton
0179E8E0 03a82684 System.Windows.CoreDependencyProperty
0179E8E4 04084278 Views.DataDisplayView
0179E8F0 03a82684 System.Windows.CoreDependencyProperty
0179E8F4 04084278 Views.DataDisplayView
0179E904 04084278 Views.DataDisplayView
0179E910 04084278 Views.DataDisplayView
0179E914 04084278 Views.DataDisplayView
0179E918 04084278 Views.DataDisplayView
0179E91C 04088ca0 System.Windows.Controls.RadioButton
0179E938 04088ca0 System.Windows.Controls.RadioButton

. . . majority of listing omitted for brevity

0179E980 0450f6d8 System.Windows.Controls.RadioButton
0179E990 0455641c System.Windows.RoutedEventArgs
0179E994 0450f6d8 System.Windows.Controls.RadioButton
0179F7C4 03a6f9d0 Ninject.Core.Injection.DynamicMethodInjector
0179F7C8 0425fcd8 System.Object[]    (System.Object[])
179F9BC 03a92720 PresentationLayer.UI.UserControls.MenuItem
0179F9E4 03a92c00 System.Windows.Input.MouseButtonEventHandler
0179FA04 03a92720 PresentationLayer.UI.UserControls.MenuItem
0179FA08 0425f898 System.Windows.Input.MouseButtonEventArgs
0179FA44 0425f87c System.String    M@21
0179FB24 03a2526c MS.Internal.FrameworkCallbacks+FireEventDelegate
0179FBC8 03a2526c MS.Internal.FrameworkCallbacks+FireEventDelegate
&lt;/pre&gt;
&lt;p&gt;Now this is much more interesting, as you can see multiple references to Views.DataDisplayView where only 1, should be present. I poked around the objects themselves and found similar patterns. Using the '&lt;em&gt;gcroot&lt;/em&gt;' command, I could see what objects were 'hanging around'.&lt;/p&gt;&lt;pre&gt;0:005&amp;gt; !gcroot 04084278
Note: Roots found on stacks may be false positives. Run "!help gcroot" for
more info.
Scan Thread 5 OSTHread a54
ESP:179e85c:Root:  04084278(Views.DataDisplayView)-&amp;gt;
ESP:179e884:Root:  04084278(Views.DataDisplayView)-&amp;gt;
ESP:179e89c:Root:  04084278(Views.DataDisplayView)-&amp;gt;
ESP:179e8c0:Root:  04084278(Views.DataDisplayView)-&amp;gt;
ESP:179e8e4:Root:  04084278(Views.DataDisplayView)-&amp;gt;
ESP:179e8f4:Root:  04084278(Views.DataDisplayView)-&amp;gt;
ESP:179e904:Root:  04084278(Views.DataDisplayView)-&amp;gt;
ESP:179e910:Root:  04084278(Views.DataDisplayView)-&amp;gt;
ESP:179e914:Root:  04084278(Views.DataDisplayView)-&amp;gt;
ESP:179e918:Root:  04084278(Views.DataDisplayView)-&amp;gt;
ESP:179e91c:Root:  04088ca0(System.Windows.Controls.RadioButton)-&amp;gt;
  0408900c(System.Windows.DataContextChangedEventHandler)-&amp;gt;
  04088fd0(System.Windows.Data.BindingExpression)-&amp;gt;
  04076c74(Views.DataDisplayViewViewModel)-&amp;gt;
  04076eb8(System.Collections.ObjectModel.ObservableCollection`1[[MyApp.DataEntities.WeekCommence,  
MyApp.DataEntities]])-&amp;gt;
  0409dbb0(System.Collections.Specialized.NotifyCollectionChangedEventHandler)-&amp;gt;
  04085a34(System.Windows.Controls.ComboBox)-&amp;gt;
  04085c84(System.Windows.Controls.SelectionChangedEventHandler)-&amp;gt;
  04084278(Views.DataDisplayView)-&amp;gt;
ESP:179e938:Root:  04088ca0(System.Windows.Controls.RadioButton)-&amp;gt;
  0408900c(System.Windows.DataContextChangedEventHandler)-&amp;gt;
  04088fd0(System.Windows.Data.BindingExpression)-&amp;gt;
  04076c74(Views.DataDisplayViewViewModel)-&amp;gt;
  04076eb8(System.Collections.ObjectModel.ObservableCollection`1[[MyApp.DataEntities.WeekCommence,  
MyApp.DataEntities]])-&amp;gt;
  0409dbb0(System.Collections.Specialized.NotifyCollectionChangedEventHandler)-&amp;gt;
  04085a34(System.Windows.Controls.ComboBox)-&amp;gt;
  04085c84(System.Windows.Controls.SelectionChangedEventHandler)-&amp;gt;
  04084278(Views.DataDisplayView)-&amp;gt;
Scan Thread 13 OSTHread 16b4
Scan Thread 14 OSTHread 1274
Scan Thread 15 OSTHread 15a8
Scan Thread 16 OSTHread 1330

&lt;/pre&gt;
&lt;p&gt;I could see many instances of references to properties of type ObservableCollection&amp;lt;&amp;gt;. Looking at the pinned/rooted objects for a view other instances of the 'Views.DataDisplayView' objects, revealed similar results, some showing many instances of references to properties that implemented ObservableCollection&amp;lt;&amp;gt;.&lt;/p&gt;
&lt;p&gt;Obviously, something was subscribing to the collection changed events of the ObservableCollections, and simply not letting go. Whether this be the DataBinding infrastructure of Silverlight or a result of some of the dodgy code in the application, its currently hard to say as the code is quite convoluted.&lt;/p&gt;
&lt;p&gt;I can say this however. Changing the properties listed in the WinDbg sessions from ObservableCollections to simple generic List&amp;lt;&amp;gt; types completely solved my crashing issue. Simply changing these types involved a bit of work to now manually raise the appropriate property changed events when these properties are changed, but at least my application doesn't crash.&lt;/p&gt;
&lt;p&gt;As a result, I now keep WinDbg loaded during most of my silverlight development, with the symbol path and symbols loaded and ready to go. its easy to just attach to the iexplore.exe process, make sure its all good, and be on my way. I know that WinDbg can save all this workspace information, but for some reason, sometimes it doesn't so I generally keep it loaded and its small enough anyway.&lt;/p&gt;
&lt;p&gt;Hope this proves informative for someone.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6763291" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/pglavich/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/debugging/default.aspx">debugging</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Community+News/default.aspx">Community News</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>WCF, IErrorHandler and propagating faults</title><link>http://weblogs.asp.net/pglavich/archive/2008/10/16/wcf-ierrorhandler-and-propagating-faults.aspx</link><pubDate>Thu, 16 Oct 2008 10:12:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6682847</guid><dc:creator>Glav</dc:creator><slash:comments>12</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/pglavich/rsscomments.aspx?PostID=6682847</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/10/16/wcf-ierrorhandler-and-propagating-faults.aspx#comments</comments><description>&lt;p&gt;On a recent project, I have needed to set up a generic error handler just above the service layer which ensured that only known exceptions were propagated up to the client in a controlled manner. This post contains information about how to write an &lt;font size="2" face="Courier New"&gt;IErrorHandler&lt;/font&gt;, but more importantly, it does contain an important point at the end about its implementation that I wanted to share, as well as save for my own reference on this blog, in this wonderful inter-web thingy.&lt;/p&gt; &lt;p&gt;&lt;i&gt;&lt;b&gt;Update: The code for this article is &lt;/b&gt;&lt;/i&gt;&lt;a href="http://www.theglavs.com/DownloadItem.aspx?FileID=62" mce_href="http://www.theglavs.com/DownloadItem.aspx?FileID=62"&gt;here&lt;/a&gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;Using &lt;b&gt;FaultContracts&lt;/b&gt; is a good way of achieving this WCF, but I also wanted to be able to:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Catch generic CLR exceptions and propagate them to the client as a generic fault exceptions.  &lt;/li&gt;&lt;li&gt;Catch some NHibernate specific exceptions (the concurrency ones in particular) and propagate these to the client as a general concurrency fault.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;This was all the client needed to know, and also provided an opportunity to log any unhandled exceptions that may sneak there way up to the services. WCF provides great exception shielding by default, but we wanted a bit more control.&lt;/p&gt; &lt;p&gt;Enter the &lt;font face="Courier New"&gt;IErrorHandler&lt;/font&gt; interface that allows you to intercept any faults or exceptions before they are sent back to the client. To use this properly, you still need to define your &lt;font size="2" face="Courier New"&gt;FaultContract&lt;/font&gt; as required. My simple example contract is as follows:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image.png" mce_href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image.png"&gt;&lt;img src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb.png" style="border-width: 0px;" alt="image" mce_src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb.png" width="644" border="0" height="211"&gt;&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;So to start the implementation of my custom error handler, I define a class that&amp;nbsp; will implement an IErrorHandler as well as IServiceBehavior.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_3.png" mce_href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_3.png"&gt;&lt;img src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb_3.png" style="border-width: 0px;" alt="image" mce_src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb_3.png" width="644" border="0" height="39"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;I do this because not only do I want to create an IErrorHandler implementation, but I need it to participate as a behavior within the WCF pipeline, that is, I want to add it in as a ServiceBehavior when I create the host so that my custom error handler implementation can be plugged in.&lt;/p&gt; &lt;p&gt;I first provide implementations for the IErrorHandler. &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_4.png" mce_href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_4.png"&gt;&lt;img src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb_4.png" style="border-width: 0px;" alt="image" mce_src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb_4.png" width="644" border="0" height="296"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;font size="2" face="courier "&gt;HandleError&lt;/font&gt; returning true simply means I have handled this error and don't need other error handlers to deal with it.&lt;/p&gt; &lt;p&gt;&lt;font size="2" face="Courier New"&gt;ProvideFault&lt;/font&gt; does a few things. First it checks if its a genuine &lt;font size="2" face="Courier New"&gt;FaultException&lt;/font&gt;. If so, it does nothing but let it pass through. If it isn't, then a &lt;font size="2" face="Courier New"&gt;FaultException&amp;lt;ApplicationFault&amp;gt;&lt;/font&gt; is created, and a message fault is generated from that. Then a new message is created, using the message fault is its content, and that message is assigned to the return fault parameter.&lt;/p&gt; &lt;p&gt;If I wanted to catch another type of exception, I might check for it something like:&lt;/p&gt; &lt;p&gt;&lt;font size="2" face="courier "&gt;if (error is NHibernate.StaleObjectException) .....&lt;/font&gt;&lt;/p&gt; &lt;p&gt;and optionally create a different type of fault. The &lt;font size="2" face="Courier New"&gt;ApplicationFault&lt;/font&gt; used to construct the &lt;font size="2" face="Courier New"&gt;FaultException&lt;/font&gt; is just a standard &lt;font size="2" face="Courier New"&gt;DataContract&lt;/font&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_5.png" mce_href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_5.png"&gt;&lt;img src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb_5.png" style="border-width: 0px;" alt="image" mce_src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb_5.png" width="644" border="0" height="214"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Implementing the &lt;font size="2" face="Courier New"&gt;IServiceBehavior&lt;/font&gt; is pretty easy as you see below:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_6.png" mce_href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_6.png"&gt;&lt;img src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb_6.png" style="border-width: 0px;" alt="image" mce_src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb_6.png" width="644" border="0" height="326"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;If you wanted to, in the Validate method, you could iterate through each operation and ensure its got your required &lt;font size="2" face="Courier New"&gt;FaultContract&lt;/font&gt; applied like this:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_7.png" mce_href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_7.png"&gt;&lt;img src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb_7.png" style="border-width: 0px;" alt="image" mce_src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb_7.png" width="644" border="0" height="190"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;As a nice touch, I wanted this error handler to be able to added via configuration and play nicely with the WCF Service Configuration editor. To do this, you need a class that inherits from &lt;font size="2" face="Courier New"&gt;BehaviorExtensionElement &lt;/font&gt;and implements 2 simple methods like this:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_8.png" mce_href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_8.png"&gt;&lt;img src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb_8.png" style="border-width: 0px;" alt="image" mce_src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb_8.png" width="644" border="0" height="229"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;So, finally we are at the point that caught me up for a while. In the implementation of the &lt;font size="2" face="Courier New"&gt;ProvideFault&lt;/font&gt; method of my error handler, you need to specify an action for the returned Fault as shown below:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_9.png" mce_href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_9.png"&gt;&lt;img src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb_9.png" style="border-width: 0px;" alt="image" mce_src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb_9.png" width="644" border="0" height="192"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Now its important that this Action is a known action identifier that your client is expecting. In other words, if you generate a proxy (via SvcUtil) for this service and peek into the reference.cs file for the 'Action' attribute on your services fault contract, make sure they are the same. Otherwise, when your error handler generates a fault with an unknown fault action, the client wont accept it as a known fault and it will look like just a generic &lt;font size="2" face="Courier New"&gt;FaultException&lt;/font&gt;, not the specific &lt;font size="2" face="Courier New"&gt;FaultContract&amp;lt;YourType&amp;gt;&lt;/font&gt; you were after.&lt;/p&gt; &lt;p&gt;When I was developing this error handler, I simply fudged this value while I got on with the task of implementing the handler. I forgot about it, then spend some time wondering why my faults were not being propagated and caught properly on the client. So make sure you supply a well known action for your fault in the contract attribute and in the error handler like this:&lt;/p&gt; &lt;p&gt;First on your &lt;font size="2" face="Courier New"&gt;FaultContract&lt;/font&gt; attribute:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_10.png" mce_href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_10.png"&gt;&lt;img src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb_10.png" style="border-width: 0px;" alt="image" mce_src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb_10.png" width="644" border="0" height="209"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Then in your &lt;font size="2" face="Courier New"&gt;ProvideFault&lt;/font&gt; implementation:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_11.png" mce_href="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_11.png"&gt;&lt;img src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb_11.png" style="border-width: 0px;" alt="image" mce_src="http://www.theglavs.com/article_Images/WCFIErrorHandlerandpropagatingfaults_1315B/image_thumb_11.png" width="644" border="0" height="157"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;So finally, thats it. Don't forget about matching up those actions, otherwise you'll waste your time.&lt;/p&gt; &lt;p&gt;Hope this has proved helpful and informative.&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;b&gt;Update: The code for this article is &lt;/b&gt;&lt;/i&gt;&lt;a href="http://www.theglavs.com/DownloadItem.aspx?FileID=62" mce_href="http://www.theglavs.com/DownloadItem.aspx?FileID=62"&gt;here&lt;/a&gt;&amp;nbsp; &lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6682847" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/pglavich/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/WCF/default.aspx">WCF</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Community+News/default.aspx">Community News</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>EOAST - Evolution of a software thingy - Part 3</title><link>http://weblogs.asp.net/pglavich/archive/2008/09/09/eoast-evolution-of-a-software-thingy-part-3.aspx</link><pubDate>Tue, 09 Sep 2008 00:54:42 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6611179</guid><dc:creator>Glav</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/pglavich/rsscomments.aspx?PostID=6611179</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/09/09/eoast-evolution-of-a-software-thingy-part-3.aspx#comments</comments><description>&lt;p&gt;This is the the third instalment of my experiences and ideas around the development of a piece of software to initially satisfy my disappointment around Outlook and also to allow me to play with some new technologies and making them all work together. &lt;a target="_blank" href="http://weblogs.asp.net/pglavich/archive/2008/08/04/eoast-evolution-of-a-software-thingy-part-1.aspx"&gt;Part 1 is here&lt;/a&gt; and &lt;a target="_blank" href="http://weblogs.asp.net/pglavich/archive/2008/08/11/eoast-evolution-of-a-software-thingy-part-2.aspx"&gt;Part 2 is here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;This latest instalment will focus a little more into the design detail. The "&lt;em&gt;InformationAggregator&lt;/em&gt;" (as I have coined this project) is intended to be fairly generic as to the kind of information it collects but is still somewhat specific in that all types of information ever thought of is a bit too grandiose. For the most part, email, RSS, meetings, tasks, journal entries, notes and those types of things are the initial concern.&lt;/p&gt; &lt;p&gt;Central to this is the "&lt;em&gt;&lt;strong&gt;GenericInformationItem&lt;/strong&gt;&lt;/em&gt;" that is used to house individual elements of information. Below is a class diagram of the object:&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://www.theglavs.com/article_Images/EOASTEvolutionofasoftwarethingyPart3_D8D7/image.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/EOASTEvolutionofasoftwarethingyPart3_D8D7/image_thumb.png" width="209" height="484"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;I'll go through the non obvious items to explain how I see them working. Note that this is a work in progress, so things are bound to change as I go further down the path.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;BodyBinaryData&lt;/strong&gt; and &lt;strong&gt;BodyTextData&lt;/strong&gt;: These properties are obviously the body component of the information item. &lt;strong&gt;BodyBinaryData &lt;/strong&gt;might typically be images or pretty much anything you like in binary form. It does not lend itself to searching its contents though, and this is somewhat mitigated by searching on things like &lt;strong&gt;Title&lt;/strong&gt;, &lt;strong&gt;Author &lt;/strong&gt;&amp;amp; &lt;strong&gt;Summary &lt;/strong&gt;fields, but this still may not be quite sufficient. &lt;strong&gt;BodyTextData&lt;/strong&gt; is any textual portion of the information item body and is easily searched. Email body, RSS item content, note content are obvious candidates here.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;InitialDateTime&lt;/strong&gt; and &lt;strong&gt;EndDateTime&lt;/strong&gt;: My thinking here was to mainly cater for meetings/appointments. &lt;strong&gt;InitialDateTime &lt;/strong&gt;can also be used for the start or creation date/time (depending on what information item is being modelled). &lt;strong&gt;EndDateTime &lt;/strong&gt;may not always be used but could also be adopted for expiry dates (again, dependent on the information item being modelled and contextually known about by the information provider and display modules).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;SourceProvider&lt;/strong&gt;: This is the name of the &lt;em&gt;InformationProvider &lt;/em&gt;module that provided the &lt;em&gt;InformationItem&lt;/em&gt;. Queries and mapping against &lt;em&gt;InformationDisplay&lt;/em&gt; modules work against this property. Only registered &lt;em&gt;InformationProviders&lt;/em&gt; will have their data accepted and stored in the repository.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;LastNotification&lt;/strong&gt;, &lt;strong&gt;NextNotification &lt;/strong&gt;and &lt;strong&gt;NotificationRequired&lt;/strong&gt;: These fields control whether this module and associated collected information items support notification and any display providers should take this into account and display a notification when an item requires notification. The way a notification is display (if at all) is at the discretion of the &lt;em&gt;InformationDisplay&lt;/em&gt; module.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;InformationSource&lt;/strong&gt;: This property indicates the original source of the information. This might be a URL, file location, email account or anything.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: This property indicates if the &lt;em&gt;InformationItem&lt;/em&gt; is in fact an error item. These items typically aren't stored in the repository as normal information but are used to communicate errors to various modules and the engine itself, and are reported in event logs, traces etc.&lt;/p&gt; &lt;p&gt;So that's a small insight into the detailed design of this &lt;em&gt;software thingy&lt;/em&gt; aka &lt;em&gt;&lt;strong&gt;InformationAggregator&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;The next instalments will begin the focus on the interface implementations and how I see data going back and forth to the engine. Hopefully its not too boring, and as I mentioned, t his is a work in progress. I welcome any critique, suggestions and feedback.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6611179" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/pglavich/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/WCF/default.aspx">WCF</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Community+News/default.aspx">Community News</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>TechEd Oz 2008 Presentation Demos</title><link>http://weblogs.asp.net/pglavich/archive/2008/09/08/teched-oz-2008-presentation-demos.aspx</link><pubDate>Mon, 08 Sep 2008 06:12:59 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6608487</guid><dc:creator>Glav</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/pglavich/rsscomments.aspx?PostID=6608487</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/09/08/teched-oz-2008-presentation-demos.aspx#comments</comments><description>&lt;p&gt;Well TechEd Au 2008 is over and done with. I did a presentation called Productive WCF and as promised to all the delegates that attended my presentation (thank you very much for attending by the way), I have provided a link where you can download a ZIP file containing all the demo code.&lt;/p&gt; &lt;p&gt;You can download the code from &lt;a target="_blank" href="http://www.theglavs.com/DownloadItem.aspx?FileID=61"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;I hope everyone enjoyed TechEd and look forward to seeing everyone at the next big Tech event.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6608487" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/pglavich/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/TechEd/default.aspx">TechEd</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/WCF/default.aspx">WCF</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Community+News/default.aspx">Community News</category></item><item><title>EOAST - Evolution of a software thingy - Part 2</title><link>http://weblogs.asp.net/pglavich/archive/2008/08/11/eoast-evolution-of-a-software-thingy-part-2.aspx</link><pubDate>Mon, 11 Aug 2008 05:14:59 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6503913</guid><dc:creator>Glav</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/pglavich/rsscomments.aspx?PostID=6503913</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/08/11/eoast-evolution-of-a-software-thingy-part-2.aspx#comments</comments><description>&lt;p&gt;In a &lt;a href="http://weblogs.asp.net/pglavich/archive/2008/08/04/eoast-evolution-of-a-software-thingy-part-1.aspx" target="_blank"&gt;part 1 of this series&lt;/a&gt;, I talked about what was the purpose of coming up with this "software thingy". Now I will tackle some of the design aspects that have evolved as I have been working on it.&lt;/p&gt; &lt;p&gt;Just to mention the requirements again though, it must be able to gather and store information from literally any source, and not tied to one collection mechanism. It must also be able to display any data in any format, typically something that the user/administrator configures to their liking. It must be easy to develop the collection and display parts. The main engine will take care of scheduling collections and storage of the data. Data can be pushed to it, not just collected. Must be reliable and "non blocking' in the event of a bad collection or display module.&lt;/p&gt; &lt;p&gt;It needs to allow me to exercise some of the new fandangled technologies but not at the expense of functionality.&lt;/p&gt; &lt;p&gt;Whew. Thats it in a nutshell. So what have I come up with so far (remember, being a pet project, its really a moving target). The diagram below shows a conceptual diagram of what needs to occur and the logical boundaries of components.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/EOASTEvolutionofasoftwarethingyPart2_807C/image.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/EOASTEvolutionofasoftwarethingyPart2_807C/image_thumb.png" width="509" height="341"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Obviously, a common element to house each item of information would be a good way to go initially. Something that caters for all types of information, with indicators pertaining to its source. As long as the data can be stored, and ideally searched, the display of that item is almost irrelevant for now.&lt;/p&gt; &lt;p&gt;Here is a sketching of the information items I initially wanted to capture/cater for.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/EOASTEvolutionofasoftwarethingyPart2_807C/image_3.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/EOASTEvolutionofasoftwarethingyPart2_807C/image_thumb_3.png" width="515" height="388"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;So with the above things in mind, it seemed appropriate that I dub this piece of software the "&lt;em&gt;&lt;strong&gt;Information Aggregator&lt;/strong&gt;&lt;/em&gt;". Yes, like an RSS aggregator but with general information item in mind, which may or not be RSS items.&lt;/p&gt; &lt;p&gt;Continuing with the high level design though, extrapolating the above 2 diagrams further, and taking into account how I want the entire process to operate, below is an initial diagram of some components/services and how I expect interfaces and information flow to occur.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/EOASTEvolutionofasoftwarethingyPart2_807C/image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/EOASTEvolutionofasoftwarethingyPart2_807C/image_thumb_4.png" width="523" height="356"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;You can see that the "Engine" is the core component. The idea is that it maintains a list of all collection agents and display agents. The engine will co-ordinate scheduling of collections from the various agents, and also allow registered agents to push information to the engine.&lt;/p&gt; &lt;p&gt;Separately, upon receiving information or based on request from display agents, the engine will push information to any display agents, that have been associated with a particular collection type.&lt;/p&gt; &lt;p&gt;You can also see the interfaces that I have begun to design here. I will delve more into this in the next post, however the main interfaces being &lt;font size="2" face="Courier New"&gt;IPluginModule&lt;/font&gt;, &lt;font size="2" face="Courier New"&gt;IInformationPush&lt;/font&gt; and &lt;font size="2" face="Courier New"&gt;IInformationPull&lt;/font&gt;. &lt;font size="2" face="Courier New"&gt;IPluginModule&lt;/font&gt; being the interface that all compliant modules must implement. &lt;font size="2" face="Courier New"&gt;IInformationPush&lt;/font&gt; and &lt;font size="2" face="Courier New"&gt;IInformationPull&lt;/font&gt; are optional (although at least 1 makes sense) depending on the type of the module.&lt;/p&gt; &lt;p&gt;&lt;em&gt;Note: I am aware you could probably use one of the composite application blocks to achieve an outcome similar to what I describe here, but I didn't want to rely on anything like that. Mainly because this is about learning and playing with stuff, as much as getting to an end solution.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;So the eventual concept being built, is that information gets collected from some collection providers, lets say a provider called &lt;font size="2"&gt;&lt;em&gt;GlavsEmail&lt;/em&gt;&lt;/font&gt; and &lt;font size="2"&gt;&lt;em&gt;GlavsNoteEntry&lt;/em&gt;&lt;/font&gt;. &lt;/p&gt; &lt;p&gt;I have 3 registered display providers:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;A balloon notification&lt;/li&gt; &lt;li&gt;A full detail display&lt;/li&gt; &lt;li&gt;A summary display. &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;I map the &lt;font size="2"&gt;&lt;em&gt;GlavsEmail&lt;/em&gt;&lt;/font&gt; information provider to the balloon notification and the summary display. I map the &lt;font size="2"&gt;&lt;em&gt;GlavsNoteEntry &lt;/em&gt;&lt;/font&gt;to the full detail display. &lt;/p&gt; &lt;p&gt;I set up the schedule for the &lt;font size="2"&gt;&lt;em&gt;GlavsEmail&lt;/em&gt;&lt;/font&gt; collection to occur every 1 hour. I set the schedule for the &lt;font size="2"&gt;&lt;em&gt;GlavsNoteEntry&lt;/em&gt;&lt;/font&gt; o be manually initiated (ie. by the information provider itself). &lt;/p&gt; &lt;p&gt;The engine should now perform the necessary collections when required, and when elements of &lt;font size="2"&gt;&lt;em&gt;GlavsEmail&lt;/em&gt;&lt;/font&gt; are gathered, display those using the 2 mapped display providers (balloon and summary), and the &lt;font size="2"&gt;&lt;em&gt;GlavsNoteEntry &lt;/em&gt;&lt;/font&gt;gets displayed using the full detail display. &lt;/p&gt; &lt;p&gt;At any time I can change this mapping. Also, all of the information from those sources is stored in SQL for easy searching and extraction if required. All I would typically have to do is register the collection and display providers, map them accordingly, and set up the access credentials for the collection provider (email in this case).&lt;/p&gt; &lt;p&gt;Thats it for this post. Next post I will delve more into the design of the interfaces, and technical details of the software (might be a few posts actually). Mind you, its still a moving target and not complete (like most of my personal pet projects) so don't expect enterprise level detail and a complete publicly consumable API.&lt;/p&gt; &lt;p&gt;The post after that will probably show you the product in action :-)&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6503913" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/pglavich/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/WCF/default.aspx">WCF</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Community+News/default.aspx">Community News</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/XAML/default.aspx">XAML</category></item><item><title>EOAST - Evolution of a software thingy - Part 1</title><link>http://weblogs.asp.net/pglavich/archive/2008/08/04/eoast-evolution-of-a-software-thingy-part-1.aspx</link><pubDate>Mon, 04 Aug 2008 05:48:10 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6479671</guid><dc:creator>Glav</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/pglavich/rsscomments.aspx?PostID=6479671</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/08/04/eoast-evolution-of-a-software-thingy-part-1.aspx#comments</comments><description>&lt;p&gt;Its been a little while since I have blogged as I haven't had very many value items to add to the blogosphere lately. However, I have been steadily (albeit slowly) working away on a little software project that may or may not see the light of day, but it has been a fun learning experience, and may eventually come to something. If nothing else, its a good testbed for a number of latest technologies.&lt;/p&gt; &lt;p&gt;I decided to chronicle some aspects of this software "thingy", hence the blog title "&lt;em&gt;Evolution of a software thingy&lt;/em&gt;" - EOAST (you gotta have an acronym otherwise you don't exist :-) )&lt;/p&gt; &lt;p&gt;So this first post is the requirements if you will, the business drivers behind what and why I decided to do what I did.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;u&gt;Context&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;If you have read any of my previous rants, you'll note that I am not the biggest fan of the latest incarnation of outlook. I use it daily, and rely on it, but its slow, often locks up (particularly on slower links) and generally sucks the life from my system.&lt;/p&gt; &lt;p&gt;Additionally, like most people, I use a number of various tools to collect information for either storage, perusal, reference and a bunch of other things.&lt;/p&gt; &lt;p&gt;The collection of various information pieces shows a lot of similarity with each other, the main difference being collection frequency or scheduling, management of the information, and its presentation. For all the tools I use, none of them are exactly how I want them. Each one has different parts I like and dislike and merging the information they gather into a manageable unit is tedious, if not almost impossible in some cases. Think blog aggregators, email, twitter etc. Essentially, they all collect some information at different frequencies or schedules and display it for manipulation or searching, sometimes storing it for later retrieval or whatever. &lt;/p&gt; &lt;p&gt;That's the pain point part. I also wanted to have a purpose for some of my technological investigations. We all know that you can play with a new technology like Entity Framework, or Linq to SQL and make it do what the examples do. However, when hard pressed to do something that meets a requirement, not a technology demonstration, and suddenly the game changes, and efficiencies and/or deficiencies are far more apparent. So essentially I wanted to play with some new tech as well to get a real feel for its capabilities.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;u&gt;Requirements&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;So with that in mind, my requirements for my "&lt;em&gt;Software Thingy&lt;/em&gt;" are as follows:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Must be able to collect information at various scheduling intervals, whether monthly, daily, hourly, every minute, or manually initiated. Additionally, it must also be able to push information, rather than simply request via a schedule. Think Microsoft exchange (push) and blog readers (pull).  &lt;li&gt;it must store this information that it collects into a reliable store, SQL Server being the obvious candidate. This will cater for large volumes and easy searching. (Think problems with large Outlook PST files).  &lt;li&gt;It must be reliable to handle badly written modules that it interfaces with. If something is taking too long, or just plain dead, the main application/engine will not die as well and render itself unusable (ummmm....Outlook again :-) ).  &lt;li&gt;It must not be tied to one method of collecting information. It must be flexible enough to gather information from anywhere. Blogs, twitter, POP email, exchange email, manual entry into&amp;nbsp; some data capturing app, text files, anything.  &lt;li&gt;it must not be tied to one display method. I want the ability to determine how particular information is displayed. I'd like to be able to map the gathering of information from one source, to a certain display method, or even multiple display methods, all administratively.  &lt;li&gt;I don't want to do it all. I don't have that much time or smarts. I would like to make something very easy to develop display modules or information gathering modules so that I can get perhaps a WPF guru to make me a slick WPF display module, without having to care where the info comes from and how its collected. Similarly for the information gathering. I'll write the items that pertain to me, and allow others to easily bolt on a different form of information gathering and not necessarily care about how its stored nor displayed.  &lt;li&gt;I want to utilise technologies such as WCF (my favourite), Linq to SQL, WPF and any other thing that makes sense.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Next up will be the initial design that I have come up with. Stay tuned.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6479671" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/pglavich/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/WCF/default.aspx">WCF</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Community+News/default.aspx">Community News</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>MSFeedsSync - feeds Synchronization has stopped working issue</title><link>http://weblogs.asp.net/pglavich/archive/2008/08/03/msfeedssync-feeds-synchronization-has-stopped-working-issue.aspx</link><pubDate>Sun, 03 Aug 2008 10:59:30 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6475323</guid><dc:creator>Glav</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/pglavich/rsscomments.aspx?PostID=6475323</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/08/03/msfeedssync-feeds-synchronization-has-stopped-working-issue.aspx#comments</comments><description>&lt;p&gt;Recently (and quite randomly I might add), I had an error dialog popup continuously, every 5-10 minutes which read:&lt;/p&gt; &lt;p&gt;"&lt;font size="2" face="Courier New"&gt;MSFeeds Synchronization has stopped working (2054)"&lt;/font&gt;&lt;/p&gt; &lt;p&gt;It was driving me crazy and was unsure how to resolve. There is actually not that much on the net about &lt;a href="http://msmvps.com/blogs/spywaresucks/archive/2008/07/31/1642758.aspx" target="_blank"&gt;but this post&lt;/a&gt; got me going in the right direction.&lt;/p&gt; &lt;p&gt;Basically, I first disabled the service by typing at the command prompt:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font size="2" face="Courier New"&gt;msfeedssync disable&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Then I deleted all my files (which included many feeds I was no longer using) from the following dir:&lt;/p&gt; &lt;p&gt;&lt;font size="2" face="Courier New"&gt;\Users\%username%\AppData\Local\Microsoft\Feeds&lt;/font&gt;&lt;/p&gt; &lt;p&gt;then re-enabled the feeds service by typing:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font size="2" face="Courier New"&gt;msfeedssync enable&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;And all was good again.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6475323" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/pglavich/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Vista/default.aspx">Vista</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/General/default.aspx">General</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Community+News/default.aspx">Community News</category></item></channel></rss>