<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Waldek Mastykarz</title>
	
	<link>http://blog.mastykarz.nl</link>
	<description>Innovation Matters | MOSS MVP</description>
	<lastBuildDate>Fri, 17 Jul 2009 06:37:12 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/WaldekMastykarz" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Inconvenient Content Query Web Part vs. Lookup fields with multiple values</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/f_D1NcFlC-s/</link>
		<comments>http://blog.mastykarz.nl/inconvenient-content-query-web-part-lookup-fields-multiple-values/#comments</comments>
		<pubDate>Fri, 17 Jul 2009 06:37:12 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[WCM]]></category>
		<category><![CDATA[Content Query Web Part]]></category>
		<category><![CDATA[Inconvenient SharePoint]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/inconvenient-content-query-web-part-lookup-fields-multiple-values/</guid>
		<description><![CDATA[Content Query Web Part has been around for a while now and has proven to be a great performing and a very flexible content aggregation solution. In spite of its power it has some shortcomings like for example lack of support for Lookup fields with multiple values.
Almost every Web Content Management (WCM) solution I built [...]]]></description>
			<content:encoded><![CDATA[<p>Content Query Web Part has been around for a while now and has proven to be a great performing and a very flexible content aggregation solution. In spite of its power it has some shortcomings like for example lack of support for Lookup fields with multiple values.</p>
<p>Almost every Web Content Management (WCM) solution I built on top of Microsoft Office SharePoint Server (MOSS) 2007 required using one or more Lookup fields. Comparing to other alternatives like a Choice field, a Lookup field allows users to maintain the list of value themselves in an intuitive way and all that without modifying any of the existing Site Columns.</p>
<p>Some of the Lookup fields, like Categories or Tags, must allow selecting multiple values. And this is where the problems begin: the Content Query Web Part doesn’t support MultiLookup fields at all. As soon as you include a reference to one in your query, you won’t get any results.</p>
<p>This problem isn’t new and has been mentioned on the <a href="http://blogs.msdn.com/ecm/default.aspx">Microsoft Enterprise Content Management (ECM) Team Blog</a> nearly three years ago: <a href="http://blogs.msdn.com/ecm/archive/2006/11/16/building-tylerbutler-com-part-3-customizing-content-query-styles.aspx#ctl00___ctl00___ctl01___Comments___Comments_ctl12_NameLink">“SPSiteDataQuery and by extension the Content Query Web Part doesn’t support multi-value lookup fields”</a>.</p>
<p>Considering how often you might want to retrieve the value of a MultiLookup field in a content aggregation the lack of support for it in the CQWP becomes quite problematic: does it mean that we must develop our own alternative for aggregating content in order to use some of the basic functionality of Windows SharePoint Services v3? What about the performance: <a href="/content-query-web-part-vs-custom-aggregation-web-part/">are you sure that it would perform as good as the standard Content Query Web Part</a>?</p>
<p>If you do want to use the Content Query Web Part and you do want to make this work, there are a couple approaches you might consider.</p>
<h2>Custom Multi Lookup Field</h2>
<p>One of the first things that could come to your mind might be developing a custom Lookup field which would allow selecting multiple values. Because the LookupMulti field type isn’t supported by the CQWP you could create a totally custom field type deriving from the <a href="http://weblogs.asp.net/soever/archive/2007/09/18/sharepoint-custom-field-type-for-multiline-text.aspx">Text or Note field type</a>. The value of a Lookup field with multiple values is a ;# delimited string, such as id1;#value1;#id2;#value2 which can easily be converted to the <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfieldlookupvaluecollection.aspx">SPFieldLookupValueCollection</a> type so that you can work with the stored values in a way comparable to the standard LookupMulti field. You could even go a step further and provide a similar User Interface to the one the LookupMulti field has using the <a href="/values-internal-properties-sharepoint-2007/">GroupedItemPicker control</a>.</p>
<p>While this is definitely a plausible approach, many people find working with custom field types rather complex. There are quite a few different components you have to consider while creating a custom field type if you want to make it fool-proof. The worst of it all in my opinion is, that a custom field type is available in all Web Applications across the whole farm. In other words: after you deploy your custom field type everyone else is able to use it in their Web Applications as well.</p>
<h2>Custom XSLT function</h2>
<p>Content Query Web Part uses XSLT for data presentation. The great thing about this combination is that it allows you to extend the standard transform process with your own <a href="/extending-content-query-web-part-xslt-custom-functions/">XSLT parameters and functions</a>.</p>
<p>For the purpose of retrieving the value of a MultiLookup field, you could create a custom function which would take three parameters: ID of the site, ID of the List and ID of the item. Using all these ID’s you would retrieve the item and return the value of the LookupMulti field.</p>
<p>CQWP automatically includes all these ID’s in the results, so you don’t have to do anything extra in order to retrieve them. The downside is however that such function would run in the scope of the item itself meaning: for every single item in the result set you would open a reference to a site, to a list and run a query to retrieve the particular item. And while there are <a href="/performance-methods-retrieve-list-item/">some ways to optimize that process</a>, it’s still quite poor from the scalability and performance point of view.</p>
<p>Depending on your scenario it might or might not be a suitable solution for your situation. The only way to find out about it is to build a proof-of-concept and test it in your solution/environment.</p>
<h2>Custom XSLT function++</h2>
<p>As I already mentioned the Content Query Web Part includes all different ID’s required to retrieve the SPListItem object for the given result. What the CQWP also does by default, is that it includes all results in the output XML. That gives you yet another approach to retrieve the values of MultiLookup fields.</p>
<p>What if we first gathered all the information about all the items from our result and then use that information to build one query (or a few depending on what kind of results your Content Query Web Part returns). Instead of running one query per item, you could run one query for the whole Web Part, store the results in a variable and retrieve them from the ItemTemplate for every item using the basic XPath selectors.</p>
<p>While this approach is definitely more complex than the previous one, it would definitely prevent you from putting some heavy load on your server. Although I haven’t tried this approach in real-life yet, I’m quite sure it would work and would help you get things done inside the Content Query Web Part without a too big performance penalty.</p>
<h2>There is even more to XSLT functions</h2>
<p>Using custom XSLT functions has yet one more advantage: you could leverage the same concept as described above to retrieve some related information for every item. Because CAML doesn’t support any JOIN mechanism, using custom XSLT functions might give you a solution for this shortcoming as well.</p>
<h2>Summary</h2>
<p>Content Query Web Part provided with Microsoft Office SharePoint Server 2007 is a great solution for aggregating content. In spite of its great power it has some serious shortcomings among which the lack of support for Lookup fields with multiple values. Using custom development you can create a solution for this challenge and leverage the power of the Content Query Web Part in your solutions.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ece1a7b3-d831-48f7-a9ef-043a19605473" class="wlWriterEditableSmartContent">Technorati Tags: <a href="http://technorati.com/tags/SharePoint" rel="tag">SharePoint</a>,<a href="http://technorati.com/tags/SharePoint+2007" rel="tag">SharePoint 2007</a>,<a href="http://technorati.com/tags/MOSS+2007" rel="tag">MOSS 2007</a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=f_D1NcFlC-s:NOhoWyL6k2M:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=f_D1NcFlC-s:NOhoWyL6k2M:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=f_D1NcFlC-s:NOhoWyL6k2M:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=f_D1NcFlC-s:NOhoWyL6k2M:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=f_D1NcFlC-s:NOhoWyL6k2M:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=f_D1NcFlC-s:NOhoWyL6k2M:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=f_D1NcFlC-s:NOhoWyL6k2M:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/f_D1NcFlC-s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/inconvenient-content-query-web-part-lookup-fields-multiple-values/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/inconvenient-content-query-web-part-lookup-fields-multiple-values/</feedburner:origLink></item>
		<item>
		<title>Waldek Mastykarz is now Microsoft Certified Professional Developer</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/KkQz_V8qF2s/</link>
		<comments>http://blog.mastykarz.nl/microsoft-certified-professional-developer/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 06:00:35 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/microsoft-certified-professional-developer/</guid>
		<description><![CDATA[For the last couple of weeks I spent some extra time on learning. I have decided to organize my knowledge and experience and fill in all the gaps.
It’s not bad to learn things through working with them. Theoretical knowledge is not as valuable and useful as real-life experience in my opinion. The downside is however, [...]]]></description>
			<content:encoded><![CDATA[<p>For the last couple of weeks I spent some extra time on learning. I have decided to organize my knowledge and experience and fill in all the gaps.</p>
<p>It’s not bad to learn things through working with them. Theoretical knowledge is not as valuable and useful as real-life experience in my opinion. The downside is however, that if the only thing you’re doing is learning through practice, the odds are high that you will miss some things and not fully benefit of everything that’s already there.</p>
<p>For the last 2,5 years I’ve been working with Microsoft Office SharePoint Server (MOSS) 2007. Right from the beginning I started with development on the SharePoint platform. Because I had a few years (web)development and webdesign experience it wasn’t that difficult for me to adapt to the new development platform. And although I was doing my job and was getting things done, I was reinventing things without even knowing it. That is why just recently I decided to fill in all the gaps I had with the knowledge I should have had a long time ago.</p>
<p>The great thing about it was that about a half year ago Imtech ICT Velocity – the company I work for – started a new education program led by a colleague of mine and a great trainer Erik Schoenmakers. Within that program I got room to learn about the technologies I was working with every day.</p>
<p>I started off with the <a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-536&amp;locale=en-us">(70-536) Microsoft .NET Framework &#8211; Application Development Foundation exam</a>. Developing on the SharePoint platform means developing in the .NET framework. It is therefore important that you know what the framework offers you and how things work. I prepared for the exam using the Self-Paced Training Kit and I have to admit it was a great experience. The kit covers all aspects of the .NET framework: from things I use daily like XSLT, Regular Expressions and Tracing to stuff I never work with as a SharePoint developer like drawing.</p>
<p>Next I took the <a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-562&amp;locale=en-us">(70-562) Microsoft .NET Framework 3.5, ASP.NET Application Development exam</a>. This time I attended a two-day course delivered by Erik. And although the course didn’t go as far as the Self-Paced Training Kit I enjoyed discussing all the different things with other students.</p>
<p>Just when I thought that I had it all covered I stumbled upon yet another certification: <a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-564&amp;locale=en-us">(70-564) Pro: Designing and Developing ASP.NET Applications Using the Microsoft .NET Framework 3.5</a>. From what I’ve seen and read about this certification on the Internet it seemed like a great match with all the things I’ve been working with for the last 2,5 years. There is one thing about that particular exam however: there are no official preparation materials for it! So does Microsoft expects us to pass it using nothing else than the basic knowledge and real-life experience? After all the 70-564 certification is targeted to developers with at least three years experience in working with ASP.NET.</p>
<p><img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 5px 0px; display: inline; border-top: 0px; border-right: 0px" title="Pro ASP.NET 3.5 in C# 2008" border="0" alt="Pro ASP.NET 3.5 in C# 2008" align="left" src="http://mastykarz.nl/blog/images/WaldekMastykarzisnowMicrosoftCertifiedPr_709F/untitled.png" width="125" height="164" />As preparation I read the <a href="http://www.apress.com/book/view/9781590598931">Pro ASP.NET 3.5 in C# 2008 book by APress</a>. This book covers all core concepts and fundamentals of ASP.NET 3.5 as well as some more advanced topics. While this book isn’t really a deep-dive into real-life ASP.NET it gives you a lot of examples of what ASP.NET offers you out of the box.</p>
<p>After a couple weeks of studying and doing exams, I became Microsoft Certified Professional Developer in ASP.NET 3.5:</p>
<p><a href="http://mastykarz.nl/blog/images/WaldekMastykarzisnowMicrosoftCertifiedPr_709F/MCPDrgb_1259.png"><img style="border-bottom: 0px; border-left: 0px; margin: 0px auto 10px; display: block; float: none; border-top: 0px; border-right: 0px" title="MCPD(rgb)_1259" border="0" alt="MCPD(rgb)_1259" src="http://mastykarz.nl/blog/images/WaldekMastykarzisnowMicrosoftCertifiedPr_709F/MCPDrgb_1259_thumb.png" width="267" height="80" /></a></p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:7095d8ba-67b0-4d37-8bcb-0621159fb3db" class="wlWriterEditableSmartContent">Technorati Tags: <a href="http://technorati.com/tags/Microsoft+Certified" rel="tag">Microsoft Certified</a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=KkQz_V8qF2s:ZCnvxnhMlW4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=KkQz_V8qF2s:ZCnvxnhMlW4:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=KkQz_V8qF2s:ZCnvxnhMlW4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=KkQz_V8qF2s:ZCnvxnhMlW4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=KkQz_V8qF2s:ZCnvxnhMlW4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=KkQz_V8qF2s:ZCnvxnhMlW4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=KkQz_V8qF2s:ZCnvxnhMlW4:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/KkQz_V8qF2s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/microsoft-certified-professional-developer/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/microsoft-certified-professional-developer/</feedburner:origLink></item>
		<item>
		<title>Inconvenient Page Title &lt;title&gt; element</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/cAgjUdH1VXA/</link>
		<comments>http://blog.mastykarz.nl/inconvenient-page-title-element/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 17:44:39 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[WCM]]></category>
		<category><![CDATA[Inconvenient SharePoint]]></category>
		<category><![CDATA[Web standards]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/inconvenient-page-title-element/</guid>
		<description><![CDATA[During my last Web Content Management (WCM) project built on top of Microsoft Office SharePoint Server (MOSS) 2007 I noticed that SharePoint was rendering two &#60;title&#62; elements on all pages:
 
The first title element was the one defined by me in the Master Page. That title element correctly displayed the title of the page using [...]]]></description>
			<content:encoded><![CDATA[<p>During my last Web Content Management (WCM) project built on top of Microsoft Office SharePoint Server (MOSS) 2007 I noticed that SharePoint was rendering two &lt;title&gt; elements on all pages:</p>
<p><a href="http://mastykarz.nl/blog/images/InconvenientPageTitletitleelement_1159D/doubletitle.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="HTML source of a Publishing Page with two title elements in the head section" border="0" alt="HTML source of a Publishing Page with two title elements in the head section" src="http://mastykarz.nl/blog/images/InconvenientPageTitletitleelement_1159D/doubletitle_thumb.png" width="480" height="337" /></a> </p>
<p>The first title element was the one defined by me in the Master Page. That title element correctly displayed the title of the page using a custom control:</p>
<p><a href="http://mastykarz.nl/blog/images/InconvenientPageTitletitleelement_1159D/titleinthemasterpage.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="HTML title element wrapped in an ASP.NET ContentPlaceHolder control" border="0" alt="HTML title element wrapped in an ASP.NET ContentPlaceHolder control" src="http://mastykarz.nl/blog/images/InconvenientPageTitletitleelement_1159D/titleinthemasterpage_thumb.png" width="480" height="64" /></a> </p>
<p>For some reason SharePoint was automatically adding the second – empty title element during the rendering process of the page.</p>
<p>Having two title elements in an (X)HTML page is not allowed and results in an error during the markup validation process:</p>
<p><a href="http://mastykarz.nl/blog/images/InconvenientPageTitletitleelement_1159D/doubletitlevalidationerror.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Error in the markup validation process caused by two title elements in the HTML" border="0" alt="Error in the markup validation process caused by two title elements in the HTML" src="http://mastykarz.nl/blog/images/InconvenientPageTitletitleelement_1159D/doubletitlevalidationerror_thumb.png" width="480" height="134" /></a> </p>
<p>It is not the first time I have noticed such behavior. I saw it for the first time a while ago, <a href="/accessible-web-content-management-solutions-based-on-microsoft-office-sharepoint-server-2007/">while I was working on the Imtech SharePoint Compliancy Toolkit to improve accessibility of WCM solutions built on top of MOSS 2007</a>. Because the toolkit uses HTML post processing to clean up the markup it allowed me to remove the second title element in the markup cleaning process.</p>
<p>In the project I’m working on at the moment there is no accessibility requirement which requires the use of the Imtech SharePoint Compliancy Toolkit. We were asked though to deliver an XHTML Transitional valid markup. To find out the reason of the doubled title element I did some research on the page rendering process.</p>
<h2>One down one to go</h2>
<p>During my research I’ve found that rendering two title elements is caused by not including the title element as a child element of the head section of the page. In the Master Page we were using, the title element was wrapped in a ContentPlaceHolder. It seemed like at some point SharePoint is checking whether the page has a title and if it doesn’t, it adds a new title element to the head section of the page.</p>
<p>Looking a bit further in the rendering process I noticed that it’s not SharePoint that is responsible for the check but ASP.NET! If I’m correct the HtmlHead control checks whether a title element has been defined. If not it creates a new title element. Because the title is wrapped in a ContentPlaceHolder it’s not being detected as a child control of the HtmlHead control and thus the check fails resulting in an additional title element.</p>
<h2>The fix</h2>
<p><a href="http://mastykarz.nl/blog/images/InconvenientPageTitletitleelement_1159D/titleelementasachildelementoftheheadsection.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Title element added as a child element of head" border="0" alt="Title element added as a child element of head" src="http://mastykarz.nl/blog/images/InconvenientPageTitletitleelement_1159D/titleelementasachildelementoftheheadsection_thumb.png" width="480" height="64" /></a> </p>
<p>The solution to this problem was straight-forward. After removing the ContentPlaceHolder from the head section and adding the title element just below the encoding definition, the second title element disappeared from the output:</p>
<p><a href="http://mastykarz.nl/blog/images/InconvenientPageTitletitleelement_1159D/nosecondtitleelement.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="HTML output of the Publishing Page after including the title as a child control of the head element: only one title element is being rendered" border="0" alt="HTML output of the Publishing Page after including the title as a child control of the head element: only one title element is being rendered" src="http://mastykarz.nl/blog/images/InconvenientPageTitletitleelement_1159D/nosecondtitleelement_thumb.png" width="480" height="117" /></a> </p>
<h2>Lessons Learned</h2>
<p>Because I was working with MOSS 2007 I suspected it to be the reason of this faulty behavior. It turns out that although SharePoint enriches the rendering process, ASP.NET still has a lot of influence on how the output HTML looks like. Whenever something works not as you would expect it to, it might be helpful to not only look at SharePoint-specific components but those provided with ASP.NET as well.</p>
<p>At some point I compared the Master Page I was using with the <a href="http://msdn.microsoft.com/en-us/library/aa660698.aspx">Minimal Master Page</a> sample provided on <a href="http://msdn.microsoft.com/en-us/default.aspx">MSDN</a>. Surprisingly the Minimal Master Page has exactly <strong>the same issue</strong> as it wraps the title element in a ContentPlaceHolder. Understanding the code you are using is a very important part of the troubleshooting process.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e3b75f05-2c5d-4074-bc86-ce12c825742f" class="wlWriterEditableSmartContent">Technorati Tags: <a href="http://technorati.com/tags/SharePoint" rel="tag">SharePoint</a>,<a href="http://technorati.com/tags/SharePoint+2007" rel="tag">SharePoint 2007</a>,<a href="http://technorati.com/tags/MOSS+2007" rel="tag">MOSS 2007</a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=cAgjUdH1VXA:epBrkbnSQp8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=cAgjUdH1VXA:epBrkbnSQp8:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=cAgjUdH1VXA:epBrkbnSQp8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=cAgjUdH1VXA:epBrkbnSQp8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=cAgjUdH1VXA:epBrkbnSQp8:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=cAgjUdH1VXA:epBrkbnSQp8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=cAgjUdH1VXA:epBrkbnSQp8:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/cAgjUdH1VXA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/inconvenient-page-title-element/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/inconvenient-page-title-element/</feedburner:origLink></item>
		<item>
		<title>Inconvenient PublishingScheduleControl</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/1gB0UO4Cpp4/</link>
		<comments>http://blog.mastykarz.nl/inconvenient-publishingschedulecontrol/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 17:55:45 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[WCM]]></category>
		<category><![CDATA[Inconvenient SharePoint]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/inconvenient-publishingschedulecontrol/</guid>
		<description><![CDATA[ Microsoft Office SharePoint Server (MOSS) 2007 ships with a rich Web Content Management (WCM) System functionality. Among lots of functionality which simplifies managing content on websites, MOSS 2007 allows you to schedule the publication of your Publishing Pages. The process is as simple as enabling versioning, approval and items scheduling on the Pages Library [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border-right-width: 0px; margin: 0px 10px 10px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Screenshot scrape showing the scheduling end date control with the wrong &quot;Expire Immediately&quot; label" border="0" alt="Screenshot scrape showing the scheduling end date control with the wrong &quot;Expire Immediately&quot; label" align="left" src="http://mastykarz.nl/blog/images/InconvenientPublishingScheduleControl_F623/issuesmall.png" width="326" height="132" /> Microsoft Office SharePoint Server (MOSS) 2007 ships with a rich Web Content Management (WCM) System functionality. Among lots of functionality which simplifies managing content on websites, MOSS 2007 allows you to schedule the publication of your Publishing Pages. The process is as simple as enabling versioning, approval and items scheduling on the Pages Library and editing the desired publication and expiration dates on the Publishing Page. Could you imagine that even something as simple as that can get confusing to the end users?</p>
<h2>Expire immediately!</h2>
<p>MOSS 2007 allows you to define the publication and expiration date and time for every Publishing Page. As soon as you finish editing the page and save your changes SharePoint will take it over from you and will publish the page on the given date.</p>
<p>You can provide the publication date and time using the so called Publishing Schedule Control:</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Scheduling Start Date control" border="0" alt="Scheduling Start Date control" src="http://mastykarz.nl/blog/images/InconvenientPublishingScheduleControl_F623/schedulingstartdatecontrol.png" width="323" height="132" />&#160; </p>
<p>A similar control is available to enter the expiration date:</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Scheduling End Date control" border="0" alt="Scheduling End Date control" src="http://mastykarz.nl/blog/images/InconvenientPublishingScheduleControl_F623/schedulingenddate.png" width="338" height="139" />&#160; </p>
<p>Have you noticed that SharePoint asks you whether you want your page to expire <strong>Immediately</strong>? Something seems to be wrong here.</p>
<p>SharePoint allows you to set the schedule for a Publishing Page in at least three ways.</p>
<p>First of all you can go to <em>Page &gt; Page Settings and Schedule</em> page. In the schedule section you will find date and time pickers to enter the publication schedule information:</p>
<p><a href="http://mastykarz.nl/blog/images/InconvenientPublishingScheduleControl_F623/pagesettings.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Page Settings page with the Publishing Scheduling controls" border="0" alt="Page Settings page with the Publishing Scheduling controls" src="http://mastykarz.nl/blog/images/InconvenientPublishingScheduleControl_F623/pagesettings_thumb.png" width="480" height="373" /></a>&#160; </p>
<p>Did you notice that the first option for the End Date says now <strong>Never</strong> instead of <strong>Immediate</strong>? Let’s check it in one more place.</p>
<p>Another spot where you can edit the schedule information is the <em>Page Properties</em> page:</p>
<p><a href="http://mastykarz.nl/blog/images/InconvenientPublishingScheduleControl_F623/pageproperties.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Page Properties page with the schedule controls" border="0" alt="Page Properties page with the schedule controls" src="http://mastykarz.nl/blog/images/InconvenientPublishingScheduleControl_F623/pageproperties_thumb.png" width="480" height="351" /></a>&#160; </p>
<p>Also here you are able to make your page never expire. So how come the users see the <strong>Immediately</strong> label while editing the scheduling information through a Page Layout?</p>
<h2>Is it that simple?</h2>
<p>MOSS 2007 ships with two controls responsible for rendering the schedule picker. There is the <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.publishing.webcontrols.publishingschedulefieldcontrol.aspx">PublishingScheduleFieldControl</a> which can be used on Page Layouts and the <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.publishing.webcontrols.publishingschedulecontrol.aspx">PublishingScheduleControl</a> which SharePoint uses on the List Forms and on the Page Settings and Schedule page. The PublishingScheduleFieldControl control is nothing more than a wrapper for the PublishingScheduleControl. On page load it retrieves the value from the attached Column and passes it to the PublishingScheduleControl. So how come things get wrong on the Page Layout?</p>
<p>The PublishingScheduleControl has the UseAsEndDate public property (not documented in the MOSS 2007 SDK) which is responsible for rendering the proper label on the first radio button. If it’s a publishing start field it renders <em>Immediately</em> and if it’s a publishing end field it renders <em>Never</em>. As I mentioned the PublishingScheduleFieldControl uses the PublishingScheduleControl as the data input interface. Unfortunately it doesn’t provide any way to set the value for the UseAsEndDate property which therefore remains set to false.</p>
<h2>The challenge</h2>
<p>When things go wrong in SharePoint I usually try to fix it using the simplest solution possible with as little custom code as I can. The more you develop, the bigger the chance that you will introduce a brand new issue yourself.</p>
<p>So first of all I thought about creating a new Field Control, inheriting from the PublishingScheduleFieldControl, overriding the CreateChildControls method and getting the things right. Using a public property I would make it possible to set the value of the UseAsEndDate property of the underlying PublishingScheduleControl. Unfortunately, the PublishingScheduleFieldControl is sealed so you cannot inherit from it.</p>
<p>Another solution I had in mind was to create a new Field Control which would include all the functionality that the PublishingScheduleFieldControl has and then extend that with my custom UseAsEndDate property and some extra logic in the CreateChildControls method. Unfortunately for me it turned out, that the underlying PublishingScheduleControl is public but doesn’t provide a public constructor. It seemed like I would have to create a new control for this as well… So is it even possible to solve this issue without rebuilding a dozen of SharePoint controls?</p>
<h2>The fix</h2>
<p>Then I stumbled upon yet another idea: why not use a Control Adapter to set the property correctly? Initially I came up with the following piece of code:</p>
<pre class="csharp" name="code">public class PublishingScheduleFieldControlAdapter : ControlAdapter
{
  protected override void CreateChildControls()
  {
    base.CreateChildControls();

    PublishingScheduleControl scheduler = Control.Controls[0] as PublishingScheduleControl;
    if (scheduler != null)
    {
      scheduler.UseAsEndDate = true;
    }
  }
}</pre>
<p>It worked but the problem was that it got applied to <strong>all</strong> PublishingScheduleFieldControls: both for the start and the end date. So how we could distinguish one field type from another? Adding another property is not an option since the PublishingScheduleFieldControl is sealed. We could wrap it in another control and then using the Parent property determine whether we should process it or not. I thought of an easier way though and yet quite elegant one if you ask me.</p>
<p>I extended the code of my Control Adapter as follows:</p>
<pre class="csharp" name="code">public class PublishingScheduleFieldControlAdapter : ControlAdapter
{
  protected override void CreateChildControls()
  {
    base.CreateChildControls();

    BaseFieldControl schedulerFieldControl = Control as BaseFieldControl;
    if (schedulerFieldControl.CssClass.Contains(&quot;UseAsEndDate&quot;))
    {
      PublishingScheduleControl scheduler = schedulerFieldControl.Controls[0] as PublishingScheduleControl;
      if (scheduler != null)
      {
        scheduler.UseAsEndDate = true;
      }
    }
  }
}</pre>
<p>And then changed the PublishingScheduleFieldControl markup in the Page Layout:</p>
<pre class="xml" name="code">&lt;PublishingWebControls:PublishingScheduleFieldControl FieldName=&quot;PublishingStartDate&quot; InputFieldLabel=&quot;Scheduling Start Date&quot; runat=&quot;server&quot; /&gt;
&lt;PublishingWebControls:PublishingScheduleFieldControl FieldName=&quot;PublishingExpirationDate&quot; CssClass=&quot;UseAsEndDate&quot; InputFieldLabel=&quot;Scheduling End Date&quot; runat=&quot;server&quot; /&gt;</pre>
<p>And this is the result:</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Publishing Schedule controls rendered with correct labels" border="0" alt="Publishing Schedule controls rendered with correct labels" src="http://mastykarz.nl/blog/images/InconvenientPublishingScheduleControl_F623/schedulecontrolscorrect.png" width="419" height="352" /> </p>
<p>Using the CssClass property of the control I was able to distinguish the publishing start date control from the publishing end date control and apply the custom logic only when required.</p>
<p>To attach the Control Adapter to the PublishingScheduleFieldControl control I have used the following .browser file:</p>
<pre class="xml" name="code">&lt;browsers&gt;
  &lt;browser refID=&quot;Default&quot;&gt;
    &lt;controlAdapters&gt;
      &lt;adapter controlType=&quot;Microsoft.SharePoint.Publishing.WebControls.PublishingScheduleFieldControl, Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&quot; adapterType=&quot;Imtech.SharePoint.Controls.PublishingScheduleFieldControlAdapter, Imtech.SharePoint.Controls&quot; /&gt;
    &lt;/controlAdapters&gt;
  &lt;/browser&gt;
&lt;/browsers&gt;</pre>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f20cbe71-b758-433d-88ba-7e5f73a1aa35" class="wlWriterEditableSmartContent">Technorati Tags: <a href="http://technorati.com/tags/SharePoint" rel="tag">SharePoint</a>,<a href="http://technorati.com/tags/SharePoint+2007" rel="tag">SharePoint 2007</a>,<a href="http://technorati.com/tags/MOSS+2007" rel="tag">MOSS 2007</a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=1gB0UO4Cpp4:7wGJ7dOApac:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=1gB0UO4Cpp4:7wGJ7dOApac:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=1gB0UO4Cpp4:7wGJ7dOApac:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=1gB0UO4Cpp4:7wGJ7dOApac:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=1gB0UO4Cpp4:7wGJ7dOApac:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=1gB0UO4Cpp4:7wGJ7dOApac:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=1gB0UO4Cpp4:7wGJ7dOApac:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/1gB0UO4Cpp4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/inconvenient-publishingschedulecontrol/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/inconvenient-publishingschedulecontrol/</feedburner:origLink></item>
		<item>
		<title>Performance of various methods to retrieve one list item</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/dFe5Pyp2FzI/</link>
		<comments>http://blog.mastykarz.nl/performance-methods-retrieve-list-item/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 21:08:56 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/performance-methods-retrieve-list-item/</guid>
		<description><![CDATA[A while ago I did some research on performance of various approaches for aggregating data in Microsoft Office SharePoint Server 2007. Back then I have found some interesting results. In the project I’m working on at the moment, I got a slightly different challenge: what is the best way to retrieve one particular list item?
What [...]]]></description>
			<content:encoded><![CDATA[<p>A while ago I did some <a href="/performance-of-content-aggregation-queries-on-multiple-lists-revisited/">research on performance of various approaches for aggregating data in Microsoft Office SharePoint Server 2007</a>. Back then I have found some interesting results. In the project I’m working on at the moment, I got a slightly different challenge: what is the best way to retrieve one particular list item?</p>
<h2>What I already knew</h2>
<p>From the previous trials that I did I knew, that using PortalSiteMapProvider is the fastest way to perform data aggregation on MOSS 2007. Whether you will get the full benefit of it depends on your content and cache settings. If you optimize the cache settings considering the number and frequency of visitors the PortalSiteMapProvider can help you build a great performing site.</p>
<p>In my previous researches I focused on querying content stored in multiple lists/sites. The challenge was to minimize the penalty of retrieving content from multiple locations and merging it into one result. This time the challenge looked a little bit different: there was only one location I had to query, I knew <strong>exactly</strong> which list it was. All I needed to do was to retrieve a particular list item using its ID (<a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splistitem.id.aspx">SPListItem.ID</a>).</p>
<p>Although I knew all the different approaches from the previous trials I noticed that the SPList class had one method designed to retrieve items using ID’s: <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splist.getitembyid.aspx">SPList.GetItemById(int)</a>. And although I knew how fast aggregations based on the CrossListQueryCache and PortalSiteMapProvider classes were, I really hoped that this particular method would turn out to be a real gem. After all it was made to do nothing else than retrieve one list item using its ID – exactly what I needed.</p>
<h2>The test</h2>
<p>To test the various approaches I have created a small Console Application on my development VPC.</p>
<p>I have tested the following approaches:</p>
<ul>
<li>using SPQuery on the list instance</li>
<li>using the GetItemById(int) method</li>
<li>using SPSiteDataQuery on the parent Web</li>
<li>using SPSiteDataQuery on the parent Web passing the List ID (using the <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsitedataquery.lists.aspx">SPSiteDataQuery.Lists</a> Property)</li>
<li>using CrossListQueryCache</li>
<li>using PortalSiteMapProvider</li>
</ul>
<p>These are the results I got:</p>
<p><a href="http://mastykarz.nl/blog/images/Performanceofvariousmethodstoretrieveone_12E34/oneitemperformance.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Chart presenting performance of various methods to retrieve one list item" border="0" alt="Chart presenting performance of various methods to retrieve one list item" src="http://mastykarz.nl/blog/images/Performanceofvariousmethodstoretrieveone_12E34/oneitemperformance_thumb.png" width="480" height="315" /></a> </p>
<p>The vertical axis represents the duration in milliseconds. The horizontal axis represents the run number. I have executed each query 10 times. Because initial runs are quite heavy due to all the objects that have to be instantiated I have removed them from the chart above.</p>
<p>As you can see PortalSiteMapProvider and CrossListQueryCache are the absolute winners. The PortalSiteMapProvider is almost 10 times faster than the SPSiteDataQuery approach and almost 100 times faster than using the dedicated GetItemById method!</p>
<h2>The results</h2>
<p><a href="http://mastykarz.nl/blog/images/Performanceofvariousmethodstoretrieveone_12E34/oneitemavgperformance.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Chart that presents the average performance of various methods to retrieve one list item" border="0" alt="Chart that presents the average performance of various methods to retrieve one list item" src="http://mastykarz.nl/blog/images/Performanceofvariousmethodstoretrieveone_12E34/oneitemavgperformance_thumb.png" width="480" height="315" /></a> </p>
<p>I was really disappointed with the poor performance of the GetItemById method which was the worst of all approaches I have tested. It was almost 3 times worse than running an SPQuery query on the list.</p>
<p>What surprised me is the difference between the initial and all subsequent queries using the regular SPSiteDataQuery object and an SPSiteDataQuery which uses the List ID to narrow the query scope. By initially retrieving the ID of the list and storing it in a static variable you can win 2,5 times performance on the initial call and more than 15 times on the subsequent calls!</p>
<p>Surprisingly or not once again the PortalSiteMapProvider turned out to be the fastest way of retrieving data stored in SharePoint. Once again the second place was taken by the CrossListQueryCache object. Please note, that both of them require passing the List ID to the Lists query property. Because both approaches use cross-site querying that’s the only way to narrow the scope to retrieve the item with a specific ID from a particular list.</p>
<h2>One word on PortalSiteMapProvider</h2>
<p>PortalSiteMapProvider is undoubtedly the winner when it comes to effectively retrieving content from a SharePoint site. There are two things however that you have to keep in mind when choosing for the PortalSiteMapProvider class.</p>
<p>First of all it’s available in MOSS 2007 only. If you’re developing for WSSv3 you won’t be able to use it. You would have to use the SPSiteDataQuery class instead.</p>
<p>Second of all, and probably the most important, calling the <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.publishing.navigation.portalsitemapprovider.getcachedsitedataquery.aspx">PortalSiteMapProvider.GetCachedSiteDataQuery</a> method won’t give you the great results you would expect of it straight away. The PortalSiteMapProvider strongly relies on cached objects and it is therefore important that you optimize cache for <strong>your</strong> site, <strong>your</strong> content, <strong>your</strong> update frequency and <strong>your</strong> visitors. There are no magic numbers to this one. If you want to get the most of the PortalSiteMapProvider, you will have to measure the traffic on your website and tweak your settings. Not doing that will most likely work counterproductive: the PortalSiteMapProvider will query the content on every call instead of using the cached results.</p>
<h2>What I learned</h2>
<p>The first thing I learned from this research is that specific methods are not always better than the multi-purpose methods. GetItemById proves that: it’s almost 70 times slower than the PortalSiteMapProvider which allows you to do much more than only retrieving a single item using a CAML query.</p>
<p>If you really want to be sure if the method you’re using is the best for your scenario, the only thing you can do, is to create some kind of test and compare the results. It might be not perfect and you might miss some things, but at least it will give you a comparison which is better than a wild guess.</p>
<p>During this test I also found out how to use a PortalSiteMapProvider out of context of a Web Application. It turns out that you not only need the context information, but you have to include the siteMap element in App.config of your application.</p>
<h2>Summary</h2>
<p>SharePoint provides you with many different ways to retrieve a specific list item. Although it offers you some specific methods you should be careful while choosing them for a real-life solution and test them to see if they are really the best match for your scenario.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d33d6a86-bdd8-4cf3-9dd3-10ebd4576749" class="wlWriterEditableSmartContent">Technorati Tags: <a href="http://technorati.com/tags/SharePoint" rel="tag">SharePoint</a>,<a href="http://technorati.com/tags/SharePoint+2007" rel="tag">SharePoint 2007</a>,<a href="http://technorati.com/tags/MOSS+2007" rel="tag">MOSS 2007</a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=dFe5Pyp2FzI:jwn8QkM4hYE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=dFe5Pyp2FzI:jwn8QkM4hYE:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=dFe5Pyp2FzI:jwn8QkM4hYE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=dFe5Pyp2FzI:jwn8QkM4hYE:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=dFe5Pyp2FzI:jwn8QkM4hYE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=dFe5Pyp2FzI:jwn8QkM4hYE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=dFe5Pyp2FzI:jwn8QkM4hYE:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/dFe5Pyp2FzI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/performance-methods-retrieve-list-item/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/performance-methods-retrieve-list-item/</feedburner:origLink></item>
		<item>
		<title>SharePoint RTE breaks in IE8 when in editing mode</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/cRWdnwuqcPY/</link>
		<comments>http://blog.mastykarz.nl/sharepoint-rte-breaks-ie8-editing-mode/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 06:00:19 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[WCM]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Web standards]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/sharepoint-rte-breaks-ie8-editing-mode/</guid>
		<description><![CDATA[Since a couple of days I’m working on a brand new Web Content Management solution on MOSS 2007. For the first time I’ve started off using Internet Explorer 8. Considering the changes the IE team has made to the DOM rendering I wasn’t surprised when I saw that some of the SharePoint functionality doesn’t work [...]]]></description>
			<content:encoded><![CDATA[<p>Since a couple of days I’m working on a brand new Web Content Management solution on MOSS 2007. For the first time I’ve started off using Internet Explorer 8. Considering the changes the IE team has made to the DOM rendering I wasn’t surprised when I saw that some of the SharePoint functionality doesn’t work properly in IE8.</p>
<h2>When ’null’ is null goes wrong</h2>
<p>For the last couple of days I’ve been developing pieces for the brand new MOSS 2007 WCM solution for one of our customers. I’ve been working on custom Content Types, Site Definition, branding and controls. At some point I got enough resources to perform an initial build using my custom components. While editing the content of one of the pages I noticed a JavaScript error:</p>
<p><a href="http://mastykarz.nl/blog/images/SharePointRTEbreaksinIE8whenineditingmod_7082/rtejserror.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Screenshot with a JavaScript error which appears while editing text in the SharePoint Rich Text Editor in Internet Explorer 8" border="0" alt="Screenshot with a JavaScript error which appears while editing text in the SharePoint Rich Text Editor in Internet Explorer 8" src="http://mastykarz.nl/blog/images/SharePointRTEbreaksinIE8whenineditingmod_7082/rtejserror_thumb.png" width="480" height="437" /></a>&#160; </p>
<p>The first thing I thought of was <a href="/javascript-error-while-entering-text-in-the-content-editor-web-part/">the Rich Text Editor SP1 error</a>. After looking closer at the issue it turned out to be something else.</p>
<p>The Master Page I was using was shipped with some custom JavaScript. Removing it didn’t change anything. Even removing CSS didn’t help: I was still getting the JavaScript error after clicking on the Rich Text Editor:</p>
<p><a href="http://mastykarz.nl/blog/images/SharePointRTEbreaksinIE8whenineditingmod_7082/vanillajserror.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="The same JavaScript error appears even without any custom JavaScript or CSS" border="0" alt="The same JavaScript error appears even without any custom JavaScript or CSS" src="http://mastykarz.nl/blog/images/SharePointRTEbreaksinIE8whenineditingmod_7082/vanillajserror_thumb.png" width="480" height="601" /></a> </p>
<p>Surprisingly enough none of my colleagues using IE7 had the issue: it turned out to be something IE8 specific!</p>
<h2>Internet Explorer – the (r)evolution</h2>
<p>For years Internet Explorer was known for his non-standard rendering of HTML. If you’ve been working with webdesign/-development for the last few years: how many times have you had to implement a check if the browser was IE or not just to make things work? Finally after all these years Microsoft decided to change the way the things were going to turn IE into a proper browser.</p>
<p>While the IE team did a great job making Internet Explorer work according to the web standards, there is a big drawback to that change: legacy components “optimized” for previous versions of Internet Explorer don’t work correctly anymore or even worse: don’t work at all.</p>
<p>One of such components is the Rich Text Editor shipped with Windows SharePoint Services v3. While it works perfectly with IE6/7 it breaks in IE8. I haven’t found out what exactly isn’t working but only the fact that I’m getting a JavaScript error while editing text is alerting.</p>
<h2>The back door to the past</h2>
<p>The Internet Explorer team has followed the way things were going and has listened to webdevelopers all over the world. They knew that making IE working as it should, would cause trouble. Considering all the legacy web applications out there the IE team decided to build into IE8 a back door to the past: a way to make IE8 behave like IE7.</p>
<p>How it works? It’s really simple: all you have to do is to include the <em>X-UA-Compatible</em> meta element in your page and IE8 will automatically switch to the compatibility mode and render your page as its older brother:</p>
<pre class="html" name="code">&lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=7&quot; /&gt;</pre>
<p>The IE team wasn’t the only one knowing about the rendering issues. The SharePoint team has noticed the problems as well and at some point they released updated versions of all Master Pages: all of them containing the X-UA-Compatible meta element. Not surprisingly: if you’re SharePoint farm is up to date and you’re using IE8 you won’t see a change and things will keep working as they were before.</p>
<h2>There is more to the challenge</h2>
<p>While the solution to the SharePoint vs. IE8 rendering issues seems really simple, there is more to it. It is really simple if your complete solution uses legacy markup. Making IE8 behave like IE7 in all situations will fix things for you. But what if you work with branding developed according to all standards and the only issue is the editing experience in SharePoint? Using the compatibility mode in all situations might cause even more rendering issues than before, getting you even further from getting your things to work. So what should we do? Luckily there is a better way…</p>
<p>As the SharePoint editing mode is the only area causing trouble why not render the X-UA-Compatible meta element conditionally when in editing mode only? It would solve the rendering issues and wouldn’t mess up your branding while in display mode. The best of it all is that you can achieve that using the out-of-the-box available SharePoint controls:</p>
<pre class="html" name="code">&lt;PublishingWebControls:EditModePanel runat=&quot;server&quot;&gt;
  &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=7&quot; /&gt;
&lt;/PublishingWebControls:EditModePanel&gt;</pre>
<p>MOSS 2007 ships with the EditModePanel control, which has no User Interface and all it does is to render its content in editing mode only. It is extremely useful to render input fields to manage content and Page properties but also to output conditional content… like the X-UA-Compatible meta element.</p>
<p><a href="http://mastykarz.nl/blog/images/SharePointRTEbreaksinIE8whenineditingmod_7082/renderingok.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Site renders correctly after adding the X-UA-Compatible meta element" border="0" alt="Site renders correctly after adding the X-UA-Compatible meta element" src="http://mastykarz.nl/blog/images/SharePointRTEbreaksinIE8whenineditingmod_7082/renderingok_thumb.png" width="480" height="427" /></a> </p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f8d81bb3-20d0-488b-874f-e7a07f81e92c" class="wlWriterEditableSmartContent">Technorati Tags: <a href="http://technorati.com/tags/SharePoint" rel="tag">SharePoint</a>,<a href="http://technorati.com/tags/SharePoint+2007" rel="tag">SharePoint 2007</a>,<a href="http://technorati.com/tags/MOSS+2007" rel="tag">MOSS 2007</a>,<a href="http://technorati.com/tags/Internet+Explorer+8" rel="tag">Internet Explorer 8</a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=cRWdnwuqcPY:aOltxDRE1lk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=cRWdnwuqcPY:aOltxDRE1lk:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=cRWdnwuqcPY:aOltxDRE1lk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=cRWdnwuqcPY:aOltxDRE1lk:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=cRWdnwuqcPY:aOltxDRE1lk:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=cRWdnwuqcPY:aOltxDRE1lk:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=cRWdnwuqcPY:aOltxDRE1lk:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/cRWdnwuqcPY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/sharepoint-rte-breaks-ie8-editing-mode/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/sharepoint-rte-breaks-ie8-editing-mode/</feedburner:origLink></item>
		<item>
		<title>Templates-based menu control for SharePoint</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/1cJ54CsaTc8/</link>
		<comments>http://blog.mastykarz.nl/templates-based-menu-control-sharepoint/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 11:18:47 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[WCM]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/templates-based-menu-control-sharepoint/</guid>
		<description><![CDATA[Sometimes doing the simplest things turns out to be unnecessary difficult. This is true with SharePoint development in particular. For example: have you ever tried creating a menu control based on a standard Site Map Provider which would render a nested unordered list (UL) and nothing else? I have, and finally have a solution that [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes doing the simplest things turns out to be unnecessary difficult. This is true with SharePoint development in particular. For example: have you ever tried creating a menu control based on a standard Site Map Provider which would render a nested unordered list (UL) and nothing else? I have, and finally have a solution that I’m happy about: a templates-based menu control.</p>
<h2>SharePoint and menus</h2>
<p>If you ever looked at the out-of-the-box available Master Pages provided with MOSS 2007 you know that they use the standard ASP.NET menu control to render the navigation. While it definitely does the job, have you ever looked at the rendered HTML?</p>
<p><a href="http://mastykarz.nl/blog/images/TemplatesbasedmenucontrolforSharePoint_9103/ootbmarkup.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Screenshot of a home page of a default SharePoint Publishing Portal with rendered HTML source highlighted" border="0" alt="Screenshot of a home page of a default SharePoint Publishing Portal with rendered HTML source highlighted" src="http://mastykarz.nl/blog/images/TemplatesbasedmenucontrolforSharePoint_9103/ootbmarkup_thumb.png" width="480" height="333" /></a> </p>
<p>Compare how much markup is being used for a couple of menu items which could be rendered like:</p>
<pre class="html" name="code">&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/PressReleases/Pages/default.aspx&quot;&gt;Press Releases&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/Search&quot;&gt;Search&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</pre>
<p>See the difference? A couple of issues should become clearly visible at this point.</p>
<h3>ASP.NET menus are poorly accessible</h3>
<p>Have you ever took a look at HTML as seen by screen readers or search bots? Because the links are buried under a bunch of tables it’s difficult for such applications to read them correctly. All the tables around the links make the visitors of your site loose the track of what they are “looking” at and just navigate away from your site. Additionally many search bots can’t properly deal with too complex markup. Making the HTML of your pages too complex can result in lower rating of your content.</p>
<h3>How much markup do I have to download?</h3>
<p>The markup of a standard ASP.NET menu I have showed you in the image above is 1308 bytes. Rendering the same menu using an unordered list is 185 bytes only! The standard ASP.NET menu produces 7 times more markup than you would want it to. Also consider the fact that the menu above consists of only two items. What if we were talking about a medium size website with 20 links? How much markup would you have to download only to see a couple of links?</p>
<h3>Branding costs way too much time</h3>
<p>Have you ever met a designer who would produce HTML that would match the markup of the ASP.NET menu in 100%? I’m glad I haven’t. Somehow designers have more experience with writing correct markup than most ASP.NET developers. Good designers seem to know what is going to work and what wouldn’t. If a designer gives you branding implemented as static HTML pages, CSS, JavaScript and the only thing you would have to do is to copy &amp; paste all the different pieces in MOSS 2007, you would still spend hours on getting it all working with the CSS you received. There is no chance that branding a table would work with CSS designed for a list. You would have to change one or the other and that costs time – a lot of it.</p>
<h2>ASP.NET menu anatomy</h2>
<p>ASP.NET menus are not that bad. There are situations when you could use them and experience no problems at all. There are still many applications being developed for environments where performance, bandwidth and accessibility are not an issue. And although I would totally agree that it’s a bad practice to deliver poor markup, people do it, and it works.</p>
<p>ASP.NET menus have one great concept implemented in them: the templates. Using a template you can define placeholder for your data which is then filled using data binding. Although this concept could theoretically give you full control of the rendered HTML markup and separate the logic of the menu control from the rendered HTML, the ASP.NET menu fails to do the job correctly. Yes: you can define your own template but on the output everything you defined is still being rendered in a cells of a nested table.</p>
<h2>We should know better</h2>
<p>By know many people found their way around the issue of ASP.NET menus on MOSS 2007 Web Content Management solutions. So have I. In the last few years I have worked on a few Web Content Management solutions built on top of MOSS 2007: all of them being Internet-facing sites. In all that time me and my colleagues were trying to find a way to get rid of all these tables and get some more control over the rendered HTML to make it match the branding we had to implement.</p>
<p>At some point we stumbled upon the <a href="http://www.asp.net/CssAdapters/">CSS-friendly Control Adapters</a>. And while they definitely do the job I wasn’t particularly happy about writing HTML using .NET code. Mixing the logic of the Menu with a Control Adapter and the HTML rendering didn’t make it easier for us to maintain and modify the code when needed. Somehow it wasn’t the grail we were looking for.</p>
<p>In the meantime we tried some other approaches including inheriting from the standard ASP.NET menu controls, overriding stuff and creating our own controls from scratch. After all how difficult it can be to create a menu control that gets the data from a Site Map Provider and renders them as an unordered list? My answer? Much more difficult than it should be.</p>
<h2>A solution (candidate)</h2>
<p>Recently I decided to give it another chance. I still wanted to get the minimal amount of custom code, full control of the rendered HTML and preferably not use .NET to write HTML. I was still charmed by the idea of having these templates you could define in your Master Page/Page Layout.</p>
<p>Here are the results of my work:</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Clipping of a SharePoint home page with a menu rendered as an unordered list" border="0" alt="Clipping of a SharePoint home page with a menu rendered as an unordered list" src="http://mastykarz.nl/blog/images/TemplatesbasedmenucontrolforSharePoint_9103/ulmenu.png" width="356" height="257" /> </p>
<p>Doesn’t look that awesome, does it? Now let’s have a look at the rendered HTML:</p>
<p><a href="http://mastykarz.nl/blog/images/TemplatesbasedmenucontrolforSharePoint_9103/ulmenusource.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Clipping showing the HTML of the SharePoint menu rendered as an unordered list" border="0" alt="Clipping showing the HTML of the SharePoint menu rendered as an unordered list" src="http://mastykarz.nl/blog/images/TemplatesbasedmenucontrolforSharePoint_9103/ulmenusource_thumb.png" width="480" height="252" /></a> </p>
<p>And this is how it did it:</p>
<p><a href="http://mastykarz.nl/blog/images/TemplatesbasedmenucontrolforSharePoint_9103/ulmenuaspx.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Code snippet for the menu from the Master Page" border="0" alt="Code snippet for the menu from the Master Page" src="http://mastykarz.nl/blog/images/TemplatesbasedmenucontrolforSharePoint_9103/ulmenuaspx_thumb.png" width="480" height="140" /></a> </p>
<p>To keep a long story short: I have developed a custom control that allows you to define custom templates and using data binding renders the menu items using your own templates!</p>
<p>Using the TemplatedMenu you can add a menu control to your page and use your own rendering without writing a line of code! Comparing to using a Control Adapter, the deployment of the TemplatedMenu is fully supported using the standard SharePoint WSP. If you want to use a Control Adapter in your solution, you have to deploy not only the assembly but also the .browser file what gets challenging in environments with multiple web front ends.</p>
<p>The TemplatedMenu is available on <a href="http://codeplex.com">CodePlex</a>. Feel free to experiment with it. I’m curious to hear if it works for you and if there is anything else you find challenging.</p>
<p>To help you understand what I’ve built and how it works I’ve included XML comments in the code. If you’re using <a href="http://www.devexpress.com/">DevExpress</a> you can easily view it using the <a href="http://code.google.com/p/cr-documentor/">Documentor</a> plugin.</p>
<p><a href="http://mastykarz.nl/blog/images/TemplatesbasedmenucontrolforSharePoint_9103/xmlcommentspreview.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Viewing the XML comments in code using the Documentor plugin for DevExpress" border="0" alt="Viewing the XML comments in code using the Documentor plugin for DevExpress" src="http://mastykarz.nl/blog/images/TemplatesbasedmenucontrolforSharePoint_9103/xmlcommentspreview_thumb.png" width="480" height="365" /></a> </p>
<p>The TemplatedMenu is provided as-is. Although it would be really cool if it could help you in your solution, I give you no guarantee it will. You use it at your own risk.</p>
<p>Download: <a href="http://imtech.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28513">Imtech SharePoint TemplatedMenu</a> (ZIP, 12KB)</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:91e83818-0ff3-47f6-b795-fbfbd49da91b" class="wlWriterEditableSmartContent">Technorati Tags: <a href="http://technorati.com/tags/SharePoint" rel="tag">SharePoint</a>,<a href="http://technorati.com/tags/SharePoint+2007" rel="tag">SharePoint 2007</a>,<a href="http://technorati.com/tags/MOSS+2007" rel="tag">MOSS 2007</a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=1cJ54CsaTc8:zHwmMM0zWtI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=1cJ54CsaTc8:zHwmMM0zWtI:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=1cJ54CsaTc8:zHwmMM0zWtI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=1cJ54CsaTc8:zHwmMM0zWtI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=1cJ54CsaTc8:zHwmMM0zWtI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=1cJ54CsaTc8:zHwmMM0zWtI:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=1cJ54CsaTc8:zHwmMM0zWtI:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/1cJ54CsaTc8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/templates-based-menu-control-sharepoint/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/templates-based-menu-control-sharepoint/</feedburner:origLink></item>
		<item>
		<title>WCF and SharePoint: context != context</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/IAY8nfZ0hsg/</link>
		<comments>http://blog.mastykarz.nl/wcf-sharepoint-context/#comments</comments>
		<pubDate>Sun, 07 Jun 2009 12:04:41 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/wcf-sharepoint-context/</guid>
		<description><![CDATA[Recently I got interested in Windows Communication Foundation (WCF) Services and SharePoint. I’ve heard some great stories about how WCF can improve the architecture of your solutions. On the other hand I’ve heard some complaints about how complex the integration with SharePoint is. To keep it short: reason enough to check it out myself.
Hello World
To [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I got interested in Windows Communication Foundation (WCF) Services and SharePoint. I’ve heard some great stories about how WCF can improve the architecture of your solutions. On the other hand I’ve heard some complaints about how complex the integration with SharePoint is. To keep it short: reason enough to check it out myself.</p>
<h2>Hello World</h2>
<p>To be honest I haven’t worked with WCF services yet. Somehow the new technology passed me and I didn’t even give it a chance. Recently I stumbled upon <a href="http://daniellarson.spaces.live.com/">Daniel Larson</a>’s book <a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http://www.amazon.com/Developing-Service-Oriented-Applications-Microsoft%25C3%2582%25C2%25AE-PRO-Developer/dp/0735625913%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1215991072%26sr%3D1-3&amp;tag=larsontechnol-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325">Developing Service-Oriented AJAX Applications on the Microsoft Platform</a>. Not surprisingly Daniel heavily uses WCF services to show us what can be achieved using ASP.NET 3.5. Reason enough to try some things out myself.</p>
<p>So how do you start with WCF and SharePoint? <a href="http://www.winsmarts.com/">Sahil Malik</a> did a great job covering that particular subject. Sahil wrote a <a href="http://blah.winsmarts.com/2008-5-SharePoint_as_a_WCF_Host.aspx">series of topics covering almost every aspect of the process of working with WCF in context of SharePoint</a>: from <a href="http://blah.winsmarts.com/2008-5-SharePoint_2007_as_a_WCF_host_-_Step_-1,_make_a_WCF_Home.aspx">creating the directory hosting the WCF services</a>, through <a href="http://blah.winsmarts.com/2008-5-Super_Easy_way_to_add_WCF_to_SharePoint_2007__wwwcodeplexcom-SPWCFSupport.aspx">configuring the SharePoint Web Application to accept WCF requests</a>, to <a href="http://blah.winsmarts.com/2008-9-Deploying_WCF_EndPoints_as_solutions_in_SharePoint_2007.aspx">deploying WCF end points as solutions</a>.</p>
<p>One of the steps in configuring a SharePoint Web Application to handle WCF requests is to register a Virtual Path Provider. It turns out that SharePoint doesn’t handle requests to .svc files properly. Sahil did a great job and created a <a href="http://codeplex.com">CodePlex</a> project called <a href="http://www.codeplex.com/SPWCFSupport">Winsmarts SharePoint WCF Support</a> which contains all the components required to make it work. The downside is that Sahil didn’t create a SharePoint Solution (.wsp) for it, so you’d have to make one yourself. It’s absolutely worth doing as it’s something you’ll be using in all your SharePoint+WCF projects. I chose the simple approach and used <a href="http://wspbuilder.codeplex.com/">WSPBuilder</a> to get the job done. I copied Sahil’s code, wrapped it in a project and used WSPBuilder to create a Solution for me. To spare you that 10 extra minutes of work I published my WSP on CodePlex @ <a title="http://imtech.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28399" href="http://imtech.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28399">http://imtech.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28399</a>.</p>
<p>Following Sahil’s instructions I was quite fast up and running: I had my custom WCF service running on a SharePoint Web Application:</p>
<p><a href="http://mastykarz.nl/blog/images/WCFandSharePointHelloWorld_A553/sharepointwcfservice.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Two Internet Explorer windows next to each other. Left shows a WCF service, right the home page of a SharePoint Publishing site." border="0" alt="Two Internet Explorer windows next to each other. Left shows a WCF service, right the home page of a SharePoint Publishing site." src="http://mastykarz.nl/blog/images/WCFandSharePointHelloWorld_A553/sharepointwcfservice_thumb.png" width="480" height="346" /></a> </p>
<p>Then I decided to take it a step further and check if it properly handles SharePoint context.</p>
<h2>Why is context so important?</h2>
<p>Every request you make in ASP.NET is wrapped in a context object. That object contains a lot of information including current location, authenticated user, etc. SharePoint uses that mechanism too. Every request made towards a SharePoint site is wrapped in an instance of the <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spcontext.aspx">Microsoft.SharePoint.SPContext</a> class. Comparing to the plain ASP.NET context object, the SPContext contains a lot of valuable SharePoint-specific information including references to the current Site Collection (SPSite), Site (SPWeb), List (SPList), Item (SPListItem), etc. Considering that almost every action you would perform using a WCF service on SharePoint requires one of these objects it is very useful to have them around instead of instantiating them yourself.</p>
<h2>SharePoint context magic</h2>
<p><img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="IIS Manager window with " border="0" alt="IIS Manager window with " align="left" src="http://mastykarz.nl/blog/images/WCFandSharePointHelloWorld_A553/_layouts.png" width="272" height="252" />How the context works? If you’ve been working with SharePoint you probably know of the <em>_layouts</em> Virtual Directory. In IIS Manager it looks like a regular IIS Virtual Directory. The cool thing is the SharePoint magic that happens behind the scenes: you can append <em>_layouts</em> to every existing path on your SharePoint site and while it still points to files located in 12\TEMPLATE\LAYOUTS on your web server, it instantiates context objects based on the URL, eg. <em>http://moss/_layouts/settings.aspx</em> opens settings for the Root Site but <em>http://moss/PressReleases/_layouts/settings.aspx</em> opens settings for the <em>Press Releases</em> Site. In both cases we’re requesting the same <em>settings.aspx</em> page located in <em>12\TEMPLATE\LAYOUTS</em> but it does different things depending on the URL used to call it. See the magic?</p>
<p>Following Sahil’s advice to keep the things clean, I have decided to create a directory called <em>_wcf </em>under the root of my Web Application. Additionally I have created a Virtual Directory pointing to it:</p>
<p><a href="http://mastykarz.nl/blog/images/WCFandSharePointHelloWorld_A553/_wcfvirtualdirectory.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="IIS Manager window showing the content of a SharePoint Web Application. The _wcf Virtual Directory is highlighted" border="0" alt="IIS Manager window showing the content of a SharePoint Web Application. The _wcf Virtual Directory is highlighted" src="http://mastykarz.nl/blog/images/WCFandSharePointHelloWorld_A553/_wcfvirtualdirectory_thumb.png" width="480" height="180" /></a>&#160;</p>
<p>Unfortunately the SharePoint magic wasn’t working for me:</p>
<p><a href="http://mastykarz.nl/blog/images/WCFandSharePointHelloWorld_A553/_wcfsiterelative.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Two Internet Explorer windows next to each other. Left one shows the contents of a WCF service. The right one shows an error page for the &#39;Resource cannot be found error&#39;" border="0" alt="Two Internet Explorer windows next to each other. Left one shows the contents of a WCF service. The right one shows an error page for the &#39;Resource cannot be found error&#39;" src="http://mastykarz.nl/blog/images/WCFandSharePointHelloWorld_A553/_wcfsiterelative_thumb.png" width="480" height="346" /></a> </p>
<p>It turns out that the SharePoint magic works for Virtual Directories owned by SharePoint not all Virtual Directories under a SharePoint Web Application. That takes us to two conclusions.</p>
<h2>context != context</h2>
<p>There is context and context that we’re talking about while referring to a WCF service running on a SharePoint Web Application. The first one is all about making a WCF service available through the URL of a Web Application using the SharePoint technologies. The request gets authenticated and you are able to get some information using the SPContext object. Let’s call it SharePoint context.</p>
<p>The second context is the Site Context. Remember how we were able to call one and the same <em>settings.aspx</em> page in context of different sites (Root Site and <em>Press Releases</em> Site) and make it behave differently depending on the URL? Site Context is all about being able to fully benefit of the context information provided by SharePoint and leverage it for your purposes. As far as I know such functionality is available to Virtual Directories owned by SharePoint only. While debugging the custom Virtual Path Provider I’ve found out that a request to <em>http://moss/PressReleases/_wcf/SharePointTestService.svc</em> is being passed to the Virtual Path Provider as <em>~/PressReleases/_wcf/SharePointTestService.svc</em> A similar request to <em>http://moss/PressReleases/_layouts/settings.aspx</em> is being transformed to <em>~/_layouts/settings.aspx</em> before it even hits the Virtual Path Provider! See the difference?</p>
<h2>Once again it’s all about context</h2>
<p>The second conclusion takes us to a question: do you really need Site Context in your WCF service to make it useful? It depends on what it is supposed to do and how you will leverage the functionality. Theoretically you would be able to get to the data in SharePoint even without the context object. As your service is running on a SharePoint Web Application you could instantiate a reference to Site Collection and all other objects you might need.</p>
<p>Whether your WCF service requires context or not determines your deployment process. WCF services that depend on Site Context must be deployed in one of the Virtual Directories owned by SharePoint: preferably <em>_layouts</em> or <em>_vti_bin </em>(where all SharePoint web services are located by the way).</p>
<p>Many people are concerned about deploying to locations owned by SharePoint. First of all there is a chance that a SharePoint update or a Service Pack, or a future version might deploy a file with the same name to the same location. Any existing file would be overwritten. You could mitigate this by creating a subfolder and store your files there. Choosing a non-general name (something else than <em>wcf</em>) might be a wise choice if you want to be sure that nobody will overwrite your files.</p>
<p>Another thing many people worry about is the security: everything you put in one of the SharePoint’s Virtual Directories is available across the whole Farm. You could partly suppress this by deploying the service’s assemblies to a specific Web Application. Everyone who would try to reference the service through a different Web Application would get a nasty error. It’s not a perfect solution but it could help you to solve some security issues.</p>
<p>On the other hand there might be situations when you won’t be needing the Site Context. In such scenario you can create a Virtual Directory under your SharePoint Web Application and everything will work just fine. One more question you should answer before you make your choice is: just because your service doesn’t need the Site Context today, are you sure it won’t be needing it tomorrow?</p>
<h2>Summary</h2>
<p>WCF services are really powerful and can improve the architecture of your solution. Deploying WCF services to a SharePoint Web Application requires you to configure some components which make calling WCF services possible. While WCF service give you great power of providing data stored in SharePoint to external clients, you have to consider a few things before you determine the architecture of your solution.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:b99f249d-444e-4f4a-8702-646ffca9ad76" class="wlWriterEditableSmartContent">Technorati Tags: <a href="http://technorati.com/tags/SharePoint" rel="tag">SharePoint</a>,<a href="http://technorati.com/tags/SharePoint+2007" rel="tag">SharePoint 2007</a>,<a href="http://technorati.com/tags/MOSS+2007" rel="tag">MOSS 2007</a>,<a href="http://technorati.com/tags/WSS+3.0" rel="tag">WSS 3.0</a>,<a href="http://technorati.com/tags/WCF" rel="tag">WCF</a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=IAY8nfZ0hsg:Q3PmU_ouK2I:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=IAY8nfZ0hsg:Q3PmU_ouK2I:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=IAY8nfZ0hsg:Q3PmU_ouK2I:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=IAY8nfZ0hsg:Q3PmU_ouK2I:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=IAY8nfZ0hsg:Q3PmU_ouK2I:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=IAY8nfZ0hsg:Q3PmU_ouK2I:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=IAY8nfZ0hsg:Q3PmU_ouK2I:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/IAY8nfZ0hsg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/wcf-sharepoint-context/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/wcf-sharepoint-context/</feedburner:origLink></item>
		<item>
		<title>5 Great SharePoint sessions you can’t miss</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/JFf25GTzFPs/</link>
		<comments>http://blog.mastykarz.nl/5-great-sharepoint-sessions/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 05:19:51 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[SharePint]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Events]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/5-great-sharepoint-sessions/</guid>
		<description><![CDATA[ Upcoming SDN Event, on June 26 in Houten, the Netherlands, there will be five great SharePoint sessions you cannot miss:
SharePoint Mythbusters: Debunking common SharePoint Farm Misconceptions &#8211; Spencer Harbar     This interactive session will dive into common SharePoint Farm Myths and discuss common misconceptions around Global Deployments, Farm Topologies, Shared Service [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Software Development Network Event" border="0" alt="Software Development Network Event" align="right" src="http://mastykarz.nl/blog/images/5GreatSharePointsessionsyoucantmiss_6715/SDNEvent400px.jpg" width="253" height="48" /> Upcoming SDN Event, on June 26 in Houten, the Netherlands, there will be five great SharePoint sessions you cannot miss:</p>
<p><strong>SharePoint Mythbusters: Debunking common SharePoint Farm Misconceptions &#8211; Spencer Harbar </strong>    <br />This interactive session will dive into common SharePoint Farm Myths and discuss common misconceptions around Global Deployments, Farm Topologies, Shared Service Providers, High Availability, Security and more. Alongside best practices for each “myth”, the SharePoint “magic numbers” will be covered and there will be plenty of scope to discuss any particular queries you may have on farm deployment</p>
<p><strong>Best Practices for Virtualization with Hyper V and SharePoint &#8211; Bob Fox</strong>     <br />In this presentation I am going to give an overview of Microsoft Windows Server 2008 Hyper Virtualization Technology with a strong emphasis on how to leverage using SharePoint in a Virtual Environment. Some of the topics covered: &#8211; Hyper V What is it &#8211; Hyper V what are the benefits &#8211; Hyper V What you need to know &#8211; Hyper v How to implement (Demo) &#8211; Hyper v How do I deploy my SharePoint environments (Demo) &#8211; Hyper V Recommendations and take away info</p>
<p><strong>Kerberos part 1: No ticket touting here. Does SharePoint add another head? &#8211; Spencer Harbar and Bob Fox</strong>     <br />This session will provide an overview of Kerberos and the benefits it offers in a SharePoint 2007 deployment including: Discussion of whether your SharePoint deployment needs Kerberos. A tour of the required pre-requisites and configuration settings. Best Practices for automating configuration in a SharePoint Farm. Best Practices for diagnosing common configuration errors</p>
<p><strong>Kerberos part 2: advanced scenarios and additional considerations &#8211; Spencer Harbar and Bob Fox</strong>     <br />This second Kerberos session will provide an example, end to end scenario with MOSS, Excel Services and 3rd Party applications, and dive into additional troubleshooting and auditing best practices, known issues and workarounds, including Q&amp;A/Discussion. This session is part two of a two part session. Part two assumes attendees are familiar with the concepts presented in part one.</p>
<p><strong>Why SharePoint Application Pages? &#8211; Robin Meuré</strong>     <br />When you are developing custom solutions on top of SharePoint you often need a page (or maybe even more) in Central Admin where you can configure your solution. And of course you want to this page to look like a SharePoint page and probably you also want to use the SharePoint controls because, if you are like me, you are a lazy developer and don’t want to reinvent the wheel over and over gain. Aside to settings the configuration you are also interested in how to store your configuration.</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="SharePint - SharePoint by day, SharePint by night" border="0" alt="SharePint - SharePoint by day, SharePint by night" src="http://mastykarz.nl/blog/images/5GreatSharePointsessionsyoucantmiss_6715/sparepintlargeblack1.png" width="472" height="151" /> </p>
<p>Additionally there will be a SharePint after the event so you will have the opportunity to meet a lot of great people involved with the Dutch SharePoint community and either talk geek or just hang around with some drinks. Before you attend: don’t forget to register at <a href="http://sdn.nl">SDN.nl</a>. See you there!</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2d3f57be-0ebb-4583-8614-35c07ceafe26" class="wlWriterEditableSmartContent">Technorati Tags: <a href="http://technorati.com/tags/SharePoint" rel="tag">SharePoint</a>,<a href="http://technorati.com/tags/SharePoint+2007" rel="tag">SharePoint 2007</a>,<a href="http://technorati.com/tags/WSS+3.0" rel="tag">WSS 3.0</a>,<a href="http://technorati.com/tags/MOSS+2007" rel="tag">MOSS 2007</a>,<a href="http://technorati.com/tags/SDN" rel="tag">SDN</a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=JFf25GTzFPs:4aUjiukQSFo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=JFf25GTzFPs:4aUjiukQSFo:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=JFf25GTzFPs:4aUjiukQSFo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=JFf25GTzFPs:4aUjiukQSFo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=JFf25GTzFPs:4aUjiukQSFo:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=JFf25GTzFPs:4aUjiukQSFo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=JFf25GTzFPs:4aUjiukQSFo:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/JFf25GTzFPs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/5-great-sharepoint-sessions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/5-great-sharepoint-sessions/</feedburner:origLink></item>
		<item>
		<title>SharePoint BLOB caching issue solved</title>
		<link>http://feedproxy.google.com/~r/WaldekMastykarz/~3/tRkVDPESSkw/</link>
		<comments>http://blog.mastykarz.nl/sharepoint-blob-caching-issue-solved/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 05:35:39 +0000</pubDate>
		<dc:creator>Waldek Mastykarz</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[WCM]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Inconvenient SharePoint]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://blog.mastykarz.nl/sharepoint-blob-caching-issue-solved/</guid>
		<description><![CDATA[A couple of weeks ago Chris O’Brien – fellow MVP wrote an article on the research of the SharePoint BLOB cache he has done. During that research he has experienced some issues with some of the files not being cached properly on the client causing the browser to request the file every single time. As [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of weeks ago <a href="http://www.sharepointnutsandbolts.com/">Chris O’Brien</a> – fellow MVP wrote <a href="http://www.sharepointnutsandbolts.com/2009/05/optimization-blob-caching-and-http-304s.html">an article on the research of the SharePoint BLOB cache</a> he has done. During that research he has experienced some issues with <em>some</em> of the files not being cached properly on the client causing the browser to request the file every single time. As I’m working with Web Content Management solutions on SharePoint a lot, it definitely took my attention.</p>
<p>After spending a few days on it, trying almost every possible solution I thought I’d found a solution to this issue. Want to know what it is? Read Chris’ article where he discusses the whole thing: <a href="http://www.sharepointnutsandbolts.com/2009/05/more-on-optimization-http-304s-etc.html">More on optimization, HTTP 304s etc. – a solution?</a></p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c4cd02ad-cc08-446b-95ad-eb9c3b9ca59a" class="wlWriterEditableSmartContent">Technorati Tags: <a href="http://technorati.com/tags/SharePoint" rel="tag">SharePoint</a>,<a href="http://technorati.com/tags/SharePoint+2007" rel="tag">SharePoint 2007</a>,<a href="http://technorati.com/tags/MOSS+2007" rel="tag">MOSS 2007</a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=tRkVDPESSkw:RkX3JcXgQmo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=tRkVDPESSkw:RkX3JcXgQmo:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=tRkVDPESSkw:RkX3JcXgQmo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=tRkVDPESSkw:RkX3JcXgQmo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=tRkVDPESSkw:RkX3JcXgQmo:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WaldekMastykarz?a=tRkVDPESSkw:RkX3JcXgQmo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WaldekMastykarz?i=tRkVDPESSkw:RkX3JcXgQmo:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WaldekMastykarz/~4/tRkVDPESSkw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.mastykarz.nl/sharepoint-blob-caching-issue-solved/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.mastykarz.nl/sharepoint-blob-caching-issue-solved/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 1.370 seconds. --><!-- Cached page generated by WP-Super-Cache on 2009-07-18 06:05:00 -->
