<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Not Rocket Science &#187; Sharepoint</title>
	<atom:link href="http://www.stum.de/category/sharepoint/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.stum.de</link>
	<description>Random thoughts of neat disorder</description>
	<lastBuildDate>Thu, 05 Jan 2012 20:42:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Connected Web Parts are bugged in SharePoint 2010</title>
		<link>http://www.stum.de/2011/01/23/connected-web-parts-are-bugged-in-sharepoint-2010/</link>
		<comments>http://www.stum.de/2011/01/23/connected-web-parts-are-bugged-in-sharepoint-2010/#comments</comments>
		<pubDate>Sun, 23 Jan 2011 01:02:35 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Sharepoint]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=963</guid>
		<description><![CDATA[Update: This is an intentional design change, see the Microsoft answer in this thread. Just stumbled upon a bug in SharePoint 2010. Imagine this scenario: You have two lists and add them to a Site as DataForm WebParts. You then configure the Web Parts so that one of them sends Filter values to the other [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update:</strong> This is an intentional design change, see the Microsoft answer in <a href="http://social.msdn.microsoft.com/Forums/en-US/sharepoint2010general/thread/a6f73662-03a8-4d0e-8dad-bd4a2df0a180">this thread</a>.</p>
<p>Just stumbled upon a bug in SharePoint 2010. Imagine this scenario: You have two lists and add them to a Site as DataForm WebParts. You then configure the Web Parts so that one of them sends Filter values to the other one and uncheck the option for "Send first row to connected Web Parts when page loads". You refresh the Page and notice that the list that receives the Filter (the Consumer) does not show any items because the list that provides the Filter (the Provider) does not have any items selected.</p>
<p>In SharePoint 2007, not selecting an item in the Provider List would cause the consumer List to display all items instead, which was (at least for us) highly desirable. In SharePoint 2010, you have to select an Item in the Provider to provide a filter and there is no way to have the Consumer List display all items anymore.</p>
<p>The reason why I think this is a bug is the result of an extended Debugging session that eventually led me to the class Microsoft.SharePoint.WebPartPages.DataFormWebPart and specifically it's method ApplyReceivedFilterData. I'm not going to paste the source of this class, but the culprit is this line: <code>if (dictionary2[str] != null)</code></p>
<p>This is supposed to only add Filters that have a value and skip the ones that are null. The problem is that dictionary2[str] is not null but <a href="http://msdn.microsoft.com/en-us/library/system.dbnull(VS.90).aspx">DBNull</a>, which then causes SharePoint 2010 to process the value anyway and generate a nasty <code>&lt;Query&gt;&lt;Where&gt;&lt;IsNull&gt;&lt;FieldRef Name="FieldToReceiveFilter" /&gt;&lt;/IsNull&gt;&lt;/Where&gt;&lt;/Query&gt;</code> in the SelectCommand of the underlying DataSource</p>
<p>Unfortunately, DataFormWebPart.ApplyReceivedFilterData is not virtual, so sub-classing it does not seem to be an option. Not sure if there is a good workaround for this. I verified this behavior in both RTM and December 2010 Hotfixed versions of SharePoint 2010.</p>
<p>Edit: Just checked the SharePoint 2007 DataFormWebPart.ApplyReceivedFilterData() in Reflector and lo and behold, they did check for DBNull in 2007:</p>
<pre class="prettyprint lang-cs">
        Label_0046:
            if (current[str] is DBNull)
            {
                goto Label_006D;
                // Note by myself: Label_006D is the call to MoveNext, aka. continue
            }
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2011/01/23/connected-web-parts-are-bugged-in-sharepoint-2010/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SPWebApplication.BlockedFileExtensions does not contain dots</title>
		<link>http://www.stum.de/2010/09/17/spwebapplication-blockedfileextensions-does-not-contain-dots/</link>
		<comments>http://www.stum.de/2010/09/17/spwebapplication-blockedfileextensions-does-not-contain-dots/#comments</comments>
		<pubDate>Fri, 17 Sep 2010 18:43:16 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Sharepoint]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=904</guid>
		<description><![CDATA[Just a reminder post for me: SPWebApplication.BlockedFileExtensions outputs a Collection&#60;string> that does not contain the leading dot. However, Path.GetExtension does return the extension with a dot (or string.Empty in case the file does not have an extension). Additionally, there may be upper/lowercase conflicts.]]></description>
			<content:encoded><![CDATA[<p>Just a reminder post for me: <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spwebapplication.blockedfileextensions.aspx">SPWebApplication.BlockedFileExtensions</a> outputs a Collection&lt;string> that does not contain the leading dot.</p>
<p>However, <a href="http://msdn.microsoft.com/en-us/library/system.io.path.getextension.aspx">Path.GetExtension</a> does return the extension with a dot (or string.Empty in case the file does not have an extension).</p>
<p>Additionally, there may be upper/lowercase conflicts.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/09/17/spwebapplication-blockedfileextensions-does-not-contain-dots/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Is the SharePoint Object Model too weak for excellent Applications?</title>
		<link>http://www.stum.de/2010/07/16/is-the-sharepoint-object-model-too-weak-for-excellent-applications/</link>
		<comments>http://www.stum.de/2010/07/16/is-the-sharepoint-object-model-too-weak-for-excellent-applications/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 06:21:08 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Sharepoint]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=870</guid>
		<description><![CDATA[I'm doing SharePoint since about 3 years now, starting with SharePoint 2007 and moving into 2010 in November when the Beta was released. While I can't say that I'm in love with the development experience, I do think it's a very capable product for the users. During the years, I've learned many of the quirks [...]]]></description>
			<content:encoded><![CDATA[<p>I'm doing SharePoint since about 3 years now, starting with SharePoint 2007 and moving into 2010 in November when the Beta was released. While I can't say that I'm in love with the development experience, I do think it's a very capable product for the users. During the years, I've learned many of the quirks and tricks of SharePoint and despite it's many little issues, I liked SharePoint 2007 development.</p>
<p>SharePoint 2010 added a ton of new Features, including a separation into Service Applications (replacing the SSP) and many new Social Features like tagging and commenting. Also, the Development tools radically improved. However, I think that the Object Model didn't scale well over the years. I think it's downright broken in SharePoint 2010 and that the next version of SharePoint needs a completely new Object Model with properly separated APIs/Modules.</p>
<p>Why? Here are some of the big and small issues I've encountered while I wanted to do some really simple things.</p>
<p><strong>SPMetal doesn't generate all field Types</strong><br />
Create a new List in SharePoint, then enable the Managed Metadata and Enterprise Keywords option on the List or add a new Field to the List which is a Managed Metadata column. Run SPMetal against the list. Look how the Proxy doesn't have the Keyword field.</p>
<p>It's bad enough that the generated proxy is unnecessarily fragile, but not supporting all of the *built-in* field types makes it unusable for all but the most simple queries. Granted, Managed Keywords is a separate Feature of Standard/Enterprise, but it's still an official Microsoft out of the box feature.</p>
<p><strong>Querying Managed Keywords through CAML is only possible by Name, not by ID</strong><br />
Let's say you want to query the List and get all items that have two different keywords. As Keywords can have the same name (if they are in different paths of the Term Set), I thought it would be best to query with the Guid of the Term.</p>
<p>Well, turns out you can't. You can query by their WssId though (which is an int that seems to be assigned uniquely on each Site Collection) by adding the LookupId="TRUE" attribute. However, try to chain two queries together with an &lt;And&gt; or by adding the value twice. What happens? You get all items that have any Keyword. It's an Or, not And.</p>
<p>The only way is to Query by the Title and hope you never have duplicate titles or that you can enable the Full Path option on the Field. Now, for the standard Keywords this isn't that much of a problem as they don't have a hierarchy and therefore no duplicates, but you aren't always that lucky.</p>
<p>This is a deeper issue though, it's a problem with the LookupMulti field from which the Multi-Taxonomy Field inherits.</p>
<p><strong>No way to query the User Profile store effectively</strong><br />
This is something that is easy in pretty much every CMS on the market: Give me a distinct list of departments in the company. If the user profile store has a field that holds the department, it's literally a <code>SELECT DISTINCT(Department) from USERS ORDER BY Department</code>.</p>
<p>In SharePoint, there is no way to do that. You could query the User Information list on the main site collection, but that may not contain all users. You can query Active Directory directly, but what's the point of the User Profile store in SharePoint then?</p>
<p>If you want to get a list of all departments, you get a UserProfileManager and loop through all profiles, then fill a List&lt;string&gt; or HashSet. This is slow and resource intensive.</p>
<p><strong>No way to get some tag statistics efficiently</strong><br />
Another really simple scenario: I have a list that contains a lot of items. Users can use the Tags &#038; Notes feature of SharePoint to tag items. We want to get statistics: Give me the top 10 tags that start with 'su' and how often they were used on this list.</p>
<p>The first problem is obviously that SharePoint stores social tags against an exact URL. And when I mean exact URL, then I mean:</p>
<ul>
<li>Alternate Access Mappings are not supported. If one person uses http://internalportal and another person uses https://portal.internal.example.com, they won't see each other's tags and notes</li>
<li>If you have a Ribbon open and your URL has the "InitialTabID=...." QueryString, then your Tags and Notes will not be visible to other people who don't have it</li>
</ul>
<p>So that's bad enough. But what about getting the statistics? Using SQL, such a feature is developed in 5 minutes since all you need is this query:</p>
<pre class="prettyprint lang-sql">
SELECT TOP 10 InputTermLabel, COUNT(InputTermLabel) AS Count
FROM dbo.SocialTags
WHERE InputTermLabel LIKE 'su%' AND UrlID IN (
SELECT UrlID
FROM dbo.Urls
WHERE Url like 'http://myportal/Lists/MyList/DispForm.aspx%')
GROUP BY InputTermLabel
ORDER BY Count DESC
</pre>
<p>Using the Object Model, it is impossible to do this effectively. The closest I got is this:</p>
<pre class="prettyprint lang-cs">
var result = new Dictionary&lt;string, int>();
var baseUrl = "http://myportal/Lists/MyList/DispForm.aspx";
var stm = new SocialTagManager(SPServiceContext.GetContext(site));
var terms = stm.GetAllTerms(new Uri(baseUrl),0);
foreach (var term in terms)
{
    var name = term.Term.Name;
    if (!name.StartsWith("su", StringComparison.InvariantCultureIgnoreCase)) continue;
    var tc = stm.GetUrls(term.Term);
    int usageCount = tc.Count(url => url.AbsoluteUri.StartsWith(baseUrl));
    result[name] = usageCount;
}
result = result.OrderByDescending(kvp => kvp.Value)
             .Take(10).ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
</pre>
<p>As you may see, this is incredibly inefficient. The SQL Server sends me ALL the terms (at least I can specify a base URL!) and only on the client I can filter the ones starting with 'su'. Then I have to ask for every single Term to get the URLs. If you have a couple hundred tags, this is an incredible resource hog (tons of SQL Queries, a lot of network traffic, high memory usage). That would be the moment to wrap it into a Timer Job, cache it and not have those statistics in Real time.</p>
<p><strong>The last one made me break one of the golden rules with SharePoint</strong><br />
The golden rule is: Never ever directly talk to the SQL Database, always go through to the SharePoint Object Model.</p>
<p>Today, I broke that rule, and I don't feel dirty or guilty. That last point was the final straw. The Object Model simply doesn't cut it anymore, it's weaker than what I can do with some low end PHP CMS Systems, weaker than stuff like <a href="http://www.xoops.org/">XOOPS</a> or <a href="http://phpnuke.org/">PHP-Nuke</a>. The whole social functionality is poorly integrated.</p>
<p>After trying to get Tag-Statistics for 6 hours, I spent 30 Minutes to write a small wrapper: Iterate through all the <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spdatabase.aspx">SPDatabase</a>s in the farm, find the SocialDB that belongs to the current Web Application, use Reflection to get the SqlSession property and use Reflection again to call ExecuteReader on it. As a result, I get a nice <a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx">SqlDataReader</a> back.</p>
<p>No fighting with the Object Model, just plain "I want this, give it to me without killing all my resources".</p>
<p>Obviously, I now need to be careful with Service Packs and Hotfixes. I've set up a little tool that can compare SQL Schemas. That way, whenever a Hotfix/Service Pack gets released I run it to see if any of the Databases/Tables I use changed and adapt my code accordingly. Even if it takes me 15 Minutes to make the changes, Microsoft would have to release 24 Schema-Changing Updates to break even with the 6 hours I wasted today on this.</p>
<p>Granted, I use it strictly for SELECTs and only as a last resort and I wouldn't release code containing it, but as some point I have to get pragmatic about it. I can't spend a month developing something that should only take a week at maximum just because SharePoint doesn't like me.</p>
<p>Sorry for ranting so much, but SharePoint 2010 simply feels like a 10 year old application in places. There is so much stuff that was bad when it was still SharePoint Portal Server 2001 aka. Tahoe (ONET.xml...) and that's worse now that we have nicer technologies.</p>
<p>Why are pretty much all of the collections non-generic? Why is SPListItemCollection still a non-generic Collection of Object and not a List&lt;SPListItem&gt;?<br />
Why are there no standalone SharePoint MSBuild tasks, thus requiring Visual Studio 2010 to be installed on a build server?<br />
Why does creating Content Types through XML Files require me to specify fields twice? Why does creating a List for that Content Type through XML require me to specify the fields a third time?<br />
Why does a product than can cost hundreds of thousands of dollars in licensing still require me to depend on Reflector and looking at the Stored Procedures just to understand simple things?<br />
Why is there no easy way to check for the existence of certain items in some collections without iterating through it completely? Usually, there is only an indexer that throws an Exception if an item isn't found.<br />
Why are so many useful functions and/or classes internal or sometimes even internal sealed? Many collections have internal "GetItem" functions that return null if the item wasn't found, which is great but as said, they are internal. The external functions usually wrap the GetItem call and throw an Exception if null - ARGH!<br />
Why is there no MS Connect site to report issues and ask someone from MS to resolve them in a patch? Oh wait, there is a <a href="https://connect.microsoft.com/site428">SharePoint Community Connect Site</a>. It even has some bugs and the occasional Microsoft poster - except that all the real issues are ignored there.<br />
Why are the simple things so hard and the hard things impossible to do?</p>
<p>The weird thing is, I'm not even that unhappy developing for it. As said, I still believe that SharePoint is a good product for the users to use and does so many things right there.<br />
But I also believe that the Object Model needs a huge refresh.</p>
<p>I assume Microsoft wants to make upgrading as painless as possible, seeing how SharePoint is targeted at Enterprises. So very little changes, dragging the old stuff along.<br />
I just hope that the next SharePoint version will be based on the .net 4 CLR and that the breaking changes there (unlike 3.0 and 3.5, .net 4.0 introduced a new CLR) would allow some people at Microsoft to show some bravery by revamping the whole OM and turning SharePoint from an ancient but modern looking product into a modern product.</p>
<p>&lt;/rant&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/07/16/is-the-sharepoint-object-model-too-weak-for-excellent-applications/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Careful with SPContext.Current&#8230;</title>
		<link>http://www.stum.de/2010/06/12/careful-with-spcontext-current/</link>
		<comments>http://www.stum.de/2010/06/12/careful-with-spcontext-current/#comments</comments>
		<pubDate>Sat, 12 Jun 2010 22:33:05 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Sharepoint]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=863</guid>
		<description><![CDATA[...as it will be NULL within a Timer Job or Workflow. I have some shared Data Access classes that use SPContext.Current.Web all over the place and now that I want to use them from within a Timer Job, I have to refactor them to take a SPWeb as a Parameter...]]></description>
			<content:encoded><![CDATA[<p>...as it will be NULL within a Timer Job or Workflow. I have some shared Data Access classes that use SPContext.Current.Web all over the place and now that I want to use them from within a Timer Job, I have to refactor them to take a SPWeb as a Parameter...</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/06/12/careful-with-spcontext-current/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dealing with Multiple Time Zones in SharePoint 2010</title>
		<link>http://www.stum.de/2010/06/10/dealing-with-multiple-time-zones-in-sharepoint-2010/</link>
		<comments>http://www.stum.de/2010/06/10/dealing-with-multiple-time-zones-in-sharepoint-2010/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 21:14:30 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Sharepoint]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=854</guid>
		<description><![CDATA[Organizations that deploy SharePoint farms often have employees in different countries, or at least in different Time Zones. While people in the US (which spans 4 time zones) are pretty comfortable with translating between time zones all the time, the same cannot be said for everyone. Trying to translate between Pacific Time and Middle European [...]]]></description>
			<content:encoded><![CDATA[<p>Organizations that deploy SharePoint farms often have employees in different countries, or at least in different Time Zones. While people in the US (which spans 4 time zones) are pretty comfortable with translating between time zones all the time, the same cannot be said for everyone. Trying to translate between Pacific Time and Middle European Time is just painful, especially since the daylight savings time starts and end at different dates.</p>
<p>With SharePoint 2010 you get the tools to convert the time according to the users time zone. There are two types of <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spregionalsettings.aspx">Regional Settings</a>: Each Site (SPWeb) has RegionalSettings that specify the Time Zone (and Locale, Calendar etc.) for that site. This is useful if you have sites that are predominately used by people in one time zone. The second type of Regional Settings are the one the user (SPUser) can set (My Settings - My Regional Settings). Those are the same settings as the ones on SPWeb, but each user can specify their own setting.</p>
<p>When storing Dates in code, you have two options:</p>
<ul>
<li>Store the time in local time of the Web and use DatesInUtc = true on a SPQuery to get it back as Utc</li>
<li>Store the time in Utc and to not use DatesInUtc on SPQuery</li>
</ul>
<p>What does that mean? As said, each SPWeb has it's own Regional Settings. Let's assume you have a date of 2010-06-14 15:00:00.</p>
<p>If the TimeZone of the SPWeb is Pacific Time (GMT-8) and you query the List using SPQuery, you get back this date. If you however set DatesInUtc = true on the SPQuery, you get back 2010-06-14 22:00:00. SharePoint doesn't know if 15:00:00 was already UTC, so using DatesInUtc may translate a date twice.</p>
<p>The caveat here is that when storing dates, you would normalize them either to UTC or to the Local Time of the Web. What would you do if some employee from Texas (which runs on Central Time, GMT-6) enters 2010-06-14 15:00:00? You would need to store it either as GMT-8 (so the time becomes 13:00:00) or as UTC (22:00:00).</p>
<p>Needless to say, I prefer to store all dates as UTC if the list isn't visible to the user directly. Then when querying the list through Code, I can just convert the time to whatever the user's timezone is:</p>
<pre class="prettyprint lang-cs">
var user = SPContext.Current.Web.CurrentUser;
// Always perform a Null-Check on SPUser.RegionalSettings
if (user.RegionalSettings != null)
{
    return user.RegionalSettings.TimeZone.UTCToLocalTime(listDateUtc);
}
else
{
    // User didn't set a time zone, so use the one from the Web
    return SPContext.Current.Web.RegionalSettings.TimeZone.UTCToLocalTime(listDateUtc);
}
</pre>
<p>Overall, the option for people to set their own timezones independently from the SPWeb is a fantastic and long needed addition. On the other hand, it does make dealing with times a bit more complex.</p>
<p>If the list is visible to the user, you may need to normalize the times differently (for example, use user.RegionalSettings.TimeZone.<a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.sptimezone.localtimetoutc.aspx">LocalTimeToUTC</a> to convert a user time to UTC and then SPWeb.RegionalSettings.TimeZone.<a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.sptimezone.utctolocaltime.aspx">UTCToLocalTime</a> to convert the time to the Web-Time).</p>
<p>If you do build custom pages that make use of the <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webcontrols.datetimecontrol.aspx">Microsoft.SharePoint.WebControls.DateTimeControl</a> then you can just use <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webcontrols.datetimecontrol.usetimezoneadjustment.aspx">UseTimeZoneAdjustment="true"</a> on it to have it automatically convert to UTC and back (SelectedDate will be UTC when accessed through code, but the User's/Web's time when rendered).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/06/10/dealing-with-multiple-time-zones-in-sharepoint-2010/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>If you update your BCS Model, you may need to restart the OSearch14 service</title>
		<link>http://www.stum.de/2010/04/01/if-you-update-your-bcs-model-you-may-need-to-restart-the-osearch14-service/</link>
		<comments>http://www.stum.de/2010/04/01/if-you-update-your-bcs-model-you-may-need-to-restart-the-osearch14-service/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 21:15:53 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Sharepoint]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=787</guid>
		<description><![CDATA[I'm experimenting with the SharePoint 2010 BCS at the moment, using custom .net code to implement the IdEnumerator and SpecificFinder methods, to be used in the Search Crawler. As this is backed by a .net class, I had some issues getting changes to it done. I've added a new field, updated the .bdcm file, redeployed [...]]]></description>
			<content:encoded><![CDATA[<p>I'm experimenting with the SharePoint 2010 BCS at the moment, using custom .net code to implement the IdEnumerator and SpecificFinder methods, to be used in the Search Crawler.</p>
<p>As this is backed by a .net class, I had some issues getting changes to it done. I've added a new field, updated the .bdcm file, redeployed and started a Full Crawl, only to get error messages in the Crawl saying that the Property that I've added cannot be found in the backing class.</p>
<p>Solution is as simple as logical: Reset the SharePoint Server Search 14 service (OSearch14). As this holds the Assembly in memory and as the Sharepoint deployment tools do only recycle the IIS process, there will be a mismatch between the .bdcm file and the (outdated, but still loaded) assembly.</p>
<p>Also, you might have to re-create the Content Source. And don't forget to increase the version number if you edit the .bdcm file manually.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/04/01/if-you-update-your-bcs-model-you-may-need-to-restart-the-osearch14-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An ASP.net AJAX UpdateProgress that can render Inline</title>
		<link>http://www.stum.de/2010/01/28/an-asp-net-ajax-updateprogress-that-can-render-inline/</link>
		<comments>http://www.stum.de/2010/01/28/an-asp-net-ajax-updateprogress-that-can-render-inline/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 02:02:34 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Sharepoint]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=718</guid>
		<description><![CDATA[I've been starting to pick up ASP.net AJAX again, mainly because as a SharePoint developer I will be "stuck" with WebForms 3.5 for the next few years (SharePoint 2010 will not be a .net 4.0 application). As part of that, I remembered one issue I had: The UpdateProgress renders a div with display:block set, which [...]]]></description>
			<content:encoded><![CDATA[<p>I've been starting to pick up ASP.net AJAX again, mainly because as a SharePoint developer I will be "stuck" with WebForms 3.5 for the next few years (SharePoint 2010 will not be a .net 4.0 application). As part of that, I remembered one issue I had: <a href="http://stackoverflow.com/questions/42499/">The UpdateProgress renders a div with display:block</a> set, which means it is not possible to have the updateProgress right next to a button. Joe Audette <a href="http://www.joeaudette.com/solving-the-aspnet-updateprogress-div-problem.aspx">had the right idea</a>: Grab the UpdateProgress from the Mono Project and modify it. The nice thing about the Class Libraries of Mono is that they are licensed under the very liberal <a href="http://www.opensource.org/licenses/mit-license.html">MIT X11</a> license, making them good candidates as a base for modifications.</p>
<p>Here is the source code of the UpdateProgressEx, which includes a new Property, DisplayInline. If this is set to true, then we render a span with display: inline. If this is set to false or not set at all, we have the default behavior of a div/block. If DisplayInline is set to true, then we force DynamicLayout to be false. Why? Because if DynamicLayout is true, then it seems like the MS AJAX JavaScript control the display, and they render it as a block. As I did not want to modify it any further, I just force DynamicLayout to false because for me, that works good enough. Also, I haven't tested if it works in visual design mode and if the property panel shows the new DisplayInline Property, as I work only in code view. YMMV, but it's Open Source after all, so feel free to properly fix it <img src='http://www.stum.de/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Here is the code:</p>
<pre class="prettyprint lang-cs">
// UpdateProgressEx
//
// Author:
//  Michael Stum &lt;website@stum.de>
//  http://www.stum.de/2010/01/28/an-asp-net-ajax-updateprogress-that-can-render-inline
//
// Original Author:
//   Igor Zelmanovich &lt;igorz@mainsoft.com>
//   (C) 2007 Mainsoft, Inc.  http://www.mainsoft.com
//
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Web.UI;

namespace StumDE.WebControls
{
    [PersistChildren(false)]
    [ParseChildren(true)]
    [DefaultProperty("AssociatedUpdatePanelID")]
    [Designer("System.Web.UI.Design.UpdateProgressDesigner, System.Web.Extensions.Design, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")]
    public class UpdateProgressEx : Control, IScriptControl
    {
        ITemplate _progressTemplate;
        ScriptManager _scriptManager;

        [Category("Behavior")]
        [DefaultValue("")]
        [IDReferenceProperty(typeof(UpdatePanel))]
        public string AssociatedUpdatePanelID
        {
            get
            {
                return (string)ViewState["AssociatedUpdatePanelID"] ?? String.Empty;
            }
            set
            {
                ViewState["AssociatedUpdatePanelID"] = value;
            }
        }

        [Category("Behavior")]
        [DefaultValue(false)]
        public bool DisplayInline
        {
            get
            {
                object o = ViewState["DisplayInline"];
                if (o == null)
                    return false;
                return (bool)o;
            }
            set
            {
                ViewState["DisplayInline"] = value;
            }
        }

        [Category("Behavior")]
        [DefaultValue(500)]
        public int DisplayAfter
        {
            get
            {
                object o = ViewState["DisplayAfter"];
                if (o == null)
                    return 500;
                return (int)o;
            }
            set
            {
                ViewState["DisplayAfter"] = value;
            }
        }

        [Category("Behavior")]
        [DefaultValue(true)]
        public bool DynamicLayout
        {
            get
            {
                // If DisplayInline is set, force dynamic layout to be false
                if(DisplayInline) return false;
                object o = ViewState["DynamicLayout"];
                if (o == null)
                    return true;
                return (bool)o;
            }
            set
            {
                ViewState["DynamicLayout"] = value;
            }
        }

        [PersistenceMode(PersistenceMode.InnerProperty)]
        [Browsable(false)]
        public ITemplate ProgressTemplate
        {
            get
            {
                return _progressTemplate;
            }
            set
            {
                _progressTemplate = value;
            }
        }

        ScriptManager ScriptManager
        {
            get
            {
                if (_scriptManager == null)
                {
                    _scriptManager = ScriptManager.GetCurrent(Page);
                    if (_scriptManager == null)
                        throw new InvalidOperationException(String.Format("The control with ID '{0}' requires a ScriptManager on the page. The ScriptManager must appear before any controls that need it.", ID));
                }
                return _scriptManager;
            }
        }

        protected virtual IEnumerable&lt;ScriptDescriptor> GetScriptDescriptors()
        {
            string updatePanelClientId;
            if (String.IsNullOrEmpty(AssociatedUpdatePanelID))
                updatePanelClientId = null;
            else
            {
                var updatePanel = FindControl(AssociatedUpdatePanelID) as UpdatePanel;
                if (updatePanel == null)
                    throw new InvalidOperationException("No UpdatePanel found for AssociatedUpdatePanelID '" + AssociatedUpdatePanelID + "'.");
                updatePanelClientId = updatePanel.ClientID;
            }
            var descriptor = new ScriptControlDescriptor("Sys.UI._UpdateProgress", this.ClientID);
            descriptor.AddProperty("associatedUpdatePanelId", updatePanelClientId);
            descriptor.AddProperty("displayAfter", DisplayAfter);
            descriptor.AddProperty("dynamicLayout", DynamicLayout);
            descriptor.AddProperty("displayInline", DisplayInline);
            yield return descriptor;
        }

        protected virtual IEnumerable&lt;ScriptReference> GetScriptReferences()
        {
            yield break;
        }

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            ScriptManager.RegisterScriptControl(this);

            if (_progressTemplate == null)
                throw new InvalidOperationException(String.Format("A ProgressTemplate must be specified on UpdateProgress control with ID '{0}'.", ID));

            var container = new Control();
            _progressTemplate.InstantiateIn(container);
            Controls.Add(container);
        }

        protected override void Render(HtmlTextWriter writer)
        {
            if (DynamicLayout)
                writer.AddStyleAttribute(HtmlTextWriterStyle.Display, "none");
            else
            {

                writer.AddStyleAttribute(HtmlTextWriterStyle.Display, DisplayInline ? "inline" : "block");
                writer.AddStyleAttribute(HtmlTextWriterStyle.Visibility, "hidden");
            }
            writer.AddAttribute(HtmlTextWriterAttribute.Id, ClientID);
            if (DisplayInline)
            {
                writer.RenderBeginTag(HtmlTextWriterTag.Span);
            }
            else
            {
                writer.RenderBeginTag(HtmlTextWriterTag.Div);
            }
            base.Render(writer);
            writer.RenderEndTag();

            ScriptManager.RegisterScriptDescriptors(this);
        }

        #region IScriptControl Members

        IEnumerable&lt;ScriptDescriptor> IScriptControl.GetScriptDescriptors()
        {
            return GetScriptDescriptors();
        }

        IEnumerable&lt;ScriptReference> IScriptControl.GetScriptReferences()
        {
            return GetScriptReferences();
        }

        #endregion
    }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/01/28/an-asp-net-ajax-updateprogress-that-can-render-inline/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WSSv3/Sharepoint 2007 does not support nested master pages</title>
		<link>http://www.stum.de/2010/01/27/wssv3sharepoint-2007-does-not-support-nested-master-pages/</link>
		<comments>http://www.stum.de/2010/01/27/wssv3sharepoint-2007-does-not-support-nested-master-pages/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 19:14:17 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Sharepoint]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=716</guid>
		<description><![CDATA[For a Project I had on a SharePoint site I thought it would be a good idea to create a new master page that is based on the default.master and exposes some placeholder for my content pages to use. Nested Master Pages are trivial to do in ASP.net normally, but for some reason on my [...]]]></description>
			<content:encoded><![CDATA[<p>For a Project I had on a SharePoint site I thought it would be a good idea to create a new master page that is based on the default.master and exposes some placeholder for my content pages to use. Nested Master Pages are <a href="http://msdn.microsoft.com/en-us/library/x2b3ktt7.aspx">trivial to do in ASP.net</a> normally, but for some reason on my SharePoint site, the child page was not rendering its content in one of the new placeholders.</p>
<p>Well, turns out that SharePoint 2007/WSSv3 explicitly <strong>does not support nested master pages</strong>. To quote <a href="http://msdn.microsoft.com/en-us/library/ms476046.aspx">an Article in MSDN</a> directly:</p>
<blockquote><p>Although the underlying technology enables the creation of nested master pages, nested master pages are not supported in Windows SharePoint Services.  Using nested master pages can cause unexpected behavior in some scenarios, such as preventing content from rendering.</p></blockquote>
<p>Indeed, unexpected behavior, such as content not rendering is the exact problem I have. Now I remember why I love SharePoint so much: It's taking the essential functions of ASP.net and then adds some traps that really hurt you unexpectedly.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2010/01/27/wssv3sharepoint-2007-does-not-support-nested-master-pages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recursive workflows are not permitted</title>
		<link>http://www.stum.de/2009/08/26/recursive-workflows-are-not-permitted/</link>
		<comments>http://www.stum.de/2009/08/26/recursive-workflows-are-not-permitted/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 14:04:01 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Sharepoint]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=546</guid>
		<description><![CDATA[There was a change in Service Pack 2 of SharePoint 2007. Sadly, this change is both breaking and undocumented, which annoys me quite a bit, even though the change itself made sense. Basically, SharePoint Designer Workflows cannot start themselves anymore. So if you have a Workflow that is started when an item is changed and [...]]]></description>
			<content:encoded><![CDATA[<p>There was a change in Service Pack 2 of SharePoint 2007. Sadly, this change is both breaking and undocumented, which annoys me quite a bit, even though the change itself made sense.</p>
<p>Basically, SharePoint Designer Workflows cannot start themselves anymore. So if you have a Workflow that is started when an item is changed and you change the item from within the workflow, previously SharePoint would start a second instance of your workflow. This was both blessing and curse. Curse because if you were not careful, you would start an infinite loop. Not fun if your boss asks you why he received 4500 mails during the night... But blessing because you could use it to build State-Machine Workflows from SharePoint Designer.</p>
<p>I guess it's the Infinite Loop part that triggered the change, and I think that change made sense. But please dear SharePoint team: Document a change like this, because it IS breaking, and you know as well as me that SP Designer Workflows cannot be debugged, so it's not only a pain in the ass, but it's also a way to really make people lose trust in your application.</p>
<p>Anyway, you can <a href="http://blogs.msdn.com/sharepointdesigner/archive/2009/07/13/service-pack-2-prevents-an-on-change-workflow-from-starting-itself.aspx">read more about this change at the SharePoint Designer Team Blog</a>. The error message you will see in your SharePoint Logfile looks like this by the way:</p>
<p><em>08/26/2009 15:11:59.50 	w3wp.exe (0x272C)                       	0x25E0	Windows SharePoint Services   	Workflow Infrastructure       	72fv	Unexpected	AutoStart Workflow: Microsoft.SharePoint.SPException: Recursive workflows are not permitted.     at Microsoft.SharePoint.Workflow.SPWorkflowAutostartEventReceiver.AutoStartWorkflow(SPItemEventProperties properties, Boolean bCreate, Boolean bChange, AssocType atyp)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2009/08/26/recursive-workflows-are-not-permitted/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>So it will be SharePoint Server 2010&#8230;</title>
		<link>http://www.stum.de/2009/04/15/so-it-will-be-sharepoint-server-2010/</link>
		<comments>http://www.stum.de/2009/04/15/so-it-will-be-sharepoint-server-2010/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 20:10:27 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Sharepoint]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=469</guid>
		<description><![CDATA[Microsoft today announced the naming of the next SharePoint version, SharePoint "14" will officially be called Microsoft SharePoint Server 2010. Looks like the more versions they make, the more stuff they drop out of the name. First it was "SharePoint Portal Server", then "Office SharePoint Server", and now just "SharePoint Server". Makes sense to be [...]]]></description>
			<content:encoded><![CDATA[<p>Microsoft today announced the naming of the next SharePoint version, SharePoint "14" will officially be called <a href="http://blogs.msdn.com/sharepoint/archive/2009/04/14/microsoft-sharepoint-14-is-now-microsoft-sharepoint-2010.aspx">Microsoft SharePoint Server 2010</a>.</p>
<p>Looks like the more versions they make, the more stuff they drop out of the name. First it was "SharePoint Portal Server", then "Office SharePoint Server", and now just "SharePoint Server". Makes sense to be fair, SharePoint is really a brand on it's own, so why blur the lines too much. But the actual question will be: Is 2010 going to end this <a href="http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx">SPWeb.Dispose madness</a>, that not only causes all sorts of <a href="http://blogs.technet.com/stefan_gossner/archive/2008/12/05/disposing-spweb-and-spsite-objects.aspx">weird issues</a>, but is also <a href="http://www.mindsharpblogs.com/aaron/archive/2008/04/03/4533.aspx">inconsistent</a>.</p>
<p>Really, SPWeb.Dispose is a big gun that is made for people to shoot themselves in the foot, and I'd love to see that improved more than anything else (Well, apart from <a href="http://www.stum.de/2008/03/13/caml-queries/">CAML</a>, that abomination of SQL).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2009/04/15/so-it-will-be-sharepoint-server-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Custom Expression Builders in ASP.net</title>
		<link>http://www.stum.de/2009/03/05/custom-expression-builders-in-aspnet/</link>
		<comments>http://www.stum.de/2009/03/05/custom-expression-builders-in-aspnet/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 20:47:02 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Sharepoint]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=437</guid>
		<description><![CDATA[As a SharePoint developer, I am unfortunately stuck with the WebForms model of ASP.net since SharePoint 2007 does not support ASP.net MVC. Well, WebForms is not THAT bad really, but it can get really messy very fast, especially for simple databinding stuff - lblTitle.Text = bla.fasel; lblWhatever.Text = eek.boo; etc. Now, there is a truly [...]]]></description>
			<content:encoded><![CDATA[<p>As a SharePoint developer, I am unfortunately stuck with the WebForms model of ASP.net since SharePoint 2007 does not support ASP.net MVC. Well, WebForms is not THAT bad really, but it can get really messy very fast, especially for simple databinding stuff - lblTitle.Text = bla.fasel; lblWhatever.Text = eek.boo; etc.</p>
<p>Now, there is a truly hidden Gem: Expression Builders. Using &lt;%$ MyExpressionBuilder.Property %&gt;, I can directly do this type of DataBinding in the .aspx file without requiring code behind. I have not yet tested if it works if you have not set AllowServerSideScript="true" in the PageParserPaths tag of SharePoint's web.config (something that I would always avoid).</p>
<p>The full article about Custom Expression Builders can be found over at <a href="http://haacked.com/archive/2006/11/29/Express_Yourself_With_Custom_Expression_Builders.aspx">Phil Haack's blog</a>, along with an explanation how this is different from &lt;%= %&gt;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2009/03/05/custom-expression-builders-in-aspnet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SPWeb.Groups only includes Groups that have permissions. SPWeb.SiteGroups includes all.</title>
		<link>http://www.stum.de/2009/01/26/spwebgroups-only-includes-groups-that-have-permissions-spwebsitegroups-include-all/</link>
		<comments>http://www.stum.de/2009/01/26/spwebgroups-only-includes-groups-that-have-permissions-spwebsitegroups-include-all/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 15:11:10 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Sharepoint]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=412</guid>
		<description><![CDATA[And another reminder: SPWeb.Groups only includes Groups that have permission to any object in the SPWeb. If you want to create a Group that merely serves as a Container for Users, it will not show up in SPWeb.Groups, and calls to Groups.GetById() will fail. If you do not want to add some dummy permissions, use [...]]]></description>
			<content:encoded><![CDATA[<p>And another reminder: <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spweb.groups.aspx">SPWeb.Groups</a> only includes Groups that have permission to any object in the SPWeb.</p>
<p>If you want to create a Group that merely serves as a Container for Users, it will not show up in SPWeb.Groups, and calls to Groups.GetById() will fail. If you do not want to add some dummy permissions, use <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spweb.sitegroups.aspx">SPWeb.SiteGroups</a> instead, which contains all groups in the Site Collection.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2009/01/26/spwebgroups-only-includes-groups-that-have-permissions-spwebsitegroups-include-all/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SPGroupCollection.GetByID will throw an SPException for nonexistent Groups</title>
		<link>http://www.stum.de/2009/01/26/spgroupcollectiongetbyid-will-throw-an-spexception-for-nonexistent-groups/</link>
		<comments>http://www.stum.de/2009/01/26/spgroupcollectiongetbyid-will-throw-an-spexception-for-nonexistent-groups/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 14:14:50 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Sharepoint]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=410</guid>
		<description><![CDATA[This is just a reminder for myself because I keep forgetting it: Calling SPGroupCollection.GetByID will throw an SPException if the Group was not found.]]></description>
			<content:encoded><![CDATA[<p>This is just a reminder for myself because I keep forgetting it:</p>
<p>Calling <a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spgroupcollection.getbyid.aspx">SPGroupCollection.GetByID</a> will throw an SPException if the Group was not found.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2009/01/26/spgroupcollectiongetbyid-will-throw-an-spexception-for-nonexistent-groups/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sharepoint Discoverter &#8211; Convert .wsdl/.disco files for Sharepoint</title>
		<link>http://www.stum.de/2008/12/13/sharepoint-discoverter-convert-wsdldisco-files-for-sharepoint/</link>
		<comments>http://www.stum.de/2008/12/13/sharepoint-discoverter-convert-wsdldisco-files-for-sharepoint/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 23:09:24 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Sharepoint]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=361</guid>
		<description><![CDATA[If you want to create your own Web Service that runs on top of Windows Sharepoint Services 3.0 (WSSv3) or Microsoft Office SharePoint Server 2007 (MOSS2007), you will encounter the issue of setting up the .wsdl and .disco file. For Sharepoint, you need to rename and modify them, which is a small, but tedious task. [...]]]></description>
			<content:encoded><![CDATA[<p>If you want to create your own Web Service that runs on top of Windows Sharepoint Services 3.0 (WSSv3) or Microsoft Office SharePoint Server 2007 (MOSS2007), you will encounter the issue of setting up the .wsdl and .disco file. For Sharepoint, you need to rename and modify them, which is a small, but tedious task. (If you want to know how to write SharePoint Web Services, <a href="http://it.toolbox.com/blogs/sharepoint-blog/creating-a-custom-web-service-for-sharepoint-13553">check out this blog post</a>, which covers creation of the .asmx, but also the .wsdl and .disco files)</p>
<p>I have written a small application that will do this automatically for you: .disco/.wsdl in, disco.aspx and wsdl.aspx out. It requires .net Framework 3.0 (just as Sharepoint) and is available in both binary and source form on CodePlex: <a href="http://www.codeplex.com/discoverter">http://www.codeplex.com/discoverter</a></p>
<p><a href="http://www.codeplex.com/discoverter"><img class="aligncenter size-full wp-image-362" title="Discoverter" src="http://www.stum.de/wp-content/uploads/2008/12/discoverter.jpg" alt="Discoverter" width="445" height="196" /></a></p>
<p>On a related note, this was also a test to see how good CodePlex is. I will write up a little CodePlex vs. SourceForge post later on as I have experience with both now, and both have advantages and disadvantages.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2008/12/13/sharepoint-discoverter-convert-wsdldisco-files-for-sharepoint/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MakeDDF Version 1.0.0</title>
		<link>http://www.stum.de/2008/06/21/makeddf-version-100/</link>
		<comments>http://www.stum.de/2008/06/21/makeddf-version-100/#comments</comments>
		<pubDate>Sat, 21 Jun 2008 21:36:44 +0000</pubDate>
		<dc:creator>mstum</dc:creator>
				<category><![CDATA[Sharepoint]]></category>

		<guid isPermaLink="false">http://www.stum.de/?p=104</guid>
		<description><![CDATA[Normally, Sharepoint Development feels quite "modern": You write your stuff with .net 3.0 and add some XML and XSLT into the mix. But then, you have to take a little trip back 20 years when it comes to creating the .wsp file for your solution, using makecab.exe and a .ddf file. DDF Files are not [...]]]></description>
			<content:encoded><![CDATA[<p>Normally, Sharepoint Development feels quite "modern": You write your stuff with .net 3.0 and add some XML and XSLT into the mix. But then, you have to take a little trip back 20 years when it comes to creating the .wsp file for your solution, using makecab.exe and a .ddf file.</p>
<p>DDF Files are not only unlike any other standard file format, they are also somewhat complicated when it comes to subfolders. In order to ease the work of creating .ddf files a bit, I made a small command line tool called "MakeDDF" which allows you to specify a directory and it will create the .ddf file that contains all the files in that directory. The resulting file can then be passed to makecab /f to create your .wsp file a bit more painless than useful.</p>
<p>It's freeware and requires the .net Framework 2.0, get it <a href="http://www.stum.de/various-tools/makeddf/">from here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stum.de/2008/06/21/makeddf-version-100/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

