<?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>Cliff Green's Blog : Web Parts</title><link>http://blogs.msdn.com/cliffgreen/archive/tags/Web+Parts/default.aspx</link><description>Tags: Web Parts</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>SharePoint Web Part Embedded Resource Permissions</title><link>http://blogs.msdn.com/cliffgreen/archive/2008/10/27/sharepoint-web-part-embedded-resource-permissions.aspx</link><pubDate>Mon, 27 Oct 2008 17:45:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9018314</guid><dc:creator>green.cliff</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/cliffgreen/comments/9018314.aspx</comments><wfw:commentRss>http://blogs.msdn.com/cliffgreen/commentrss.aspx?PostID=9018314</wfw:commentRss><description>&lt;p&gt;It is a normal expectation for companies to embed resources like javascript, CSS and other resources in an assembly.&amp;nbsp; Web Parts are no exceptions.&amp;nbsp; For those of you that deploy everything to the GAC, you can disregard the remainder of this post.&amp;nbsp; The rest of you, bear with me.&amp;nbsp; If we are not deploying to the GAC we are typically deploying to the bin.&amp;nbsp; The bin directory in SharePoint has the following permissions by default; full control for SYSTEM, Administrators and WSS_ADMIN_WPG groups, and read-only access for WSS_WPG group.&amp;nbsp; This is not sufficient for embedded resources to be loaded by accounts that don't exists in one of these groups.&amp;nbsp; If you run an assembly with embedded resources with anything other than an account that is in one of these groups you will get the following error:&lt;/p&gt; &lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;Exception raised when trying to access embedded resources:
System.UnauthorizedAccessException: Access to the path &lt;span style="color: #006080"&gt;'C:\inetpub\wwwroot\wss\VirtualDirectories\80\bin\SampleWP.DLL'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; denied. 
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
at System.IO.File.GetLastWriteTimeUtc(String path) at System.IO.File.GetLastWriteTime(String path) 
at System.Web.Handlers.AssemblyResourceLoader.GetAssemblyInfoWithAssertInternal(Assembly assembly) 
at System.Web.Handlers.AssemblyResourceLoader.GetAssemblyInfo(Assembly assembly) 
at System.Web.Handlers.AssemblyResourceLoader.GetWebResourceUrlInternal(Assembly assembly, String resourceName, Boolean htmlEncoded) 
at System.Web.Handlers.AssemblyResourceLoader.GetWebResourceUrl(Type type, String resourceName, Boolean htmlEncoded) 
at System.Web.UI.ClientScriptManager.GetWebResourceUrl(Page owner, Type type, String resourceName, Boolean htmlEncoded) 
at System.Web.UI.ClientScriptManager.RegisterClientScriptResource(Type type, String resourceName) 
at TestWebPart.ResourcePermissionTest.OnPreRender(EventArgs e)
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The assembly doesn't have permission to access the bin directory.&amp;nbsp; If you don't get this error do an IIS reset and then access the web part as a user that isn't in one of these groups.&amp;nbsp; The difficult part of figuring this out was that if a user with permissions to write to the directory first accesses the web part it will render properly, not only for that user, but any user thereafter.&amp;nbsp; This will happen until the cache is exhausted.&amp;nbsp; So even during the debugging process I was wondering what the heck I just saw a couple of times.&lt;/p&gt;
&lt;p&gt;On the surface the easy solution is to change the permissions and set 'everyone' to have read / write access and move on.&amp;nbsp; What you will notice is that SharePoint will reset these permissions back to the standard after certain events.&amp;nbsp; One of those events is deploying a solution.&amp;nbsp; If you watch the directory you will notice that the bin permissions are recreated when this happens.&amp;nbsp; The bin directory is actually deleted and recreated.&amp;nbsp; So while the 'everyone' account will work temporarily, it isn't a long term solution.&lt;/p&gt;
&lt;p&gt;What about CAS?&amp;nbsp; Doesn't work.&amp;nbsp; Contrary to some of the other posts out there about this this isn't a CAS issue.&amp;nbsp; Granting the assembly 'Full' trust doesn't change the fact that an account that doesn't have access to the directory needs to write to it.&amp;nbsp; While you can set the web.config and disable impersonation or create a CAS policy that doesn't impersonate, this isn't the best solution in cases where you need to impersonate the user.&amp;nbsp; Windows Auth. comes to mind.&amp;nbsp; It would allow you to take the non-impersonated account and add them to one of the built-in groups so the web part would function properly.&amp;nbsp; This probably isn't an acceptable solution if you are an ISV or third party looking to distribute your web part to other parties.&amp;nbsp; They may not be open to adding least privilege accounts to groups on their servers &lt;/p&gt;
&lt;p&gt;One solution that does work is creating a folder in the web application directory and changing the web.config to add a &lt;a href="http://msdn.microsoft.com/en-us/library/823z9h8w.aspx" target="_blank"&gt;probingPath&lt;/a&gt; in order to help the .NET runtime locate your assembly.&amp;nbsp; By creating your own directory you control the permissions and they aren't reset by SharePoint.&amp;nbsp; Your installation and setup are a little more trouble, but you have a solution that should work long term without sacrifices to the functionality of SharePoint or, most importantly, your web part.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9018314" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/cliffgreen/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://blogs.msdn.com/cliffgreen/archive/tags/Web+Parts/default.aspx">Web Parts</category><category domain="http://blogs.msdn.com/cliffgreen/archive/tags/Embedded+Resources/default.aspx">Embedded Resources</category><category domain="http://blogs.msdn.com/cliffgreen/archive/tags/CAS/default.aspx">CAS</category></item><item><title>Adding Web Parts to the Web Part Gallery Using the SharePoint Object Model</title><link>http://blogs.msdn.com/cliffgreen/archive/2008/04/18/adding-web-parts-to-the-web-part-gallery-using-the-sharepoint-object-model.aspx</link><pubDate>Fri, 18 Apr 2008 19:12:56 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8408230</guid><dc:creator>green.cliff</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/cliffgreen/comments/8408230.aspx</comments><wfw:commentRss>http://blogs.msdn.com/cliffgreen/commentrss.aspx?PostID=8408230</wfw:commentRss><description>&lt;p&gt;Since my &lt;a href="http://blogs.msdn.com/cliffgreen/archive/2008/03/13/removing-web-parts-from-the-my-site-web-part-gallery.aspx"&gt;first&lt;/a&gt; post was based on removing web parts from the web part gallery of a 'My Site' there have been questions about how to add the web parts back should circumstances require it.&amp;nbsp; This is pretty straight-forward, but can get more interesting depending on how robust you want to make the end solution.&amp;nbsp; The Web Part Gallery is a document library that holds a reference to a web part file, either a .dwp or .webpart file.&amp;nbsp; This file is simply a metadata definition of the web part.&amp;nbsp; To add a web part back in the gallery we can leverage the code shown below.&amp;nbsp; This assumes that the web part assembly is installed and the safe control entries are made in the web.config file.&lt;/p&gt; &lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; IterateWebPartGallery(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; siteCollectionUrl) {
    &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; filePath = &lt;span style="color: #006080"&gt;@"C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\PortalLayouts\DWP\owa.dwp"&lt;/span&gt;;

    &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; ( SPSite site = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SPSite( siteCollectionUrl ) ) {
        &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; ( SPWeb web = site.OpenWeb() ) {

            SPList webPartGallery = web.GetCatalog( SPListTemplateType.WebPartCatalog );

            SPFolder folder = webPartGallery.RootFolder;
            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;( folder != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; ) {
                &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt; [] webPartFile = File.ReadAllBytes(filePath);
                FileInfo webPartFileInfo = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; FileInfo(filePath);

                folder.Files.Add(webPartFileInfo.Name, webPartFile);
                folder.Update();
            }
        }
    }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The code gets a reference to the web part gallery in the target site collection by calling the SPWeb.GetCatalog() method.&amp;nbsp; Once we have that reference we get a reference to the root folder of the gallery and call the folder.Files.Add() method to add the web part file.&amp;nbsp; Calling folder.Update() persists this information to the database.&lt;/p&gt;
&lt;p&gt;While this will simply add the file by parsing its contents it won't give us the fine grained control we may want for adding our web part to the gallery.&amp;nbsp; If the file uses resources to define the title and description properties then those get loaded into the gallery "as is" using the method above.&amp;nbsp; This makes our title $Resources:spscore,PeopleWebParts_OWA_Title_Text; and the description $Resources:spscore,PeopleWebParts_OWA_Desc_Text;. &lt;/p&gt;
&lt;p&gt;This can be made a bit more robust by figuring out the title and description from the resource file and setting them in the gallery when the web part is loaded.&amp;nbsp; The SPFolder.Files.Add() method has an overload that accepts a Hashtable reference where we can set additional properties for the web part.&amp;nbsp; The resource values above indicate the resource file is the spscore resource file, spscore.en-US.resx for the en-US culture.&amp;nbsp; Resource files in SharePoint are stored in the \12\Resources directory.&amp;nbsp; I tried to load this file directly using the ResXResourceReader, but received an exception about a missing 'resheader' value in the file.&amp;nbsp; Since .resx files are just Xml I decided to use an XPathNavigator and parse the values out that way.&amp;nbsp; You could also dynamically parse the .webpart or .dwp file to figure out what the associated resx file the web part is referencing, but that is beyond the scope of this post.&amp;nbsp; The final code snippet is shown below.&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; filePath = &lt;span style="color: #006080"&gt;@"C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\PortalLayouts\DWP\owa.dwp"&lt;/span&gt;;
&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; resourceDirectory = &lt;span style="color: #006080"&gt;@"C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\Resources"&lt;/span&gt;;

&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; ( SPSite site = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; SPSite( siteCollectionUrl ) ) {
    &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; ( SPWeb web = site.OpenWeb() ) {

        SPList webPartGallery = web.GetCatalog( SPListTemplateType.WebPartCatalog );

        &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; title = &lt;span style="color: #006080"&gt;""&lt;/span&gt;;
        &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; description = &lt;span style="color: #006080"&gt;""&lt;/span&gt;;

        XPathDocument xml = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; XPathDocument( File.Open( Path.Combine( resourceDirectory, &lt;span style="color: #006080"&gt;"spscore.en-US.resx"&lt;/span&gt; ), FileMode.Open, FileAccess.Read ) );
        XPathNavigator navigator = xml.CreateNavigator();
        &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; xpathExpression = &lt;span style="color: #006080"&gt;"/root/Data[@Name='{0}']/Value"&lt;/span&gt;;
        XPathNavigator node = navigator.SelectSingleNode( &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format( xpathExpression, &lt;span style="color: #006080"&gt;"PeopleWebParts_OWA_Title_Text"&lt;/span&gt; ) );
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; ( node != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; ) {
            title = node.Value;
        }
        node = navigator.SelectSingleNode( &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format( xpathExpression, &lt;span style="color: #006080"&gt;"PeopleWebParts_OWA_Desc_Text"&lt;/span&gt; ) );
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; ( node != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; ) {
            description = node.Value;
        }


        SPFolder folder = webPartGallery.RootFolder;
        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; ( folder != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; ) {
            &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] webPartFile = File.ReadAllBytes( filePath );
            FileInfo webPartFileInfo = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; FileInfo( filePath );

            Hashtable properties = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Hashtable();
            properties.Add( &lt;span style="color: #006080"&gt;"Title"&lt;/span&gt;, title );
            properties.Add( &lt;span style="color: #006080"&gt;"WebPartDescription"&lt;/span&gt;, description );
            properties.Add( &lt;span style="color: #006080"&gt;"Group"&lt;/span&gt;, &lt;span style="color: #006080"&gt;"Outlook Web Access"&lt;/span&gt; );


            folder.Files.Add( webPartFileInfo.Name, webPartFile, properties );
            folder.Update();
        }
    }
}&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8408230" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/cliffgreen/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://blogs.msdn.com/cliffgreen/archive/tags/Web+Parts/default.aspx">Web Parts</category></item><item><title>Create 'open tool pane' link in ASP.NET 2.0 Web Parts for SharePoint</title><link>http://blogs.msdn.com/cliffgreen/archive/2008/03/17/create-open-tool-pane-link-in-asp-net-2-0-web-parts-for-sharepoint.aspx</link><pubDate>Mon, 17 Mar 2008 03:22:14 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8275445</guid><dc:creator>green.cliff</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/cliffgreen/comments/8275445.aspx</comments><wfw:commentRss>http://blogs.msdn.com/cliffgreen/commentrss.aspx?PostID=8275445</wfw:commentRss><description>&lt;p&gt;I was recently asked how one could include the 'open tool pane' link in an ASP.NET Web Part hosted in SharePoint.&amp;nbsp; One can see an example of this in the Content Editor Web Part and several others that are offered OOB with SharePoint.&amp;nbsp; The purpose is to provide the user a link to quickly edit the properties of the web part initially by opening the editor zone in SharePoint.&amp;nbsp; The same functionality is provided when the page is put in 'Edit' mode and the user selects the web part 'Edit' menu and selects the 'Modify this Web Part' link.&amp;nbsp; &lt;/p&gt; &lt;p&gt;WSS v3 Web Parts, which are derived from the Microsoft.SharePoint.WebParts.WebPart class, make this simple by providing the capability to leverage the ToolPane.GetShowExtensibleToolPaneEvent.&amp;nbsp; This will return the javascript required to perform the required action.&amp;nbsp; Since this is a static reference my first reaction was to put add a reference to the Microsoft.SharePoint namespace in my project and use this code in my ASP.NET web part.&amp;nbsp; It turns out that the first parameter expected by this method is a Microsoft.SharePoint.WebParts.WebPart object.&amp;nbsp; Even though it derives from the System.Web.UI.WebControls.WebParts.WebPart object you can't pass the ASP.NET 2.0 web part as a parameter.&amp;nbsp; This will create a compile time error.&lt;/p&gt; &lt;p&gt;The next step was to leverage the generated javascript code in the ASP.NET 2.0 web part and it should work, right?&amp;nbsp; Not so fast.&amp;nbsp; The javascript that is produced for the Content Editor Web Part is shown below.&amp;nbsp; You can figure this out by right clicking the 'open tool part' link and selecting properties.&lt;/p&gt;&lt;pre class="csharpcode"&gt;javascript:MSOTlPn_ShowToolPane2Wrapper( ‘Edit’, ‘129’, ‘g_59b79f76_b13b_42aa_85f2_f2f1c2ba71f1’);&lt;/pre&gt;
&lt;p&gt;So we generate the href reference to MSOTlPn_ShowToolPane2Wrapper and pass the parameters; 'Edit', '129' and '&lt;span class="str"&gt;g_59b79f76_b13b_42aa_85f2_f2f1c2ba71f1'.&amp;nbsp; What do those parameters mean?&amp;nbsp; The first is the display mode for the editor pane, the second we'll get to, and the third took a little work.&amp;nbsp; To figure out the second and third I built a web part that output everything that had an ID associated with it; ID, ClientID, etc.&amp;nbsp; Turns out the third variable is just the ID property of the Web Part.&amp;nbsp; One down, one to go.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="str"&gt;The second parameter took some more digging and was the bane of my existence for a few hours.&amp;nbsp; I tried several other ID type properties here and nothing worked.&amp;nbsp; I added the web part to a new page so to see if there was a difference in sites (SPWeb) that was generating the ID.&amp;nbsp; Nothing so far.&amp;nbsp; I decided to hook up Fiddler to see what was going on behind the scenes.&amp;nbsp; After all, we have the 'Modify this Web Part' link that does the same thing I wanted to do.&amp;nbsp; After running Fiddler I clicked 'Edit' &amp;gt; 'Modify this Web Part' and looked through the results.&amp;nbsp; Using the known Content Editor Web Part I was able to track down the mysterious '129' parameter.&amp;nbsp; Is was passed in the request as the MSOWebPartPage PostBackSource value.&amp;nbsp; That didn't help much, but I did know where to look now in my custom web part to find the value I needed to pass.&amp;nbsp; Turns out my MSOWebPartPage PostBackSource value was '16'.&amp;nbsp; So I changed the link to be &lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;literal.Text = &lt;span class="str"&gt;"&amp;lt;a href=\"javascript:MSOTlPn_ShowToolPane2Wrapper('Edit', '16', '"&lt;/span&gt; + &lt;span class="kwrd"&gt;this&lt;/span&gt;.ID + &lt;span class="str"&gt;"')\"&amp;gt;open tool pane&amp;lt;/a&amp;gt;"&lt;/span&gt;;&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;and it worked. &lt;span class="str"&gt;Now I just need to find a property with 16 as the value, however, this didn't exist.&amp;nbsp; I turned on the debugger and looked, and looked, and...well, nothing.&amp;nbsp; What is this value?&amp;nbsp; I checked the Web Part Gallery for the site collection to see of maybe the reference was generated there, but my Web part Gallery Id was 88.&amp;nbsp; No luck.&amp;nbsp; The ID for this parameter is being generated somewhere, by something, in order to create the 'Modify this Web Part' menu item.&amp;nbsp; It turns out that you can just pass a reference to 'this' in order to have SharePoint know the post back source.&amp;nbsp; So after changing the code to &lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;literal.Text = &lt;span class="str"&gt;"&amp;lt;a href=\"javascript:MSOTlPn_ShowToolPane2Wrapper('Edit', this, '"&lt;/span&gt; + &lt;span class="kwrd"&gt;this&lt;/span&gt;.ID + &lt;span class="str"&gt;"')\"&amp;gt;open tool pane&amp;lt;/a&amp;gt;"&lt;/span&gt;;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;things worked like a charm.&amp;nbsp; There are issues with this implementation.&amp;nbsp; The SharePoint team could decide to change the javascript signature or remove the javascript altogether.&amp;nbsp; In the meantime, this accomplishes the goal and gives the ASP.NET web part SharePoint type functionality.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8275445" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/cliffgreen/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://blogs.msdn.com/cliffgreen/archive/tags/Web+Parts/default.aspx">Web Parts</category></item></channel></rss>