<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/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>Hirlpoo West : Customer Learnings</title><link>http://blogs.msdn.com/ddysart/archive/tags/Customer+Learnings/default.aspx</link><description>Tags: Customer Learnings</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Code Access Security and User Controls</title><link>http://blogs.msdn.com/ddysart/archive/2006/08/08/692102.aspx</link><pubDate>Tue, 08 Aug 2006 15:32:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:692102</guid><dc:creator>ddysart</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ddysart/comments/692102.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ddysart/commentrss.aspx?PostID=692102</wfw:commentRss><wfw:comment>http://blogs.msdn.com/ddysart/rsscomments.aspx?PostID=692102</wfw:comment><description>&lt;P&gt;About a week ago I helped troubleshoot an issue where a customer wrote a WinForms User Control and she was trying to use it on a form&amp;nbsp;she was&amp;nbsp;developing.&amp;nbsp; When&amp;nbsp;she dragged it from the toolbox,&amp;nbsp;she was&amp;nbsp;getting the following error:&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;An exception occurred while trying to create an instance of Contoso.XP2.AuthorList.&amp;nbsp; The exception was "Request for the permission of type System.Security.Permissions.FileIOPermission, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 failed".&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;No one else in her group experienced this issue.&amp;nbsp; Right off the bat it smelled like a CAS (code access security) issue, the VS IDE was trying to create an instance of the control to use in the designer and was failing to get some permission (File IO in this case).&amp;nbsp; In this case, a quick scan of the code for the user control showed that in the contructor it was reading some configuration information from the local HD.&lt;/P&gt;
&lt;P dir=ltr&gt;This was a bit confusing to the developer, as she hadn't written any code yet, but the constructor was getting run.&amp;nbsp; How could this be?&lt;/P&gt;
&lt;P dir=ltr&gt;At design time, when a control is put onto the form in the designer, the Visual Studio process (DEVENV.EXE)&amp;nbsp;will create an instance of your control to be able to display it on the design surface.&amp;nbsp; In doing this, stuff like the constructor gets run.&amp;nbsp; &lt;/P&gt;
&lt;P dir=ltr&gt;The majority CAS issues we see stem from loading an assembly from a network share.&amp;nbsp; By default, an assembly loaded from the network is not trusted as much, therefore things like File IO get restricted.&amp;nbsp; But in this case, the developer was working with everything local.&amp;nbsp; The project and the file being read were on the C: drive.&amp;nbsp; Time to look under the covers.&amp;nbsp; &lt;/P&gt;
&lt;P dir=ltr&gt;I had her run the (recently aquired) SysInternals &lt;A href="http://www.sysinternals.com/Utilities/Filemon.html"&gt;FileMon &lt;/A&gt;tool and filter on only the DEVENV.EXE process.&amp;nbsp; After she sent me the trace, the following line looked suspicious (I added the line breaks):&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new" size=1&gt;7120&amp;nbsp;10:01:24 AM&amp;nbsp;devenv.exe:784&amp;nbsp;QUERY INFORMATION &amp;nbsp;\\chi-fs01\UserAppData\Devlogon\Application Data\Microsoft\VisualStudio\7.1\ProjectAssemblies\ipgr1g-i01\Contoso.XP2.DataAccess.Settings.dll&amp;nbsp;SUCCESS&amp;nbsp;FileFsDeviceInformation&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;What is with this "ProjectAssemblies" directory?&amp;nbsp; And why was it on a network share.&amp;nbsp; The "chi-fs01" naming convention of the server made it sound like a file server in their Chicago office&amp;nbsp;(thanks IT!) and after talking with the developer some more, it turns out her home directory was redirected to a file share for roaming purposes.&amp;nbsp; After a bit of digging, &lt;A href="http://support.microsoft.com/default.aspx?scid=kb;EN-US;825007"&gt;KB825007&lt;/A&gt; looked like the exact same problem we were seeing, except a different error was occuring.&lt;/P&gt;
&lt;P&gt;As I mentioned, Visual Studio will complile a temporary copy of the control so it can run it for display in the designer.&amp;nbsp; It will compile this temorary copy to a folder in %APPDATA%\Microsoft\VisualStudio\7.1\ProjectAssemblies.&amp;nbsp; When %APPDATA% is re-directed to a network share, the compiled assemby won't be trusted the same as one on the local hard drive and may fail.&amp;nbsp; The workaround is to explicity trust this directory in the code access security policy:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Start the Microsoft .NET Framework 1.1 Configuration tool (located in Administrative Tools on the Control Panel). The .NET Configuration 1.1 window opens.&lt;/LI&gt;
&lt;LI&gt;In the left pane of the .NET Configuration 1.1 window, expand &lt;STRONG&gt;Runtime Security Policy&lt;/STRONG&gt;, and then expand &lt;STRONG&gt;Machine&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Expand &lt;STRONG&gt;Code Groups&lt;/STRONG&gt;, and then expand&lt;STRONG&gt; All_Code&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Right-click &lt;STRONG&gt;LocalIntranet_Zone&lt;/STRONG&gt;, and then click New. The &lt;STRONG&gt;Create Code Group&lt;/STRONG&gt; dialog box appears.&lt;/LI&gt;
&lt;LI&gt;Click to select the &lt;STRONG&gt;Create a new code group&lt;/STRONG&gt; option.&lt;/LI&gt;
&lt;LI&gt;In the Name box, type &lt;STRONG&gt;MyCodeGroup&lt;/STRONG&gt;, and then click &lt;STRONG&gt;Next&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;In the &lt;STRONG&gt;Choose the condition type for this code group box&lt;/STRONG&gt;, click &lt;STRONG&gt;URL&lt;/STRONG&gt;. &lt;/LI&gt;
&lt;LI&gt;To fully trust all files that are located in the ProjectAssemblies folder, type the following text in the &lt;STRONG&gt;URL&lt;/STRONG&gt; box: &lt;BR&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;file:////FolderPath\Microsoft\VisualStudio\7.1\ProjectAssemblies\* &lt;BR&gt;&lt;/FONT&gt;&lt;EM&gt;Note:&lt;/EM&gt; FolderPath &lt;EM&gt;is a placeholder for the path of the folder where the Application Data folder is redirected.&lt;/EM&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;Click &lt;STRONG&gt;Next&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;In the &lt;STRONG&gt;Use existing permission set&lt;/STRONG&gt; box, click &lt;STRONG&gt;FullTrust&lt;/STRONG&gt;, and then click &lt;STRONG&gt;Next&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Click &lt;STRONG&gt;Finish&lt;/STRONG&gt;. &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;After completing these steps, she retried dragging the control from the tool box and it showed up on the form surface this time.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=692102" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ddysart/archive/tags/Life+at+Microsoft/default.aspx">Life at Microsoft</category><category domain="http://blogs.msdn.com/ddysart/archive/tags/Customer+Learnings/default.aspx">Customer Learnings</category></item><item><title>"Invalid Parameter" when receiving from a remote queue</title><link>http://blogs.msdn.com/ddysart/archive/2006/03/17/554016.aspx</link><pubDate>Fri, 17 Mar 2006 22:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:554016</guid><dc:creator>ddysart</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ddysart/comments/554016.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ddysart/commentrss.aspx?PostID=554016</wfw:commentRss><wfw:comment>http://blogs.msdn.com/ddysart/rsscomments.aspx?PostID=554016</wfw:comment><description>&lt;P&gt;I'm backing up a colleague who is out on vacation this week and got an interesting issue from one of his customers.&amp;nbsp; They'd implemented a simple Windows Service in C# (v1.1) to read messages from a remote MSMQ queue.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The issue they ran into is when the server the remote queue went down, they'd get "MSMQ Unavailble" errors, which is expected.&amp;nbsp; Once the queue comes back online, they were getting "An &lt;A class=KeywordHighlight name=#h2&gt;invalid parameter&lt;/A&gt; passed to a function"&amp;nbsp; After a bit of digging this looks to be a bug in the framework related to some caching of the connection to the queue.&amp;nbsp; After the queue comes back up, the cached connection is no longer valid.&amp;nbsp; Fortunately the workarounds&amp;nbsp;(2) are fairly simple:&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;Disable the connection caching via:&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;System.Messaging.MessageQueue.EnableConnectionCache = False;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Or&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;Clear the cache after catching the error and retry receiving on the queue:&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;System.Messaging.MessageQueue.ClearConnectionCache() &lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;From what I could gather from reading the notes in the bug, it has been address, but I'm speculating since the workaround is fairly simple, no hotifx has been made yet. I'd expect it in a future release, I just have no idea which one.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=554016" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ddysart/archive/tags/Life+at+Microsoft/default.aspx">Life at Microsoft</category><category domain="http://blogs.msdn.com/ddysart/archive/tags/Customer+Learnings/default.aspx">Customer Learnings</category></item><item><title>Changes to authentication in XPSP2</title><link>http://blogs.msdn.com/ddysart/archive/2005/02/16/374759.aspx</link><pubDate>Thu, 17 Feb 2005 02:36:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:374759</guid><dc:creator>ddysart</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/ddysart/comments/374759.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ddysart/commentrss.aspx?PostID=374759</wfw:commentRss><wfw:comment>http://blogs.msdn.com/ddysart/rsscomments.aspx?PostID=374759</wfw:comment><description>&lt;DIV xmlns="http://www.w3.org/1999/xhtml"&gt;One of my customers ran into an interesting issue when upgrading their developer workstations to Windows XP SP2 - they stopped being able to debug ASP.NET applications running on the local IIS5.1 webserver. They went through the standard steps of ensuring permissions and appropriate security group membership, but it still failed. Turns out they have a less than standard configuration and ran into a new security check in Windows XP SP2. First their configuration.&lt;/DIV&gt;
&lt;DIV xmlns="http://www.w3.org/1999/xhtml"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV xmlns="http://www.w3.org/1999/xhtml"&gt;They are running multiple websites on IIS5.1, which until this case I didn't know was possible. It is, as long as only one site is running at a time. Each site represents one of the potential sites their developers could be working on. Then each VS.NET is configured to point at a FQDN for the site. For instance, say the production web site was &lt;A href="http://www.contoso.com"&gt;www.contoso.com&lt;/A&gt;, the dev project would be configured as &lt;A href="http://www.contoso.dev"&gt;www.contoso.dev&lt;/A&gt;. Then (and here is where things get interesting), &lt;A href="http://www.contoso.dev"&gt;www.contoso.dev&lt;/A&gt; is configured in their DNS servers to resolve to 127.0.0.1. Other projects have other DNS names that resolve to 127.0.0.2, 127.0.0.5, etc, etc. Since these are all in the loopback range, they all resolve to the local machine.&lt;/DIV&gt;
&lt;DIV xmlns="http://www.w3.org/1999/xhtml"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV xmlns="http://www.w3.org/1999/xhtml"&gt;Forgetting about their reasoning for this for a moment, what was happening was authentication was failing on the website. We could see this from the IIS logs that looked something like this:&lt;/DIV&gt;
&lt;DIV xmlns="http://www.w3.org/1999/xhtml"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV xmlns="http://www.w3.org/1999/xhtml"&gt;2005-02-25 16:20:20 127.0.0.21 - DEBUG /Default.aspx 401 398 Microsoft-Visual-Studio.NET/7.10.3077 -&lt;BR&gt;2005-02-25 16:20:20 127.0.0.21 - DEBUG /Default.aspx 401 235 Microsoft-Visual-Studio.NET/7.10.3077 -&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV xmlns="http://www.w3.org/1999/xhtml"&gt;Browsing with IE to the DNS name with anonymous disable gave us the credential prompt, which would not take any valid credentials. The interesting thing was this - if we browsed to &lt;A href="http://localhost"&gt;http://localhost&lt;/A&gt;, it worked fine. If we put &lt;A href="http://www.contoso.dev"&gt;www.contoso.dev&lt;/A&gt; in the hosts file, it worked. So what was going on?&lt;/DIV&gt;
&lt;DIV xmlns="http://www.w3.org/1999/xhtml"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV xmlns="http://www.w3.org/1999/xhtml"&gt;Turns out, SP2 added a new protection against reflection attacks. Namely, SP2 no longer allows authentication to be performed across the loopback interface if the name does not &lt;BR&gt;match the name of the local machine. This can be disabled a couple different ways:&lt;/DIV&gt;
&lt;DIV xmlns="http://www.w3.org/1999/xhtml"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;OL style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px" type=1 xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;LI&gt;
&lt;DIV&gt;Disable the loopback check completely by adding the following registry key (requires reboot):&lt;BR&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\DisableLoopbackCheck&lt;BR&gt;This key should be a REG_DWORD and set to 1&lt;/DIV&gt;
&lt;LI&gt;
&lt;DIV&gt;Instead of opening it up to any hostname mapped to 127.0.0.1, you can limit the hostnames allowed by adding each hostname to the following registry key:&lt;BR&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0\BackConnectionHostNames&lt;BR&gt;This key should be a REG_MULTI_SZ and set to the host name you are using.&lt;/DIV&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;DIV xmlns="http://www.w3.org/1999/xhtml"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV xmlns="http://www.w3.org/1999/xhtml"&gt;Probably the safest is to add &lt;A href="http://www.contoso.dev"&gt;www.contoso.dev&lt;/A&gt; to the second registry key.&lt;/DIV&gt;
&lt;DIV xmlns="http://www.w3.org/1999/xhtml"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV xmlns="http://www.w3.org/1999/xhtml"&gt;A ton of thanks to Kyle Terns, a support engineer on the IIS team for the help in tracking this one down.&lt;/DIV&gt;
&lt;DIV xmlns="http://www.w3.org/1999/xhtml"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV xmlns="http://www.w3.org/1999/xhtml"&gt;UPDATE:&amp;nbsp; Looks like there is a KB Article on this now (&lt;A href="http://support.microsoft.com/?kbid=896861"&gt;896861&lt;/A&gt;)&lt;BR&gt;&amp;nbsp;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=374759" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ddysart/archive/tags/Customer+Learnings/default.aspx">Customer Learnings</category></item><item><title>Winforms and threading</title><link>http://blogs.msdn.com/ddysart/archive/2004/05/04/125700.aspx</link><pubDate>Tue, 04 May 2004 19:33:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:125700</guid><dc:creator>ddysart</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ddysart/comments/125700.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ddysart/commentrss.aspx?PostID=125700</wfw:commentRss><wfw:comment>http://blogs.msdn.com/ddysart/rsscomments.aspx?PostID=125700</wfw:comment><description>&lt;P&gt;There has been a recent discussion internally amongst the ADC&amp;#8217;s in my region* about threading and WinForms. &amp;nbsp;I originally cut my teeth in Windows programming by writing a multi-threaded NT Service that ran on a Alpha based Windows NT 3.51 system (who coined the term &amp;#8220;Wintel&amp;#8221;? &amp;nbsp;I had a copy of Visual C++ 4.0 for MIPS and DEC Alpha &amp;#8211; definitely non-Intel processors running Windows NT. &amp;nbsp;It was the market (or lack thereof) that pulled support for those processors).&amp;nbsp; So I learned early on about the joys of mutexes and critical sections.&amp;nbsp; All that learning went away as I moved to more lucrative Visual Basic 5.0 &amp;amp; 6.0 work and the multi-threading center of my brain became &amp;#8220;soft&amp;#8221;.&amp;nbsp; The recent mental exercise of tackling threading issues in WinForms has been great fun.&lt;/P&gt;
&lt;P&gt;The challenge with WinForms is that underneath it all, all of the System.Windows.Forms.Button&amp;#8217;s and stuff are Windows&amp;#174; intrinsic windows. &amp;nbsp;These can only generally receive messages on the thread that they were created on, so if you are performing some really long operation (say, calling a web service &amp;#8211; or in a demo calling System.Threading.Thread.Sleep(5000);) that thread cannot process messages for the UI. &amp;nbsp;This manifests itself as an unresponsive application; several portions of the screen won&amp;#8217;t paint, mouse clicks don&amp;#8217;t register right away, and the user finally closes the application and sends us a min-hang dump via the &amp;#8220;you closed an unresponsive application&amp;#8221; dialog. &amp;nbsp;The best solution to this is to make your web service call (or whatever was taking so long) on another thread. &amp;nbsp;There is an excellent article by Ian Griffiths in the June 2003 issue of MSDN Magazine (also online &lt;A href="http://msdn.microsoft.com/msdnmag/issues/03/02/Multithreading/default.aspx"&gt;here&lt;/A&gt;) on how to do this.&lt;/P&gt;
&lt;P&gt;More or less (read: a highly simplified way of explaining this is), you define a delegate with the method signature you want to execute on another thread. &amp;nbsp;The create an instance of that delegate pointing to the method you want to run and call &lt;I&gt;&lt;SPAN style="FONT-STYLE: italic"&gt;delegatename.Invoke&lt;/SPAN&gt;&lt;/I&gt; passing an AsyncCallback object. &amp;nbsp;Your method then runs on a thread from the managed thread pool, and when the method completes it will call into the AsychCallback method. &amp;nbsp;Here you must call EndInvoke which will not only clean up a lot of the thread stuff, it will return the return value of your method.&amp;nbsp; Keep in mind you are still running on the thread pool thread, so you cannot update the UI directly. &amp;nbsp;You need to use the &lt;I&gt;&lt;SPAN style="FONT-STYLE: italic"&gt;Control.Invoke&lt;/SPAN&gt;&lt;/I&gt; method to marshal your call back to the UI thread. &amp;nbsp;Some code may help explain this.&lt;/P&gt;&lt;PRE class=codeEx&gt;private void calcBtn_Click(object sender, System.EventArgs e)
{
    string input = "On UI Thread";
    this.resultLbl.Text = "";
    
    DoWorkDelegate work = new DoWorkDelegate(DoWork);
    work.BeginInvoke(input, new AsyncCallback(WorkDone), null);
}
public delegate string DoWorkDelegate(string input);
public string DoWork(string input)
{
    System.Threading.Thread.Sleep(5000);
    return "Returned from thread: " + input;
}
public void WorkDone (IAsyncResult iar)
{
    AsyncResult ar = (AsyncResult)iar;
    DoWorkDelegate myThreadProc = (DoWorkDelegate)ar.AsyncDelegate;
    string result = myThreadProc.EndInvoke(iar);
    UpdateUIDelegate updateDelegate = new UpdateUIDelegate(UpdateFromWork);
    object [] args = {result};
    this.Invoke(updateDelegate, args);
}
public delegate void UpdateUIDelegate (string updateStr);
public void UpdateFromWork (string updateStr)
{
    this.resultLbl.Text = updateStr;
}
&lt;/PRE&gt;
&lt;P&gt;If you set break points in the various methods and watch the &amp;#8220;Threads&amp;#8221; window in VS.NET, you&amp;#8217;ll see what code is being run where. &amp;nbsp;Something to note is that you should see a two threads running, however some of us have sometimes observed an extra thread with no code associated with it (this is what sparked our discussion to begin with). &amp;nbsp;Nobody seems to know what this thread is, and a dump using ADPlus shows that it is not actually there. &amp;nbsp;We are chalking it up as a weird VS.NET bug &amp;#8211; if someone has a better explanation, I&amp;#8217;d love to hear it.&amp;nbsp; Many thanks to Brian MacKay for showing me how to do this sort of work with delegates.&lt;/P&gt;
&lt;P&gt;* Geographically speaking, I am part of the Central Region of the US subsidiary (there are two others, aptly named East and West). &amp;nbsp;This is about as far as the services organization (meaning Premier Support and Microsoft Consulting Services) in Microsoft get broken down. &amp;nbsp;The sales organization does go one level of granularity further into districts. &amp;nbsp;Services used to align to districts, but a re-org a year or two ago rolled us up into a regional model.&amp;nbsp; District-wise, I&amp;#8217;d be considered in the Midwest district which is Wisconsin, Illinois, and Indiana.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=125700" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ddysart/archive/tags/Life+at+Microsoft/default.aspx">Life at Microsoft</category><category domain="http://blogs.msdn.com/ddysart/archive/tags/Customer+Learnings/default.aspx">Customer Learnings</category></item></channel></rss>