<?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>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>3</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>3</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>0</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><item><title>VisualSVN - Subversion within Visual Studio</title><link>http://weblogs.asp.net/pglavich/archive/2008/07/30/visualsvn-subversion-within-visual-studio.aspx</link><pubDate>Wed, 30 Jul 2008 02:23:59 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6459127</guid><dc:creator>Glav</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/pglavich/rsscomments.aspx?PostID=6459127</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/07/30/visualsvn-subversion-within-visual-studio.aspx#comments</comments><description>&lt;p&gt;I am a big fan of &lt;a href="http://subversion.tigris.org/" target="_blank"&gt;Subversion&lt;/a&gt;. I like TFS too, but &lt;a href="http://subversion.tigris.org/" target="_blank"&gt;subversion&lt;/a&gt; is more suited to my small scale personal needs whereas TFS is more in the corporate space, or at least, more in the "&lt;em&gt;requires more juice&lt;/em&gt;" space. Juice that I don't really have.&lt;/p&gt; &lt;p&gt;So, I use subversion for a majority of my personal development. I like it. I normally use &lt;a href="http://tortoisesvn.tigris.org/" target="_blank"&gt;TortoiseSVN&lt;/a&gt; for the explorer integration and have been playing quite happily with that.&lt;/p&gt; &lt;p&gt;Recently though, I grabbed me a copy of &lt;a href="http://www.visualsvn.com/visualsvn/" target="_blank"&gt;VisualSVN&lt;/a&gt; which adds Visual Studio integration for subversion. I like it, I like it a lot. It makes things very nice indeed. Here are some screen shots. Highly recommended.&lt;/p&gt; &lt;p&gt;Show Log&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/VisualSVNSubversionwithinVisualStudio_BD0B/image.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/VisualSVNSubversionwithinVisualStudio_BD0B/image_thumb.png" width="483" height="484"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Visual Status Indicators in the solution&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/VisualSVNSubversionwithinVisualStudio_BD0B/image_3.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/VisualSVNSubversionwithinVisualStudio_BD0B/image_thumb_3.png" width="152" height="244"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Context menu within Visual Studio solution explorer&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/VisualSVNSubversionwithinVisualStudio_BD0B/image_4.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/VisualSVNSubversionwithinVisualStudio_BD0B/image_thumb_4.png" width="605" height="484"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6459127" 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/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Community+News/default.aspx">Community News</category></item><item><title>ASP.NET Podcast Show #119 - Using the History (Back) Functionality with the ASP.NET AJAX Web Services in .NET 3.5 Service Pack 1 Beta 1</title><link>http://weblogs.asp.net/pglavich/archive/2008/07/02/asp-net-podcast-show-119-using-the-history-back-functionality-with-the-asp-net-ajax-web-services-in-net-3-5-service-pack-1-beta-1.aspx</link><pubDate>Wed, 02 Jul 2008 03:49:11 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6348373</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=6348373</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/07/02/asp-net-podcast-show-119-using-the-history-back-functionality-with-the-asp-net-ajax-web-services-in-net-3-5-service-pack-1-beta-1.aspx#comments</comments><description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://weblogs.asp.net/wallym" target="_blank"&gt;Wally&lt;/a&gt; has put out another podcast following his series around some of the latest AJAX features in .Net 3.5 SP1. In this installment, he looks at the history (back button) support.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.scalabledevelopment.com/ftp/ScalabilityWithDotNet.xml"&gt;Subscribe to Everything&lt;/a&gt;. &lt;p&gt;Original Url: &lt;a href="http://aspnetpodcast.com/CS11/blogs/asp.net_podcast/archive/2008/07/01/asp-net-podcast-show-119-using-the-history-back-functionality-with-the-asp-net-ajax-web-services-in-net-3-5-service-pack-1-beta-1.aspx"&gt;http://aspnetpodcast.com/CS11/blogs/asp.net_podcast/archive/2008/07/01/asp-net-podcast-show-119-using-the-history-back-functionality-with-the-asp-net-ajax-web-services-in-net-3-5-service-pack-1-beta-1.aspx&lt;/a&gt; &lt;p&gt;&lt;a href="http://www.scalabledevelopment.com/ftp/ASPNETPodcast-WMV.xml"&gt;Subscribe to WMV format&lt;/a&gt;. &lt;p&gt;&lt;a href="http://www.scalabledevelopment.com/ftp/ASPNETPodcast-MP4.xml"&gt;Subscribe to M4V for iPod Users&lt;/a&gt;. &lt;p&gt;&lt;a href="http://www.scalabledevelopment.com/ftp/ASPNETPodcast-MP3.xml"&gt;Subscribe to MP3 (Audio only)&lt;/a&gt;.  &lt;p&gt;&lt;a href="http://www.aspnetpodcast.com/videofiles/aspnetpodcast20080701-ajaxwebserviceshistory.wmv"&gt;Download WMV&lt;/a&gt;. &lt;p&gt;&lt;a href="http://www.aspnetpodcast.com/videofiles/aspnetpodcast20080701-ajaxwebserviceshistory.m4v"&gt;Download M4V for iPod Users&lt;/a&gt;. &lt;p&gt;&lt;a href="http://www.aspnetpodcast.com/podcastfiles/aspnetpodcast20080701-ajaxwebserviceshistory.mp3"&gt;Download MP3 (Audio only)&lt;/a&gt;. &lt;p&gt;&lt;a href="http://www.aspnetpodcast.com/CS11/files/folders/podcastsupportfiles/entry1176.aspx"&gt;Download PPT associated file&lt;/a&gt;.  &lt;p&gt;Show Notes: &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.aspnetpodcast.com/CS11/blogs/asp.net_podcast/archive/2008/05/05/asp-net-podcast-show-111-asp-net-ajax-with-virtual-earth.aspx"&gt;This show is an extension of Show #110 on ASP.NET AJAX and Live Maps&lt;/a&gt;.  &lt;li&gt;Back and forward are now enabled.  &lt;li&gt;Data stored on the url.  &lt;li&gt;Upcoming Community Events:  &lt;ul&gt; &lt;li&gt;GiveCamp in Ann Arbor, MI. &lt;a href="http://www.annarborgivecamp.org/"&gt;http://www.annarborgivecamp.org&lt;/a&gt;.&amp;nbsp; Check for Satellite events.  &lt;li&gt;CodeStock in Knoxville on August 9.&amp;nbsp; &lt;a href="http://www.codestock.org/"&gt;http://www.codestock.org&lt;/a&gt;.  &lt;li&gt;devLink in Nashville on August 22-23.&amp;nbsp; &lt;a href="http://www.devlink.net/"&gt;http://www.devlink.net&lt;/a&gt;.  &lt;li&gt;INETA Silverlight Challenge..&amp;nbsp; &lt;a href="http://www.ineta.org/silverlight"&gt;http://www.ineta.org/silverlight&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Source Code: &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:ScriptManager ID="sm" runat="server" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EnableHistory="true" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EnableSecureHistoryState="true" &amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Services&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:ServiceReference Path="~/GetMaps.asmx" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Services&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:ScriptManager&amp;gt;&lt;br&gt;&amp;lt;script language="javascript" type="text/javascript"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var Map;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var userNavigated = false;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function pageLoad() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sys.Application.add_navigate(onNavigate);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetMaps.MapData(SetupMap);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function onNavigate(sender, e) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (userNavigated) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; restorePage(e.get_state());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function restorePage(PageState) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var UpperLeftLat = new Number(PageState.UpperLeftLat);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var UpperLeftLon = new Number(PageState.UpperLeftLon);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var BottomRightLat = new Number(PageState.LowerRightLat);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var BottomRightLon = new Number(PageState.LowerRightLon);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var ZoomLevel = new Number(PageState.ZoomLevel);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var Lat = (UpperLeftLat + BottomRightLat ) / 2;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var Lon = (UpperLeftLon + BottomRightLon) / 2;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!(isNaN(Lat) || isNaN(Lon))) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map.LoadMap(new VELatLong(Lat, Lon), ZoomLevel, 'h', false);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetMaps.GetPointData(10, UpperLeftLat, UpperLeftLon,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BottomRightLat, BottomRightLon, GetDataSuccess);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function SetupMap(result) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var Lat = result.Center.Lat;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var Lon = result.Center.Lon;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var ZoomLevel = result.ZoomLevel;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var MapView, TopLeft, BottomRight;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map = new VEMap('MapDiv');&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map.LoadMap(new VELatLong(Lat, Lon), ZoomLevel, 'h', false);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MapView = Map.GetMapView();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TopLeft = MapView.TopLeftLatLong;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BottomRight = MapView.BottomRightLatLong;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //TopleftLatLong and BottomRightLatLong return a VELatLong object.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map.AttachEvent("onchangeview", MapChangedView);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetupHistory();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetMaps.GetPointData(10, TopLeft.Latitude, TopLeft.Longitude,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BottomRight.Latitude, BottomRight.Longitude, GetDataSuccess);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (e) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert("Error: " + e);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function GetDataSuccess(result) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var i = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var Lat, Lon;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i = 0; i &amp;lt; result.length; i++) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lat = result[i].Location.Lat;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lon = result[i].Location.Lon;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var shape = new VEShape(VEShapeType.Pushpin, new VELatLong(Lat, Lon));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; shape.SetTitle("Title: " + i);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; shape.SetDescription(result[i].Description);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map.AddShape(shape);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function SetupHistory() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var PageTitle;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var now = new Date();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var CurrentTime = now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PageTitle = "AJAX History Test Time:" + CurrentTime;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MapView = Map.GetMapView();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TopLeft = MapView.TopLeftLatLong;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BottomRight = MapView.BottomRightLatLong;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ZoomLevel = Map.GetZoomLevel();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var PageState =&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "UpperLeftLat": TopLeft.Latitude,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "UpperLeftLon": TopLeft.Longitude,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "LowerRightLat": BottomRight.Latitude,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "LowerRightLon": BottomRight.Longitude,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "ZoomLevel": ZoomLevel&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userNavigated = false;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sys.Application.addHistoryPoint(PageState, PageTitle);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userNavigated = true;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function MapChangedView(e) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map.DeleteAllShapes();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MapView = Map.GetMapView();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TopLeft = MapView.TopLeftLatLong;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BottomRight = MapView.BottomRightLatLong;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetupHistory();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetMaps.GetPointData(10, TopLeft.Latitude, TopLeft.Longitude,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BottomRight.Latitude, BottomRight.Longitude, GetDataSuccess);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;lt;/script&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id="MapDiv" style="position:relative; width:450px; height: 350px;" &amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6348373" 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>ASP.NET Podcast Show #118 - Peer-To-Peer with Windows Communication Foundation (WCF)</title><link>http://weblogs.asp.net/pglavich/archive/2008/06/20/asp-net-podcast-show-118-peer-to-peer-with-windows-communication-foundation-wcf.aspx</link><pubDate>Thu, 19 Jun 2008 22:20:56 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6297519</guid><dc:creator>Glav</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/pglavich/rsscomments.aspx?PostID=6297519</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/06/20/asp-net-podcast-show-118-peer-to-peer-with-windows-communication-foundation-wcf.aspx#comments</comments><description>&lt;p&gt;So I *finally* managed to get a videocast/podcast done. &lt;a href="http://weblogs.asp.net/wallym" target="_blank"&gt;Wally&lt;/a&gt; has been harassing me for ages, and I eventually had the time to get one done. This one is on the Peer to Peer support in Windows Communication Foundation (WCF) and how easy it is to do. Its remarkably simple yet extremely powerful.&lt;/p&gt; &lt;p&gt;I hope you enjoy it.&lt;/p&gt; &lt;h5&gt;&lt;b&gt;&lt;i&gt;&lt;a href="http://www.scalabledevelopment.com/ftp/ScalabilitywithDotNet.xml"&gt;Subscribe to EVERYTHING &lt;/a&gt;&lt;/i&gt;&lt;/b&gt;&amp;lt;-- What you REALLY WANT TO DO!&lt;/h5&gt; &lt;p&gt;Original Url: &lt;a href="http://aspnetpodcast.com/CS11/blogs/asp.net_podcast/archive/2008/06/19/asp-net-podcast-show-118-paul-on-peer-to-peer-with-windows-communication-foundation.aspx"&gt;http://aspnetpodcast.com/CS11/blogs/asp.net_podcast/archive/2008/06/19/asp-net-podcast-show-118-paul-on-peer-to-peer-with-windows-communication-foundation.aspx &lt;/a&gt; &lt;p&gt;&lt;a href="http://www.scalabledevelopment.com/ftp/ASPNETPodcast-WMV.xml"&gt;Subscribe to WMV Video only&lt;/a&gt;. &lt;p&gt;&lt;a href="http://www.scalabledevelopment.com/ftp/ASPNETPodcast-MP4.xml"&gt;Subscribe to M4V Video only&lt;/a&gt;. &lt;p&gt;&lt;a href="http://www.scalabledevelopment.com/ftp/ASPNETPodcast-MP3.xml"&gt;Subscribe to MP3 Audio only&lt;/a&gt;. &lt;p&gt;&lt;a href="http://www.aspnetpodcast.com/videofiles/aspnetpodcast20080619-paulonp2pwithwcf.wmv"&gt;Download WMV&lt;/a&gt;. &lt;p&gt;&lt;a href="http://www.aspnetpodcast.com/videofiles/aspnetpodcast20080619-paulonp2pwithwcf.m4v"&gt;Download M4V&lt;/a&gt;. &lt;p&gt;&lt;a href="http://www.aspnetpodcast.com/podcastfiles/aspnetpodcast20080619-paulonp2pwithwcf.mp3"&gt;Download MP3&lt;/a&gt;. &lt;p&gt;Show Notes: &lt;ul&gt; &lt;li&gt;Understanding PNRP Clounds&lt;br&gt;&lt;a href="http://blogs.msdn.com/p2p/archive/2007/06/12/understanding-pnrp-clouds.aspx"&gt;http://blogs.msdn.com/p2p/archive/2007/06/12/understanding-pnrp-clouds.aspx&lt;/a&gt; &lt;li&gt;Peer Name Resolution Protocol&lt;br&gt;&lt;a href="http://technet.microsoft.com/en-us/library/bb726971.aspx"&gt;http://technet.microsoft.com/en-us/library/bb726971.aspx&lt;/a&gt; &lt;li&gt;Peer-to-Peer Programming with WCF and .NET Framework 3.5&lt;br&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc297274.aspx"&gt;http://msdn.microsoft.com/en-us/library/cc297274.aspx&lt;/a&gt; &lt;li&gt;&lt;a href="http://www.ineta.org/Champions/CommunityChampionInfo.aspx"&gt;INETA Community Champions Information&lt;/a&gt;.  &lt;li&gt;&lt;a href="http://www.ineta.org/Silverlight"&gt;Silverlight Challenge&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a href="http://aspnetpodcast.com/CS11/files/folders/podcastsupportfiles/entry1169.aspx"&gt;Download Source Code&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6297519" 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/podcast/default.aspx">podcast</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/WCF/default.aspx">WCF</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/General/default.aspx">General</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/P2P/default.aspx">P2P</category></item><item><title>WCF services getting errors when hosting in IIS</title><link>http://weblogs.asp.net/pglavich/archive/2008/06/04/wcf-services-getting-errors-when-hosting-in-iis.aspx</link><pubDate>Wed, 04 Jun 2008 00:42:29 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6246202</guid><dc:creator>Glav</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/pglavich/rsscomments.aspx?PostID=6246202</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/06/04/wcf-services-getting-errors-when-hosting-in-iis.aspx#comments</comments><description>&lt;p&gt;This post is more for my own records than anything and I have been meaning to write this down for some time.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;u&gt;Problem:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Had a WCF Web Service that was being hosted in IIS. Worked in dev and test fine. Moved to prod and bang, I get the following error:&lt;/p&gt; &lt;h6&gt;&lt;font size="2" face="Courier New"&gt;This collection already contains an address with scheme http. There can be at most one address per scheme in this collection. &lt;br&gt;Parameter name: item&lt;/font&gt;&lt;/h6&gt; &lt;p&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;Description&lt;/strong&gt;: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. &lt;br&gt;Exception Details: System.ArgumentException: This collection already contains an address with scheme http.&amp;nbsp; There can be at most one address per scheme in this collection. &lt;br&gt;&lt;strong&gt;Parameter name&lt;/strong&gt;: item&lt;/font&gt;&lt;/font&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;u&gt;Issue:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The production server had multiple host headers defined within IIS, meaning that the HTTP base address being passed through actually consisted of 2 base addresses with the HTTP scheme, which is not allowed when hosting WCF services in WCF.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;u&gt;The Solution:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Easy&lt;/strong&gt;: Remove the multiple host headers. In my scenario, this was a viable solution as the multiple host headers were not actually necessary and represented some 'left over' configuration.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Harder, but more flexible and solid&lt;/strong&gt;: Create a custom service factory to strip out the unwanted base address as outlined in &lt;a href="http://www.robzelt.com/blog/2007/01/24/WCF+This+Collection+Already+Contains+An+Address+With+Scheme+Http.aspx" target="_blank"&gt;a good post by Rob Zelt&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6246202" 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/IIS/default.aspx">IIS</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>VSTS 2008, Web Tests and using Fiddler</title><link>http://weblogs.asp.net/pglavich/archive/2008/06/03/vsts-2008-web-tests-and-using-fiddler.aspx</link><pubDate>Tue, 03 Jun 2008 06:04:23 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6244002</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=6244002</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/06/03/vsts-2008-web-tests-and-using-fiddler.aspx#comments</comments><description>&lt;p&gt;I have been doing some performance and load testing of a web application I have been working on lately. Most of my previous experience was with the 2005 flavour of VSTS and I was keen to play with the 2008 version to see what improvements have been made. This web application is quite heavy in terms of Javascript and AJAX feature usage.&lt;/p&gt; &lt;p&gt;I am happy to report that things are much better in this version, but still not as easy as I had hoped. Form value extraction and recognition of AJAX requests seem to work well.&lt;/p&gt; &lt;p&gt;However, I still had some problems running the tests. For the most part they would run ok, but would cause errors on the server such as:&lt;/p&gt; &lt;p&gt;&lt;font size="2" face="Courier New"&gt;'Index was outside the bounds of the array.' at System.Web.Handlers.ScriptResourceHandler.ProcessRequest&lt;/font&gt;&lt;/p&gt; &lt;p&gt;which was always when accessing some script resource via the &lt;font size="2" face="Courier New"&gt;ScriptResource.axd&lt;/font&gt; handler.&lt;/p&gt; &lt;p&gt;I could see no reference to any of my code in there. Everything seemed to work as far as the client aspect was concerned (examining the results of the web tests) but this did not sit too well with me.&lt;/p&gt; &lt;p&gt;So I decided to try and record some tests via &lt;a href="http://www.fiddler2.com" target="_blank"&gt;Fiddler2 HTTP proxy tool&lt;/a&gt; to see if that helped. There was definitely a little more work in getting this to record and playback web tests properly, but I was able to get some cleaner looking tests, and no errors generated on the server using this method. I did verify that all the functionality was being exercised on the server just in case I was missing anything and getting false positives.&lt;/p&gt; &lt;p&gt;The procedure I used to record web tests and get them working was.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Load Fiddler2  &lt;li&gt;Load Internet Explorer and browse to the site, running through my specific performance test scenario.  &lt;li&gt;In Fiddler, press F12 to ensure no more sessions/traffic is captured.  &lt;li&gt;Select all the sessions by using &lt;font size="2" face="Courier New"&gt;CTRL-A&lt;/font&gt; (ensuing there was no other traffic that got recorded at the time. If there was, just highlight that session and delete it)  &lt;li&gt;Go to the &lt;font size="2" face="Courier New"&gt;File &amp;gt;&amp;gt; Save &amp;gt;&amp;gt; Sessions &amp;gt;&amp;gt; As Visual Studio Web Test&lt;/font&gt; menu option&lt;a href="http://www.theglavs.com/article_Images/VSTS2008WebTestsandusingFiddler_B8C3/image.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/VSTS2008WebTestsandusingFiddler_B8C3/image_thumb.png" width="450" height="164"&gt;&lt;/a&gt;  &lt;li&gt;In Visual Studio 2008, within your test project, add in the existing web test.  &lt;li&gt;VS2008 will add some 'Form Field' extraction rules to each request. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/VSTS2008WebTestsandusingFiddler_B8C3/image_3.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/VSTS2008WebTestsandusingFiddler_B8C3/image_thumb_3.png" width="211" height="79"&gt;&lt;/a&gt; &lt;/p&gt; &lt;ul&gt; &lt;li&gt;If you are using UpdatePanel's a lot and need to extract the ViewState from UpdatePanel delta responses, you will need to change the extraction rule.  &lt;li&gt;For this I created a Text Extraction rule.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/VSTS2008WebTestsandusingFiddler_B8C3/image_4.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/VSTS2008WebTestsandusingFiddler_B8C3/image_thumb_4.png" width="212" height="79"&gt;&lt;/a&gt; &lt;/p&gt; &lt;ul&gt; &lt;li&gt;This rule simply looks for &lt;font size="2" face="Courier New"&gt;__VIEWSTATE|&lt;/font&gt; (yes, that's a pipe char on the end) as the start text and a pipe &lt;font size="2" face="Courier New"&gt;|&lt;/font&gt; as the end delimiter text and extracts everything in between.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/VSTS2008WebTestsandusingFiddler_B8C3/image_5.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/VSTS2008WebTestsandusingFiddler_B8C3/image_thumb_5.png" width="323" height="203"&gt;&lt;/a&gt; &lt;/p&gt; &lt;ul&gt; &lt;li&gt;I had to add this extraction rule to each request, and replace the references to the old Form field extraction value&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/VSTS2008WebTestsandusingFiddler_B8C3/image_6.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/VSTS2008WebTestsandusingFiddler_B8C3/image_thumb_6.png" width="244" height="37"&gt;&lt;/a&gt; &lt;/p&gt; &lt;ul&gt; &lt;li&gt;with references to our new AJAX text extraction rule.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/VSTS2008WebTestsandusingFiddler_B8C3/image_7.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" src="http://www.theglavs.com/article_Images/VSTS2008WebTestsandusingFiddler_B8C3/image_thumb_7.png" width="244" height="46"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Like I said, it was a little bit of work to go through each page request and fix it in this manner, but the tests execute cleanly every time with no errors on the server as previously mentioned and it is actually a neater looking web test.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6244002" 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/Visual+Studio/default.aspx">Visual Studio</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/Performance/default.aspx">Performance</category></item><item><title>Profiling your AJAX Applications using AjaxView</title><link>http://weblogs.asp.net/pglavich/archive/2008/06/03/profiling-your-ajax-applications-using-ajaxview.aspx</link><pubDate>Tue, 03 Jun 2008 05:35:09 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6243959</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=6243959</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/06/03/profiling-your-ajax-applications-using-ajaxview.aspx#comments</comments><description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;Don't know if this has already been discussed at length before, but I found an interesting little tool from Microsoft Research for profiling the Javascript functionality in your AJAX applications.&lt;/p&gt; &lt;p&gt;Its called &lt;a href="http://research.microsoft.com/projects/ajaxview/" target="_blank"&gt;AjaxView&lt;/a&gt; and can remotely monitor any AJAX web app that is currently on the web, locally or whatever.&lt;/p&gt; &lt;p&gt;You basically, install a small proxy application, then change your Internet Explorer LAN connection to go through a proxy of &lt;font size="2" face="Courier New"&gt;localhost:8888.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Go and browse your web application or your own AJAX app, and execute your normal series of functionality.&lt;/p&gt; &lt;p&gt;Once your done, you then browse to a page generated by the tool itself&lt;/p&gt; &lt;p&gt;&lt;a href="http://fakeurl.com/?&amp;amp;AJAXVIEWREQUEST=GET=main.html"&gt;http://fakeurl.com/?&amp;amp;AJAXVIEWREQUEST=GET=main.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This gets you something like this:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/ProfilingyourAJAXApplicationsusingAjaxVi_C482/clip_image002.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="clip_image002" src="http://www.theglavs.com/article_Images/ProfilingyourAJAXApplicationsusingAjaxVi_C482/clip_image002_thumb.jpg" width="553" height="379"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;You can then click on whatever item you want, typically the site that represents the worst performance. You'll then get something like this:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/ProfilingyourAJAXApplicationsusingAjaxVi_C482/clip_image00210.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="clip_image002[10]" src="http://www.theglavs.com/article_Images/ProfilingyourAJAXApplicationsusingAjaxVi_C482/clip_image00210_thumb.jpg" width="644" height="320"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Here I have clicked on the 'Mean Time (ms)' view to get column sorted by the slowest functions. If I want to drill down a bit more, I can click on the 'Details' link which gives me:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.theglavs.com/article_Images/ProfilingyourAJAXApplicationsusingAjaxVi_C482/clip_image00212.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="clip_image002[12]" src="http://www.theglavs.com/article_Images/ProfilingyourAJAXApplicationsusingAjaxVi_C482/clip_image00212_thumb.jpg" width="644" height="384"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This shows me a breakdown of which functions took how long.&lt;/p&gt; &lt;p&gt;Its actually a pretty quick way to get a good idea of what is consuming a lot of client side cycles from a Javascript perspective. The tool is a little raw and is still somewhat rough, but its easy enough to use and get going and worth a quick look.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6243959" 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/debugging/default.aspx">debugging</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/Performance/default.aspx">Performance</category></item><item><title>Visual Studio 2008 Team Test Issues</title><link>http://weblogs.asp.net/pglavich/archive/2008/05/21/visual-studio-2008-team-test-issues.aspx</link><pubDate>Wed, 21 May 2008 01:15:19 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6205842</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=6205842</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/05/21/visual-studio-2008-team-test-issues.aspx#comments</comments><description>&lt;p&gt;I have had &lt;a href="http://weblogs.asp.net/pglavich/archive/2008/02/25/why-wont-you-just-work.aspx" target="_blank"&gt;ongoing problems&lt;/a&gt; getting various tests to work using my installation of VS2008 Team Suite. Initially, I had a problem running unit tests (see here), then sometime after that, I had other niggling issues with code coverage and had to copy assemblies from Private folders to public folders and vice versa.&lt;/p&gt; &lt;p&gt;Recently, I tried recording some web tests so I can perform loading testing on a particular web application. As luck would have it, it was failing with the cryptic message shown in below:&lt;/p&gt; &lt;p&gt;&lt;font size="1" face="Courier"&gt;Method ‘CreateDataSourceWizard’ in type ‘Microsoft.VisualStudio.TestTools.LoadTest.WebTestEditorPane’ from assembly ‘Microsoft.VisualStudio.QualityTools.LoadTestPackage, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’ does not have an implementation.&lt;/font&gt; &lt;p&gt;Google gave me no juice on this and frustration was setting in.&lt;/p&gt; &lt;p&gt;I tried the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Lots of time checking versions of files and reflecting back over the assemblies mentioned in the error message.&lt;/li&gt; &lt;li&gt;Un-installed and re-installed the Team Test components.&lt;/li&gt; &lt;li&gt;Un-installed and re-installed Visual Studio 2008&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Nothing worked. Oddly, when I un-installed the Team Test components, I still had 'Test' options functioning in my VS2008 menu.&lt;/p&gt; &lt;p&gt;So I finally resolved this issue, and the solution was this:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Un-install Visual Studio 2008&lt;/li&gt; &lt;li&gt;Go to the directory where it was previously installed and manually remove the copious amounts of files and directories that were left over.&lt;/li&gt; &lt;li&gt;Perform a registry clean using this &lt;a href="http://www.registrycleanerforvista.com/" target="_blank"&gt;Registry Cleaner for Vista&lt;/a&gt;.&lt;/li&gt; &lt;li&gt;Re-installed Visual Studio 2008&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;And now it works. Finally.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6205842" 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/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/Performance/default.aspx">Performance</category></item><item><title>New feeds for the ASP.NET Podcast</title><link>http://weblogs.asp.net/pglavich/archive/2008/05/08/new-feeds-for-the-asp-net-podcast.aspx</link><pubDate>Thu, 08 May 2008 01:08:30 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6167558</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=6167558</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/05/08/new-feeds-for-the-asp-net-podcast.aspx#comments</comments><description>&lt;p&gt;Wally has created some new feeds for the ASP.NET Podcast&amp;nbsp; There is still the &lt;a href="http://www.scalabledevelopment.com/ftp/ScalabilityWithDotNet.xml"&gt;same general feed&lt;/a&gt;.&amp;nbsp; It will have all shows and all of the variations of the shows in it.&amp;nbsp; These include WMV, MP4/M4V, MP3, and whatever else one can throw in it. The rest of the feeds are:  &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.scalabledevelopment.com/ftp/ASPNETPodcast-wmv.xml"&gt;WMV feed&lt;/a&gt;.  &lt;li&gt;&lt;a href="http://www.scalabledevelopment.com/ftp/ASPNETPodcast-MP4.xml"&gt;MP4/M4V feed&lt;/a&gt;.  &lt;li&gt;&lt;a href="http://www.scalabledevelopment.com/ftp/ASPNETPodcast-MP3.xml"&gt;MP3 feed&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;If you have any problems, let me know ASAP! &lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6167558" 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/ASP.NET+AJAX/default.aspx">ASP.NET AJAX</category></item><item><title>Latest Podcasts</title><link>http://weblogs.asp.net/pglavich/archive/2008/05/05/latest-podcasts.aspx</link><pubDate>Mon, 05 May 2008 11:49:39 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6159063</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=6159063</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/05/05/latest-podcasts.aspx#comments</comments><description>&lt;p&gt;Wally has put up some new podcasts around using Google maps and virtual earth with ASP.NET AJAX.&lt;/p&gt; &lt;p&gt;You can check em out at the following links:&lt;/p&gt; &lt;p&gt;&lt;a href="http://aspnetpodcast.com/CS11/blogs/asp.net_podcast/archive/2008/05/01/asp-net-podcast-110-integrating-asp-net-ajax-with-google-maps.aspx"&gt;Integrating ASP.NET AJAX with Google Maps.&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://aspnetpodcast.com/CS11/blogs/asp.net_podcast/archive/2008/05/05/asp-net-podcast-show-111-asp-net-ajax-with-virtual-earth.aspx"&gt;ASP.NET AJAX with Virtual Earth&lt;/a&gt;&lt;/p&gt; &lt;p&gt;These podcasts allow you to explore mapping possibilities with the 2 popular mapping services currently available.&amp;nbsp; in combination with ASP.NET AJAX. &lt;/p&gt; &lt;p&gt;Check em out and get geographical !&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6159063" 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/ASP.NET+AJAX/default.aspx">ASP.NET AJAX</category></item><item><title>WiX - Painful at best</title><link>http://weblogs.asp.net/pglavich/archive/2008/04/29/wix-painful-at-best.aspx</link><pubDate>Tue, 29 Apr 2008 05:35:25 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6140210</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=6140210</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/04/29/wix-painful-at-best.aspx#comments</comments><description>&lt;p&gt;So I finally got WiX to create an installer for me after many hours of poor documentation, obscure errors and bizarre angle bracket syntax.&lt;/p&gt; &lt;p&gt;The latest error I have really annoyed me as there was no obvious indication what the error was and how to resolve it, which is really the purpose of this post. To share this so that others may benefit, and because my memory is so poor, I need to record it for later use :-)&lt;/p&gt; &lt;p&gt;Basically I got this:&lt;/p&gt; &lt;p&gt;&lt;font size="2" face="Courier New"&gt;candle.exe : error CNDL0001: Cannot set column 'Attributes' with value 239 because it is greater than the maximum allowed value for this column, 127.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Nice. I wont bore you with the vulgarities that I produced trying to decipher this message, but it ended up being the fact that I had put a &lt;font size="2" face="Courier New"&gt;&amp;lt;sql:sqlDatabase&amp;gt;&lt;/font&gt; server definition was inside a feature element rather than outside on its own.&lt;/p&gt; &lt;p&gt;So I had put this:&lt;/p&gt; &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;lt;sql:sqlDatabase Id="SqlDatabase" Server="[DATABASESERVERNAME]" Database="[DATABASENAME]" /&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;inside a &lt;font size="2" face="Courier New"&gt;&amp;lt;Component&amp;gt;&lt;/font&gt; tag. &lt;/p&gt; &lt;p&gt;Placing the &lt;font size="2" face="Courier New"&gt;&amp;lt;sql:sqlDatabase&amp;gt;&lt;/font&gt; tag back outside the &lt;font size="2" face="Courier New"&gt;&amp;lt;Component&amp;gt;&lt;/font&gt; tag fixed this issue.&lt;/p&gt; &lt;p&gt;Hope it saves others similar frustration.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6140210" 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/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://weblogs.asp.net/pglavich/archive/tags/SQL+Server/default.aspx">SQL Server</category></item><item><title>Remix in Oz</title><link>http://weblogs.asp.net/pglavich/archive/2008/04/28/remix-in-oz.aspx</link><pubDate>Mon, 28 Apr 2008 06:05:36 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6138134</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=6138134</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/04/28/remix-in-oz.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.microsoft.com/australia/remix08/index.aspx"&gt;Remix&lt;/a&gt;, is heading downunder and registrations are now open. You can register &lt;a href="http://www.microsoft.com/australia/remix08/index.aspx"&gt;here&lt;/a&gt;.This event is especially cool for the many people who did not get a chance to attend the actual Mix event in the United States (which is many of us). &lt;/p&gt; &lt;p&gt;Dates and locations are:&lt;/p&gt; &lt;h5&gt;&lt;b&gt;Sydney&lt;/b&gt;&lt;/h5&gt;&amp;nbsp;&amp;nbsp; May 20 &lt;br&gt;&amp;nbsp;&amp;nbsp; Powerhouse Museum&lt;br&gt;&amp;nbsp;&amp;nbsp; Harris Street, Ultimo  &lt;h5&gt;&lt;b&gt;Melbourne&lt;/b&gt;&lt;/h5&gt;&amp;nbsp;&amp;nbsp; May 22&lt;br&gt;&amp;nbsp;&amp;nbsp; Melbourne Town Hall&lt;br&gt;&amp;nbsp;&amp;nbsp; Cnr Swanston &amp;amp; Collins&lt;br&gt;&amp;nbsp;&amp;nbsp; Street, Melbourne  &lt;p&gt;There will be heaps of quality technical content from a bunch of &lt;a href="http://www.microsoft.com/australia/remix08/sessions.aspx"&gt;local technical rockstars&lt;/a&gt;, and I will be attending and participating as an expert in one of the "Ask the Experts" areas.&lt;/p&gt; &lt;p&gt;Look forward to seeing you there!&lt;/p&gt; &lt;p&gt;Oh, by the way, &lt;strong&gt;each&lt;/strong&gt; attendee receives a copy of Expression Studio 2 (rrp$1040) for &lt;strong&gt;free&lt;/strong&gt; when they register!&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://weblogs.asp.net/australia/remix08/index.aspx"&gt;&lt;img border="0" alt="The Next Web Now" src="http://www.microsoft.com/australia/remix08/images/bling/nextweb_08.jpg"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6138134" 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/MVP/default.aspx">MVP</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/Silverlight/default.aspx">Silverlight</category></item><item><title>MCTS in WCF</title><link>http://weblogs.asp.net/pglavich/archive/2008/04/20/mcts-in-wcf.aspx</link><pubDate>Sun, 20 Apr 2008 07:55:24 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6114325</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=6114325</wfw:commentRss><comments>http://weblogs.asp.net/pglavich/archive/2008/04/20/mcts-in-wcf.aspx#comments</comments><description>&lt;p&gt;So a little while ago, I &lt;a href="http://weblogs.asp.net/pglavich/archive/2007/12/02/wcf-beta-exam.aspx"&gt;mentioned that I did a WCF beta exam&lt;/a&gt; for a Microsoft Certified Technical Specialist. Its been a long time since I did that and I had kinda forgotten about it, but today I received the good news that I am now a MCTS in WCF!&lt;/p&gt; &lt;p&gt;WooHoo!&lt;/p&gt; &lt;p&gt;I really thought I had bombed that exam due to the very little prep that I had done, but fortunately that is not the case.&lt;/p&gt; &lt;p&gt;I would love to hear from anybody else (particularly any fellow australians) who have also done the beta exam and received their congratulatory email.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6114325" 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/Architecture/default.aspx">Architecture</category></item></channel></rss>