<?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/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Fleeting Thoughts &#187; Uncategorized</title>
	<atom:link href="http://vlele.wordpress.com/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://vlele.wordpress.com</link>
	<description>Just another Wordpress.com weblog</description>
	<lastBuildDate>Thu, 22 Oct 2009 18:24:52 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='vlele.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/5a7346d317fd71bf7c73630fedb9738c?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Fleeting Thoughts &#187; Uncategorized</title>
		<link>http://vlele.wordpress.com</link>
	</image>
			<item>
		<title>Top 10 SharePoint Server 2010 features</title>
		<link>http://vlele.wordpress.com/2009/10/22/top-10-sharepoint-server-2010-features/</link>
		<comments>http://vlele.wordpress.com/2009/10/22/top-10-sharepoint-server-2010-features/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 18:23:21 +0000</pubDate>
		<dc:creator>vlele</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://vlele.wordpress.com/2009/10/22/top-10-sharepoint-server-2010-features/</guid>
		<description><![CDATA[
Here are my personal favorite SharePoint 2010 new features and enhancements:
&#160;
Access Services &#38; Visio Services
Building on the successful Excel Services pattern, SPS 2010 allows users to publish Access and Visio applications to SharePoint which other users can access through their browsers. As can be expected, Access and Visio Services will be somewhat limited in functionality(when [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=133&subd=vlele&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><ul>
<p>Here are my personal favorite SharePoint 2010 new features and enhancements:
<p>&nbsp;
<li><strong>Access Services</strong> <strong>&amp; Visio Services</strong></li>
<p>Building on the successful Excel Services pattern, SPS 2010 allows users to publish Access and Visio applications to SharePoint which other users can access through their browsers. As can be expected, Access and Visio Services will be somewhat limited in functionality(when compared to their respective desktop versions), but on the flip side, the customers would benefit from the server-side capabilities such as scalability, one centralized version of the document (rendered in a browser friendly format), access to multiple users and security control.&nbsp;&nbsp;&nbsp;
<p>Access Services will allow customers to publish their <em>Access</em> 2010 applications to SharePoint. For example, consider a departmental application such as a travel planner built using Access. Using Access Services it will be possible to bring such an application to Sharepoint, thereby reducing the total cost of ownership through one common user experience, development and deployment strategy.
<p>Similarly, Visio Services will allow customers to render <em>Visio</em> diagrams within the browser. An application of Visio Services would be a visualization of a SharePoint workflow that is rendered inside a browser as a Visio flowchart. Note that no client-side Visio software would be needed in this scenario.</p>
</ul>
<p><strong></strong>&nbsp;</p>
<ul>
<li><strong>Business Connectivity Services (BCS)</strong></li>
<p>In MOSS 2007, Business Data Connector (BDC) was the tool of choice for integrating external data sources&nbsp; into Sharepoint. BDC was available only to customers who purchased the enterprise version of MOSS 2007. Furthermore, BDC was limited to only reading data from the external data sources. Busincess Connectivity Services (BCS), which replaces the BDC functionality in SPS 2010, goes much further. Not only is BCS going to be available with the free, base version of SPS 2010 (renamed to Windows SharePoint Foundation from Windows SharePoint Services), it now supports updating, deletion and insertion of data into an external data source.&nbsp; Another key advantage of BCS is that it will enable SharePoint Lists to be created directly based on a database table. </p>
</ul>
<p><strong></strong>&nbsp;</p>
<ul>
<li><strong>Developer Productivity Enhancements </strong></li>
<p>First and foremost and unlike previous versions, it will now be possible to conduct SharePoint development on a client OS such as Windows 7. In earlier versions SharePoint development had to be undertaken on a server OS. This inevitably created overhead as the development had to be undertaken in a virtualized environment. Secondly, developer enhancements go beyond the support for client operating systems. Developers can now utilize familiar .NET patterns and practices such as LINQ (Language Integrated Query) to query data from a SharePoint List, XSLT for customizing a SharePoint list and Silverlight for creating richer visualizations. There are also a number of enhancements to the SharePoint programming model that offer greater flexibility in extending the out-of-the-box SharePoint behavior.&nbsp; For example, SharePoint developers commonly extend the SharePoint behavior using small segments of code commonly referred to as event handlers. A common issue with event handlers in MOSS 2007 is that the event handler is not finished executing before the control is returned back to the user. This can lead to a confusing behavior for the users. SPS 2010 seeks to alleviate this by introducing “After-Synchronous” events which are guaranteed to complete execution before the control is returned to the user.
<p>Finally, Visual Studio 2010 contains extended capabilities for developers to create rich applications on the SPS 2010 platform. Many improvements have also been made in Visual Studio 2010 to increase developer productivity as well as take advantage of SPS 2010 functionality. These improvements help make it easier for .NET developers to create and deploy SharePoint solutions.</p>
</ul>
<p><strong></strong>&nbsp;</p>
<ul>
<li><strong>SharePoint Designer Enhancements </strong></li>
<p>SharePoint Designer is a tool targeted towards business users and designers who have used it to quickly and easily perform actions such as customizing lists, changing layouts and creating simple workflows. The one area of improvement often requested is the ability to package and reuse the changes made using SharePoint Designer.&nbsp; Fortunately, SharePoint Designer 2010 not only addresses this request, it also comes with major improvements with regard to designing workflows, editing SharePoint pages and setting up BCS ( discussed above). SharePoint administrators also have greater control over how SharePoint Designer 2010 is used within their environment. For instance, administrators can block the ability to perform certain actions such as modifying certain SharePoint pages and restricting access to certain areas with the Sharepoint setup.
<p>One other key feature provided by SharePoint Designer 2010 is the improved interaction between the business users and the IT department. Since SharePoint Designer 2010 uses the same packing and deployment format (commonly referred to as WSP solution package) as the rest of the SharePoint platform, it is now possible to take the work done by a business user within the SharePoint Designer 2010 and import it within Visual Studio 2010. This will allow the IT department to build upon and extend the work done by the business users.&nbsp; </p>
</ul>
<p><strong></strong>&nbsp;</p>
<ul>
<li><strong>Business Intelligence Enhancements</strong></li>
<p>Business Intelligence is another area with significant improvements. To begin, there are a number of scalability improvements to the desktop version of Excel 2010, including the support for the numbers of rows within a workbook that goes far beyond the 64K limit in the current version. The new version of Excel effectively utilizes enhancements in the OS such as the 64-bit support for access to large memory pools and enhancement in hardware such as the multi-core computers.
<p>Microsoft has made a strategic decision to leverage Excel as the primary BI analyst tool. As part of the self-service BI initiative, Excel users can import large amounts of data from various data sources and quickly generate pivot tables. Once the data is imported into Excel 2010, using a feature called “Slicers”, users will be able to easily filter the data. In other words, Excel users can extract, transform and load (ETL) data from multiple sources directly into Excel without requiring IT to build a formal data import setup. The pivot table generated from imported data can later be shared with other users by publishing it to SharePoint 2010. Under the covers, the publishing process creates an SQL Server Analysis Services instance that can be monitored by IT, using tools such as usage dashboard and resource quota.
<p>Excel Services, the server-side Excel functionality provided by SharePoint Server, has seen a number of improvements as well. First off, it directly benefits from the scalability improvements to the underlying calculation engine mentioned earlier. Secondly, it enables additional programmability enhancements. For example it, using a JavScript based program, it will be possible </p>
</ul>
<p><strong></strong>&nbsp;</p>
<ul>
<li><strong>In-Place Records Management </strong></li>
<p>Records management relates to the process of marking a document as a record or &#8220;laminating&#8221; them for legal and compliance reasons. A records repository is a library of such records. SPS 2010 dramatically improves upon the capabilities for managing records by extending where and how the records are managed. Unlike MOSS 2007, SPS 2010 will support multiple records repositories within a single SharePoint installation.. This means that users can route records to multiple record repositories. Records managers can also define routing rules to aid in the classification of records. Records repositories now also support the use of hierarchical structures (commonly referred to as File Plan) for storing records in a manner that matches the customer&#8217;s organizational hierarchy.
<p>SharePoint 2010 also provides the flexibility for defining and applying retention rules. For instance, it is now possible to apply a recurring retention rule that specifies several stages of&nbsp; record retention. This will be very helpful when a records manager wants to specify a retention rule such as “Maintain this document for three years after project completion then transfer it to the archive for the next five years”.
<p>In addition to using a records repository, SPS 2010 has the ability to declare records in-place, i.e., allow any document inside a document library to be marked as a record without the need to explicitly move it to a records repository. The new in-place record management capability exemplifies Microsoft&#8217;s mantra of &#8220;compliance everywhere&#8221;</p>
</ul>
<p><strong></strong>&nbsp;</p>
<ul>
<li><strong>Enhancements related to Large List Handling </strong></li>
<p>Microsoft has placed a lot of emphasis on performance of lists with large numbers of items in them. This has resulted in the addition of the new SPS 2010 features known as : Query Throttling, Batch Query Support, Remote Blob Storage, and External Lists.
<p>Query Throttling allows IT administrators to limit -or &#8220;throttle&#8221; &#8211; queries that are executed against large lists from consuming too many resources. For example, SharePoint will now block queries that will return more than 5000 rows by default – and this is of course, a configurable setting.&nbsp; Rather than iterating over each item, SharePoint also includes the capability to process multiple items in a list simultaneously, as a single batch operation.&nbsp; If there is content that is more suitable for storage outside SharePoint (for instance large media files), the Remote Blob Storage feature will provide a mechanism to store it on file shares (SANS, NAS, RAID arrays, File Servers).
<p>Finally, External Lists is another mechanism by which large lists can be incorporated in SharePoint. As stated earlier, database-backed lists that are a part of BCS allow content to be stored in separate data stores &#8211; such as SQL Server &#8211; outside of the Content Database. The benefit of course is that this feature allows for providing supporting large lists without burdening the SharePoint 2010 content database.</p>
</ul>
<p><strong></strong>&nbsp;</p>
<ul>
<li><strong>Workflow Improvements</strong></li>
<p>Workflow is a very useful feature of SharePoint 2007. In addition to the out-of-the box workflows that were included with SharePoint 2007, it is possible to use the SharePoint designer to build declarative (no-code) workflows. For more advanced scenarios, developers created custom workflows in Visual Studio. Two of the main challenges in building workflows with SharePoint 2007 relate to the limitations in SharePoint Designer 2007 and the workflow host that is part of SharePoint 2007. While SharePoint Designer allows business users to develop simple workflows, it requires a direct connection to the site for which the workflow is being developed, thus limiting the ability to reuse the workflow in different locations. Furthermore, there is no easy way to leverage code components developed by IT. The workflow host within SharePoint 2007 comes pre-configured with a set of services such as persistence, eventing and tracing. There is no way to add custom services to the runtime host. For instance, there is no direct way to allow SharePoint-based workflows to interact with events other than the list item events.
<p>SharePoint 2010 alleviates these challenges by allowing the workflows created using SharePoint Designer to be saved as templates for reuse. SharePoint Designer 2010 has also been enhanced significantly to allow business users to leverage tools such as Visio for workflow modeling and visualization. Another major improvement is the ability to modify out-of-the-box SharePoint workflows (e.g. approval workflow, three-state workflow).
<p>The workflow host within SharePoint 2010 now provides the extensibility option to inject custom services. It is also now possible to kickoff workflows without explicitly associating it to a list item.
<p>Finally, and from an overall scalability perspective, it is also going to be possible to designate application server nodes as workflow participants. In other words, unlike SharePoint 2007 where each application server node participated in executing the workflows, there will be a way to throttle the workflow execution to a limited set of machines. This allows isolation of services within the farm so system administrators can better manage resources and troubleshoot issues.</p>
</ul>
<p><strong></strong>&nbsp;</p>
<ul>
<li><strong>Social Networking Capabilities </strong></li>
<p>One can debate the impact and applicability of social networking tools such as <em>Facebook</em> in the workplace, but there is no doubt that information workers today are demanding similar capabilities from the tools they use inside the workplace. This is why the SPS 2010 enhancements in this arena are so noteworthy. In SPS 2010, just about every element such as sites, documents, videos, blog posts are taggable. There is out-of-the-box support for navigating the tag clouds and lists. Users will be able to rate artifacts and recommend it to others. Co-workers can keep up with the latest by tracking the activity data available as a new feed. Individual users will be able to setup profiles, write to a common or personal board, indicate their presence/location and be able to take advantage of micro-blogging capabilities. </p>
</ul>
<p><strong></strong>&nbsp;</p>
<ul>
<li><strong>Deployment Advancements</strong></li>
<p>Unlike the previous versions, SPS 2010 uses a s<em>olution package</em>-based single, consistent scheme for packaging and deploying any customizations. The solution package is a compressed file containing all of the necessary components such as features, web parts, list definitions, assemblies, customized ASPX pages and workflows. Additionally, the previous versions required an extensive amount of manual modification of XML files. In SharePoint 2010, these modifications can be done through point and click configuration with SharePoint Designer 2010.
<p>SharePoint 2010 also introduces a notion of <em>sandbox</em> <em>solution packages</em> that are designed to improve security and manageability. Sandbox solution packages restrict the scope to which a customization can be applied (For example, restricting the scope for a list customization to site collection). Sandbox solutions are also restricted to a subset of SharePoint programmability options. Finally, administrators can enforce quote limits on resources consumed by sandbox solutions to prevent abuse.
<p>For a more detail review of the SPS 2010, I encourage you to download the white paper we released recently at <a href="http://tinyurl.com/sps2010">http://tinyurl.com/sps2010</a><b> ( </b>note &#8211; this link takes you directly to the PDF ~1 MB)</p>
</ul>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/vlele.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/vlele.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/vlele.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/vlele.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/vlele.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/vlele.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/vlele.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/vlele.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/vlele.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/vlele.wordpress.com/133/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=133&subd=vlele&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://vlele.wordpress.com/2009/10/22/top-10-sharepoint-server-2010-features/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ae43c20c0f5d552cd08ced6c49931722?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">vlele</media:title>
		</media:content>
	</item>
		<item>
		<title>Outlook for Azure &#8211; scattered clouds but generally sunny</title>
		<link>http://vlele.wordpress.com/2009/10/14/outlook-for-azure-scattered-clouds-but-generally-sunny/</link>
		<comments>http://vlele.wordpress.com/2009/10/14/outlook-for-azure-scattered-clouds-but-generally-sunny/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 02:06:38 +0000</pubDate>
		<dc:creator>vlele</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://vlele.wordpress.com/2009/10/14/outlook-for-azure-scattered-clouds-but-generally-sunny/</guid>
		<description><![CDATA[That is my forecast, anyway. Over the last year, I have had the opportunity to talk to a number of customers, user group and conference attendees about Cloud Computing in general and specifically about the Windows Azure Platform. During these conversations, I have come across a number of concerns/ questions about Azure pricing, performance, security [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=124&subd=vlele&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>That is my forecast, anyway. Over the last year, I have had the opportunity to talk to a number of customers, user group and conference attendees about Cloud Computing in general and specifically about the Windows Azure Platform. During these conversations, I have come across a number of concerns/ questions about Azure pricing, performance, security and so on. Clearly Windows Azure has a long way to go before it becomes a mature cloud platform. However, some broad-brush statements questioning Azure’s pricing, performance and applicability that I have come across lately, deserve some clarifications.&nbsp; In this, post I have attempted to capture some of these concerns and provide my humble thoughts on why we need a take a holistic approach when evaluating the Windows Azure Platform.
<p><strong><u>Azure &#8211; A Platform as a Service offering</u></strong></p>
<p>Let me begin by stating that not all cloud offerings are alike.&nbsp; In their paper, &#8220;Toward a Unified Ontology of Cloud Computing&#8221; [0] Lamia Youssef et al. provide a detailed model for understanding the different classes of cloud providers. The following diagram depicts their proposed classification of cloud service providers including Platform as a Service (PaaS), Infrastructure as a Service(IaaS) and Software as a Service (SaaS).
<p><a href="http://vlele.files.wordpress.com/2009/10/image.png"><img style="border-width:0;" height="191" alt="image" src="http://vlele.files.wordpress.com/2009/10/image_thumb.png?w=340&#038;h=191" width="340" border="0"></a> </p>
<p>Screen clipping from:&nbsp; <a href="http://www.cs.ucsb.edu/~lyouseff/CCOntology/CloudOntologyPres.pdf">http://www.cs.ucsb.edu/~lyouseff/CCOntology/CloudOntologyPres.pdf</a></p>
<p>Microsoft Azure is a &#8220;Platform as a Service&#8221; offering, which is very different from what Amazon is offering via EC2 (commonly classified as &#8220;Infrastructure as a Service&#8221;) or even Google&#8217;s App Engine (GAE), commonly classified as a specialized &#8220;Platform as a Service&#8221; offering [1]. As a result of this difference in approach, the lifecycle of a Windows Azure application lifecycle is different as well. As depicted in the figure below &#8211; A developer develops the code in the developer fabric running locally and then simply publishes it to the cloud, along with a description of the desired infrastructure model. Based on the uploaded code and the infrastructure model, Azure orchestrates the provisioning of the computing, storage and networking resources in a manner that is fault tolerant and allows for rolling upgrades. It is clear that Microsoft has had to innovate at 100 mph in order to make this concept a reality. I encourage you to read a recently released Microsoft research paper on <a href="http://research.microsoft.com/pubs/81154/helios.pdf">Helios</a> that describes an OS abstraction across a number of heterogeneous CPUs. Make no mistake; Azure is the only cloud offering that is trying to create a &#8220;Cloud OS&#8221; abstraction around a fabric of Windows machines. This is not to suggest that EC2 or GAE offerings are not useful. Far from it &#8211; If one is looking for an on-demand Virtual Machine provider, EC2 is a great choice. After all, Amazon is the king of retail and as its executives like to say with a grin &#8220;we will gladly match the lowest price offered by our competitors&#8221;. On the other hand, if you have a Java or Python based web application that can fit GAE pre-defined application structure and framework&nbsp; &#8211; GAE would be a great choice. GAE is already successful with over 45,000 applications by the last count. In the end, different requirements will require the use of different types of cloud offerings.
<p>&nbsp;
<p><a href="http://vlele.files.wordpress.com/2009/10/clip_image00141.png"><img style="border-width:0;" height="233" alt="clip_image001[4]" src="http://vlele.files.wordpress.com/2009/10/clip_image0014_thumb1.png?w=354&#038;h=233" width="354" align="left" border="0"></a>
<p><font size="1">&nbsp;&nbsp;&nbsp; </font><font size="1">1) Windows Azure manages applications not just servers </font></p>
<p><font size="1">&nbsp;&nbsp;&nbsp; 2) Tell it what you want, and it will automate the details</font></p>
<p><font size="1">&nbsp;&nbsp; 3) Model-driven automation</font></p>
<p><font size="1">&nbsp;&nbsp; 4) Platform insures service isolation</font></p>
<p>&nbsp;
<p>&nbsp;
<p>&nbsp;
<p>&nbsp;
<p>&nbsp;
<p>Now that we have an understanding of the different flavors of cloud computing, let us circle back to where I started and address some of the broad-brush statements, I alluded to earlier.&nbsp;
<p><b><u>Concern #1: &#8220;The Car Analogy&nbsp; -&nbsp; Azure Pricing model is fundamentally broken&#8221;</u></b>
<p>&#8220;<i>Azure is like a car that has its engine running constantly, even when it is not being driven </i>&#8220;.
<p>The author of the above analogy is trying to contrast Azure pricing with GAE where you only pay for the time you use the service.
<p>&#8220;<i>Azure is like a car that has its hood sealed shut. One cannot look what is under the hood, leave alone reconfigure it</i>&#8220;.
<p>The author of above analogy is trying to highlight the fact that one cannot directly access the virtualized instance that is running the Azure based application.
<p>I think each of the above analogy only conveys a half-truth about Azure. I think a better analogy for Azure is this:
<p>&#8220;<i>Azure is a like a car you rent from </i><a href="http://www.zipcar.com/"><i>ZipCar</i></a><i>&nbsp; (a hourly car rental company)</i>&#8221;
<p>The price of the ZipCar rental includes gas and insurance cost. Of course, you pay for the hour whether you use the car or not (ZipCar has to spend money to honor a reservation you have made). But at any time, one can simply return the car and incur no additional charges. Would someone care to look under the hood of a ZipCar &#8211; I certainly would not. This is against the very reason I want to get a car from ZipCar in the first place &#8211; once I pay for the hourly rental I don&#8217;t have to worry about insurance or fuel. If something goes wrong, I can simply wave my ZipCar card and get into the next available car. And if for any reasons, my co-passengers want to go on a little excursion &#8211; they can, on a short notice, get additional cars at the same fixed price and give them up when they are done with them.
<p>So how can GAE offer a model that requires the customers to pay only for the time their application gets used, when EC2 and Azure cannot? The answer lies in the figure below &#8211; as you want more control the economy of scale goes down.&nbsp; Azure and EC2 give you more control (in that order) and as a result, cannot take advantage of the economy of scale at the same level as the GAE. GAE, Azure and EC2 are each offering a multitenant platform but the degree to which each the tenant can configure their individual setup is different. I will not be surprised if an ISV were to come out with an Azure based cloud offering that is constrained in some way (for example, it allow customers to submit their HttpHandlers ) but in turn, offers a usage based pricing model.
<p><a href="http://vlele.files.wordpress.com/2009/10/image1.png"><img style="border-width:0;" height="208" alt="image" src="http://vlele.files.wordpress.com/2009/10/image_thumb1.png?w=349&#038;h=208" width="349" border="0"></a>l </p>
<p>There are two other pricing related concerns that I have come across.
<p>&#8220;I<i> can host 2 blogs and a wiki for the price of a single Azure Web role</i>&#8220;.
<p>Hosting a blog or wiki is not likely the target application for Azure Web Role. If you want to host a blog or wiki, Business Productivity Online Suite (BPOS) [5] offering will be a more cost effective.
<p>&#8220;M<i>y hoster allows me to create multiple virtual directories (vdir) inside a single VM. With Azure, I need multiple Web Roles to achieve the same setup</i>&#8220;.
<p>First off, it is not appropriate to compare a vdir offered by a VM where you have completed access to the machine (and in turn assume all the responsibility for administering it), with the vdir offered by a web role &#8211; web role offers fault tolerance, monitoring, load balancing and other SLA guarantees. While these differences are important, in the end, it is really about raising the level of abstraction. Readers will recall that when IIS 6 came out with the default out-of-process model, there were some concerns that provisioning a distinct process for each web application would be expensive (as opposed to an in-process or pooled process model supported by IIS 5.0). But the isolation and fault tolerance offered by an out of process model quickly sidelined any concerns about the cost of provisioning additional processes.
<p>&nbsp;</p>
<p><strong><u>Concern #2: &#8220;Azure does not scale dynamically&#8221;</u></strong></p>
<p>This concern is based on the fact that one has to specify the exact number of Azure role instances that one wishes to provision. In the current CTP, there is no way to specify a range for the role instance. In other words, letting Azure determine when it is appropriate to ramp up or ramp down the number of running instances, automatically based on the load on the application.
<p>Frankly, this is not as big a deal as it sounds. One can always write a small piece of code that spawns new instances (or conversely, shuts down unused ones) based on the health alerts. Also note that the underlying fabric does indeed support providing a range (refer to the PDC 08 session [2]&nbsp; <a href="http://channel9.msdn.com/pdc2008/ES19/">&#8220;Under the Hood: Inside the Windows Azure Hosting&#8221;</a> &#8211; fast forward to minute 67:14). I think that it is a matter of time before Microsoft exposes this capability to the end users.
<p><strong><u>Concern #3: &#8220;Azure makes sense only for the large enterprises&#8221;</u></strong></p>
<p><i>&#8220;The massive scalability, fault tolerance and high availability are well suited for large enterprises. Most of the applications we build as a small/medium business don&#8217;t need these capabilities&#8221;.</i>
<p>Let us consider a small/medium sized web retailer. Based on the available, Azure pricing it would typically cost ~$360/month to run (refer to the cost breakup provided below) a small /medium web site &#8211; all without any upfront investment in staging / production / disaster recovery hardware or software costs.&nbsp;
<p><em></em>&nbsp;</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="151"><strong><u>Resource</u></strong></td>
<td valign="top" width="134"><strong><u>Description</u></strong></td>
<td valign="top" width="113"><strong><u>Cost</u></strong></td>
</tr>
<tr>
<td valign="top" width="151">Compute</td>
<td valign="top" width="134">2 web roles to get the 99.95% uptime SLA</td>
<td valign="top" width="113">$172.80 (30*24*.12*2)</td>
</tr>
<tr>
<td valign="top" width="151">Storage (SQL)</td>
<td valign="top" width="134">10 GB</td>
<td valign="top" width="113">$99.99 </td>
</tr>
<tr>
<td valign="top" width="151">Storage Transactions</td>
<td valign="top" width="134">1 Million Transactions</td>
<td valign="top" width="113">$1</td>
</tr>
<tr>
<td valign="top" width="151">Messages</td>
<td valign="top" width="134">1 Million Transactions</td>
<td valign="top" width="113">$1.50</td>
</tr>
<tr>
<td valign="top" width="151">Bandwidth In</td>
<td valign="top" width="134">50 GB</td>
<td valign="top" width="113">$10</td>
</tr>
<tr>
<td valign="top" width="151">Bandwidth Out</td>
<td valign="top" width="134">100 GB</td>
<td valign="top" width="113">$75</td>
</tr>
<tr>
<td valign="top" width="151">Total </td>
<td valign="top" width="144">&nbsp;</td>
<td valign="top" width="144"><strong>$360.29 / month</strong></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>To compare the above cost with a hosted/on-premise solution, I checked with one of our customers on how much they were paying to host their servers in a data center in Herndon, VA. Here is the information I was provided:</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="200"><strong><u>Resource</u></strong></td>
<td valign="top" width="200"><strong><u>Single</u></strong> windows server machine</td>
</tr>
<tr>
<td valign="top" width="200"><strong><u>What is covered </u></strong></td>
<td valign="top" width="200">Network, Power, Cabling</td>
</tr>
<tr>
<td valign="top" width="200">&nbsp;</td>
<td valign="top" width="200">Tape Backup, Config and handling</td>
</tr>
<tr>
<td valign="top" width="200">&nbsp;</td>
<td valign="top" width="200">Firewall, F-5 Network switch</td>
</tr>
<tr>
<td valign="top" width="200">&nbsp;</td>
<td valign="top" width="200">Remote hands support</td>
</tr>
<tr>
<td valign="top" width="200">&nbsp;</td>
<td valign="top" width="200">Physical security and intrusion detection</td>
</tr>
<tr>
<td valign="top" width="200">&nbsp;</td>
<td valign="top" width="200">AD Servers / Exchange/ SMTP Access</td>
</tr>
<tr>
<td valign="top" width="200"><strong><u>What is not covered</u></strong> </td>
<td valign="top" width="200">Applying patches, failure detection. </td>
</tr>
<tr>
<td valign="top" width="200">&nbsp;</td>
<td valign="top" width="200"><strong>Cost of the hardware and software </strong></td>
</tr>
<tr>
<td valign="top" width="200"><strong><u>Cost</u></strong></td>
<td valign="top" width="200"><strong>~$150.00 /month</strong></td>
</tr>
</tbody>
</table>
<p>Furthermore, even small retailers are subject to compliance with the security and auditing standards such as Payment Card Industry &#8211; Data Security Standard (PCI-DSS) and Statement on Auditing Standards (SAS 70). By hosting their application in the Microsoft&#8217;s cloud infrastructure, even small retailers can take advantage of security certifications that Microsoft has earned including SAS 70 and ISO/IEC 27001-2005 certifications [4].
<p>Let us consider another example &#8211; I am working with a customer who has a very limited budget for hosting a small HR application in Canada, because of the local laws, this application must be hosted within geographical boundaries of Canada &#8211; unfortunately they have a very small office in Canada with limited or no data center capabilities.&nbsp; At first glance, the option to purchase a small Windows box and placing it in their office in Canada seemed most cost effective. But once they added up the cost to manage the setup, it was clear that total cost of ownership would be not be very cost effective. This customer is now looking at hosting their application in Azure &#8211; hoping to take advantage of <a href="http://blogs.msdn.com/windowsazure/archive/2009/03/18/geo-location-enables-developers-to-choose-data-centers-and-group-applications-storage.aspx">Geo-Location</a> guarantees it offers. The key point to take away from this example is this &#8211; by taking advantage of the global data centers, even small to medium businesses can achieve a world-wide reach.
<p>One final point about pricing, it is ultimately the free market model that will determine where the PaaS pricing lands. As is evident from the <a href="http://reddevnews.com/articles/2009/04/01/microsoft-revamps-sql-data-services-sds-cloud-database.aspx">major mid-course correction</a> regarding the SQL Data Services offering, Microsoft is going to have to listen to and adjust, based on customer and market demands. I also expect that Microsoft would offer special promotions initially(for MSDN users, small businesses and startups &#8211; similar to the BizSpark program) to build the momentum.
<p>So, do the cost estimates for Azure put it out of reach of most small/medium businesses, I will let you be the judge.&nbsp;
<p><strong><u>Concern #4: &#8220;I am out if there is no Remote Desktop Access&#8221;</u></strong></p>
<p>This is probably the most often requested feature. It is easy to see how remote desktop access would be helpful; it allow access to the desktop, install software components, custom configuration &#8211; registry tweaks etc. While remote desktop may very well be supported in the future, keep in mind that the tradeoff will be that customers would be required to assume the responsibility for additional administrative tasks including patch management and access control.
<p>Once again the underlying fabric may already support this capability. During his PDC 08 Manuvir Das talked about an &#8220;escape hatch&#8221; or raw mode as something that is available under the covers.
<p><a href="http://vlele.files.wordpress.com/2009/10/image2.png"><img style="border-width:0;" height="196" alt="image" src="http://vlele.files.wordpress.com/2009/10/image_thumb2.png?w=336&#038;h=196" width="336" border="0"></a>
<p>&nbsp;
<p>Screen clipping taken from <a href="http://channel9.msdn.com/pdc2008/ES16/">http://channel9.msdn.com/pdc2008/ES16/</a> Fast forward to the 21.44 minute mark in the presentation.
<p><b><u>Concern #5: &#8220;You cannot seamlessly move your Azure application back to the datacenter&#8221;</u></b>
<p>The vendor lock-in argument against Azure is that once you build an application for Azure, it will be hard to move it back to an on-premise and hosted data center.&nbsp; Frankly, vendor lock-in is a concern with any cloud provider. As I heard <a href="http://www.davidchappell.com/blog/">David Chappell</a> say recently &#8211; &#8220;there is no lock-in like the cloud. Cloud provider can turn the spigot of the service off, rather abruptly&#8221; ( I have paraphrased his quote a bit as I cannot recall his exact words).
<p>Clearly, trust in cloud computing can only build over time. And hopefully over time, through good experiences, concerns over vendor lock-in will diminish as well.&nbsp;
<p>If we take a closer look at what it takes to build an Azure hosted application, the lock-in concerns do not seem as grave.
<p>For instance, it is encouraging to see that Microsoft along with IBM, Rackspace and others have <a href="http://www.zend.com/en/company/news/Press/zend-teams-with-ibm-microsoft-rackspace-and-other-cloud-leaders-on-open-source-initiative-to-drive-cloud-application-development">agreed</a> to join the <a href="http://www.simplecloud.org/">Simple API</a> [3] project by Zend Technologies that provides a common File Storage, Document Storage and Simple Queues API&nbsp; against a cross-section of vendor offerings including Rackspace Cloud Files, Windows Azure Storage, Amazon S3 and Nirvanix.
<p>The Windows Azure team has also doubled-down on the more open RESTful web API, thus making it easier for non .NET applications to consume it. The Azure team has also recently unveiled the native mode execution capability that lifts the restriction on running applications that are based on managed .NET code only. This means that it is now possible to host application built using Python/ CGI on Azure.
<p>As I have stated earlier, Azure development is squarely based on .NET building blocks WCF/WF/ASPX and so on. So fundamentally you are writing .NET code &#8211; it is important to understand that the only new API introduced with Azure &#8211; called the Service Runtime API &#8211; fits in one screen (shown below). So there is not going to be a large body of Azure specific syntax that needs to be ported, should you decide to move the application back to your premises.
<p>&nbsp;
<p>&nbsp;<a href="http://vlele.files.wordpress.com/2009/10/service-runtime.jpg"><img style="border-width:0;" height="258" alt="Service Runtime" src="http://vlele.files.wordpress.com/2009/10/service-runtime_thumb.jpg?w=344&#038;h=258" width="344" border="0"></a>
<p>&nbsp;
<p>While the code you write for an Azure application is all .NET based, there are a number of guidelines [8] that one will need to adhere to, for a successful implementation on Azure.
<p>· Develop for the sandbox
<p>· Prefer scale out over scale up
<p>· Separate out the state from UI ; store the state in a distributed horizontal storage
<p>· Be loosely coupled&nbsp;&nbsp;
<p>· Be prepared to handle varying loads
<p>· Deal with failures; build retry logic that is idempotent
<p>· Rolling upgrades &#8211; upgrade your application without any downtime
<p>· Rely on unified logging ; build an alert mechanism
<ul></ul>
<p><a href="http://vlele.files.wordpress.com/2009/10/image14.png"><img style="border-width:0;" height="270" alt="image" src="http://vlele.files.wordpress.com/2009/10/image14_thumb.png?w=373&#038;h=270" width="373" border="0"></a>
<p>Fortunately most of the above bullets are the guidelines that the industry as a whole has been chasing over the last decade. So to the extent we can inculcate these in our design, our applications will better off &#8211; whether we choose to host them in the cloud or not.&nbsp; I would even go to the extent of saying that cloud computing done right is a great hope for all of the industry.
<p><b><u>Concern #6: &#8220;Azure is slow compared to EC2 or GAE&#8221;</u></b>
<p>How would a performance of a Web application hosted inside Azure compare with a similar application developed using EC2 or GAE? First off, this is an apples-to-oranges comparison. With EC2 you can ask for a specific hardware configuration (for example, you have the option to select an EC2 instance that has 8 virtual cores with 2.5 EC2 compute units each [7]). Azure offers full relational capability that EC2 and GAE don&#8217;t. Azure offers a batch processing capability that GAE does not. I could go on and on but you get the idea. These are three different approaches to cloud computing and offer distinct performance optimization strategies.
<p><b><u>Closing</u></b>
<p>In closing, let me say this &#8211; I would be pollyannaish to suggest that Azure is a perfect cloud offering. Only time will tell how successful Azure is.&nbsp; After building a handful of Azure applications ( mainly POCs), I, like many others, have run into some challenges with the current CTP &#8211; Here are a few examples of the kinds of problems I am talking about&nbsp; &#8211; Provisioning ( I am not talking about new applications, even upgrading applications where the model is unchanged ) is&nbsp; very slow. The slowness in provisioning further exacerbates the fact that the provisioning is very coarse grained &#8211; even if you had to change a single master page, code behind or CSS file, one has to go through the slow process of upgrading my application. Another example would be the pricing of .NET Service bus &#8211; based on the information available so far, it is very hard to develop a pricing model for a complex app &#8211; how do you differentiate between TCP connection vs. streaming connection, what does a transaction mean exactly? The diagnostics support is rudimentary &#8211; all you have are the logs (no access to the event logs, server logs etc.). Furthermore, it takes several minutes to copy them to the blob storage. Finally, there is only support for two types of roles &#8211; Web and Worker. What if I wanted to add on specific software (for example Excel Services)? Or, what if I wanted to run .NET 2.0 or even a .NET 4.0 based applications? (<i>Note that a number of enhancements to the </i><i>logging functionality have been announced very recently [6] including ability to look at the performance counters and auto copying of logs on a periodic basis</i>)
<p>The Azure team has heard the above feedback many times and has their work cut out for them. They are working hard to alleviate some of aforementioned challenges by the time Azure is launched commercially in November and in subsequent releases. And for the rest of us, who want to build cloud application using the .NET building blocks we know and the VS.NET based tools we love, work is cut out for us as well &#8211; brainstorm about the applications that can leverage the Azure platform, build prototypes, provide feedback on the pricing models, develop tools &amp; utilities and last but not the least, demand the best product possible.
<p><b><u>References </u></b>
<p>[0] Towards a Unified Ontology of Cloud Computing &#8211; <a href="http://www.cs.ucsb.edu/~lyouseff/CCOntology/CloudOntology.pdf">http://www.cs.ucsb.edu/~lyouseff/CCOntology/CloudOntology.pdf</a>
<p>[1] Above the Clouds: A Berkeley View of Cloud Computing <a href="http://www.eecs.berkeley.edu/Pubs/TechRpts/2009/EECS-2009-28.pdf">http://www.eecs.berkeley.edu/Pubs/TechRpts/2009/EECS-2009-28.pdf</a>
<p>[2] Dynamic Scaling &#8211; <a href="http://channel9.msdn.com/pdc2008/ES19/">http://channel9.msdn.com/pdc2008/ES19/</a>
<p>[3] Simple API &#8211; <a href="http://www.simplecloud.org/">http://www.simplecloud.org/</a>
<p>[4] Securing Microsoft&#8217;s Cloud Infrastructure &#8211; <a href="http://www.globalfoundationservices.com/security/documents/SecuringtheMSCloudMay09.pdf">http://www.globalfoundationservices.com/security/documents/SecuringtheMSCloudMay09.pdf</a>
<p>[5] Business Productivity Online Suite &#8211; <a href="http://www.microsoft.com/resources/Technet/en-us/MSOnline/bpos/html/99d9ede5-ce15-476c-9a3f-d42a481d287e.htm">http://www.microsoft.com/resources/Technet/en-us/MSOnline/bpos/html/99d9ede5-ce15-476c-9a3f-d42a481d287e.htm</a>
<p>[6] Azure team recently announced the following enhancements to Windows Azure Logging &#8211; <a href="http://blogs.msdn.com/windowsazure/archive/2009/10/03/upcoming-changes-to-windows-azure-logging.aspx">http://blogs.msdn.com/windowsazure/archive/2009/10/03/upcoming-changes-to-windows-azure-logging.aspx</a>
<p>[7] Amazon EC2 Instance Types &#8211; <a href="http://aws.amazon.com/ec2/instance-types/">http://aws.amazon.com/ec2/instance-types/</a>
<p>[8] <a href="http://channel9.msdn.com/pdc2008/ES03/">Windows Azure: Cloud Service Development Best Practices </a>- <a href="http://channel9.msdn.com/pdc2008/ES03/">http://channel9.msdn.com/pdc2008/ES03/</a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/vlele.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/vlele.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/vlele.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/vlele.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/vlele.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/vlele.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/vlele.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/vlele.wordpress.com/124/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/vlele.wordpress.com/124/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/vlele.wordpress.com/124/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=124&subd=vlele&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://vlele.wordpress.com/2009/10/14/outlook-for-azure-scattered-clouds-but-generally-sunny/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ae43c20c0f5d552cd08ced6c49931722?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">vlele</media:title>
		</media:content>

		<media:content url="http://vlele.files.wordpress.com/2009/10/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://vlele.files.wordpress.com/2009/10/clip_image0014_thumb1.png" medium="image">
			<media:title type="html">clip_image001[4]</media:title>
		</media:content>

		<media:content url="http://vlele.files.wordpress.com/2009/10/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://vlele.files.wordpress.com/2009/10/image_thumb2.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://vlele.files.wordpress.com/2009/10/service-runtime_thumb.jpg" medium="image">
			<media:title type="html">Service Runtime</media:title>
		</media:content>

		<media:content url="http://vlele.files.wordpress.com/2009/10/image14_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>SharePoint Database Tips</title>
		<link>http://vlele.wordpress.com/2009/08/06/sharepoint-database-tips/</link>
		<comments>http://vlele.wordpress.com/2009/08/06/sharepoint-database-tips/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 20:02:39 +0000</pubDate>
		<dc:creator>vlele</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://vlele.wordpress.com/2009/08/06/sharepoint-database-tips/</guid>
		<description><![CDATA[Recently, I have been working on a number of SharePoint database issues related to large number of workflow instances.&#160; Here are a few things I encountered:
&#160;

System.Runtime.InteropServices.COMException (0&#215;80004005) is a catch all for all database and other interop errors&#160; &#8211; You can get this error for any number of reasons &#8211; for example out of transaction [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=111&subd=vlele&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Recently, I have been working on a number of SharePoint database issues related to large number of workflow instances.&nbsp; Here are a few things I encountered:</p>
<p>&nbsp;</p>
<ul>
<li>System.Runtime.InteropServices.COMException (0&#215;80004005) is a catch all for all database and other interop errors&nbsp; &#8211; You can get this error for any number of reasons &#8211; for example out of transaction log space, deadlocks etc. I have seen a number of posts on the web attributing this error to one condition or another. </li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Turn on WF tracing (see my previous <a href="http://vlele.wordpress.com/2009/05/05/debugging-sharepoint-workflows/">post</a> for more information). Trace logs provide a great source of information on how a given workflow instance has progressed. One can find the workflow instance that encountered an error. Once you have the workflow instance, you can query the workflow and workflow association tables to determine the related SPWeb, SPTask etc. </li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Because SharePoint uses GUID as a the primary key it can result in a fragmentation (Kimblerly Tripp has a nice <a href="http://www.sqlskills.com/BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs-andor-the-clustering-key.aspx">post</a> about this) that one needs to be aware of.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>We found that despite the weekly timer job ( note that there is a difference between SP1 and SP2)statistics on certain tables can be off, resulting in less than optimal plans, which in turn&nbsp; can cause deadlocks in some instances.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>It is important to review the content database maintenance plan and tweak it as needed &#8211; Another useful post from Kimberly Tripp &#8211; <a title="http://www.sqlskills.com/BLOGS/KIMBERLY/post/Database-Maintenance-Best-Practices-Part-I-e28093-clarifying-ambiguous-recommendations-for-Sharepoint.aspx" href="http://www.sqlskills.com/BLOGS/KIMBERLY/post/Database-Maintenance-Best-Practices-Part-I-e28093-clarifying-ambiguous-recommendations-for-Sharepoint.aspx">http://www.sqlskills.com/BLOGS/KIMBERLY/post/Database-Maintenance-Best-Practices-Part-I-e28093-clarifying-ambiguous-recommendations-for-Sharepoint.aspx</a></li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Check if max degrees of parallelism is having an impact? Try re-running your tests after MAXDOP to 1.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Look for lock escalation warnings &#8211; Try altering the locking threshold using the trace flags (1211, 1224).</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Review your code for potentially expensive WSS OM calls such as BreakRoleInheritance. Perform static analysis using tool such as <a href="http://code.msdn.microsoft.com/SPDisposeCheck">SPDisposeCheck</a> to make sure resources are being correctly disposed.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Because of their episodic nature, workflows are difficult to automate the testing of workflows &#8211; There is a nice MSDN&nbsp; <a href="//msdn.microsoft.com/en-us/magazine/dd179724.aspx">article</a> on unit testing workflows. </li>
</ul>
<blockquote><p>Load testing workflows is even harder. We developed a tool that allowed us to load test our workflows. This tool is itself a workflow program that drives a configured number of workflows &#8211; you basically supply the workflow types, users, how the tasks need to be updated (accepted, rejected etc ) and in what order. Having a load test tool allowed us to consistently recreate some of the issues we were encountering in production. </p>
</blockquote>
<blockquote><p>&nbsp;</p>
</blockquote>
<ul>
<li>Active management of lists is very important. Archive old items from lists regularly as appropriate. </li>
</ul>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/vlele.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/vlele.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/vlele.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/vlele.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/vlele.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/vlele.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/vlele.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/vlele.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/vlele.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/vlele.wordpress.com/111/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=111&subd=vlele&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://vlele.wordpress.com/2009/08/06/sharepoint-database-tips/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ae43c20c0f5d552cd08ced6c49931722?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">vlele</media:title>
		</media:content>
	</item>
		<item>
		<title>Porting DinnerNow.NET to Azure</title>
		<link>http://vlele.wordpress.com/2009/07/04/porting-dinnernow-net-to-azure/</link>
		<comments>http://vlele.wordpress.com/2009/07/04/porting-dinnernow-net-to-azure/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 05:34:33 +0000</pubDate>
		<dc:creator>vlele</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://vlele.wordpress.com/2009/07/04/porting-dinnernow-net-to-azure/</guid>
		<description><![CDATA[URL http://ais.cloudapp.net&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
Source Code&#160; http://cid-818700175481d002.skydrive.live.com/browse.aspx/Blog 

I (along with Harin Sandhoo from AIS) recently worked on converting a subset of DinnerNow.net application to Azure. This post captures some of highlights of the porting effort. 
DinnerNow.net is a reference application developed by Microsoft to showcase .NET 3.5 functionality. This application&#160; can be broken up into three subsystems: [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=107&subd=vlele&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><blockquote><p><strong>URL</strong> <a href="http://ais.cloudapp.net">http://ais.cloudapp.net</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p><strong>Source Code&nbsp; </strong><a title="http://cid-818700175481d002.skydrive.live.com/browse.aspx/Blog " href="http://cid-818700175481d002.skydrive.live.com/browse.aspx/Blog">http://cid-818700175481d002.skydrive.live.com/browse.aspx/Blog </a></p>
</blockquote>
<p>I (along with Harin Sandhoo from AIS) recently worked on converting a subset of DinnerNow.net application to Azure. This post captures some of highlights of the porting effort. </p>
<p>DinnerNow.net is a reference application developed by Microsoft to showcase .NET 3.5 functionality. This application&nbsp; can be broken up into three subsystems: </p>
<p>1. Web site where customers can order food from a variety of restaurants in their local delivery area. </p>
<p>2. Smart client application that allows a restaurant manager to view the incoming orders and update their status.
<p>3. Mobile application that allows a delivery person to be notified when orders are ready for delivery.
<p>It made sense to start with porting the web site to Azure. In future, it may be interesting to look into building a Silverlight equivalent for the restaurant manager piece and perhaps, a live mesh based mobile delivery application.</p>
<p><strong>Current Architecture</strong>&nbsp;</p>
<p>DinnerNow.net web site is implemented as ASP.NET application hosted inside IIS 7. Data is currently stored in SQL 2005, a LINQ to SQL based data access layer is used to persist the data. Business service functionality is using WCF and workflow service (also hosted inside the IIS 7)</p>
<p>&nbsp;</p>
<p><a href="http://vlele.files.wordpress.com/2009/07/image.png"><img style="border-width:0;" height="215" alt="DinnerNow" src="http://vlele.files.wordpress.com/2009/07/image_thumb.png?w=331&#038;h=215" width="331" align="left" border="0"></a> </p>
<p>&nbsp;</p>
<p><a href="http://vlele.files.wordpress.com/2009/07/image1.png"></a>&nbsp;</p>
<p><a href="http://vlele.files.wordpress.com/2009/07/image1.png"></a>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong></strong>&nbsp;</p>
<p><font size="2"><em>[ Readers who are not already familiar with Azure concepts such as roles, may find it useful to review </em></font><a href="http://msdn.microsoft.com/en-us/library/dd179341.aspx"><font color="#000000" size="2"><strong><em>this</em></strong></font></a><font size="2"><em><strong> </strong>first</em> ]</font></p>
<p><strong>Proposed Architecture</strong>&nbsp;&nbsp; <a href="http://vlele.files.wordpress.com/2009/07/image2.png"><img style="border-width:0;" height="215" alt="image" src="http://vlele.files.wordpress.com/2009/07/image_thumb1.png?w=302&#038;h=215" width="302" align="left" border="0"></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>The Azure version of DinnerNow.net utilizes the web role to host ASP.NET code as well as the WCF services. For now (because of the limits on the # of projects under the CTP) the UI code and WCF endpoints are hosted within the same web role. In the future, it will make sense to move the WCF endpoints to a separate web role. An Azure Table based membership provider ( part of the Azure SDK sample) is used for authentication. </p>
<p>A worker role is used for some background processing tasks such as storing the order into the database. The communication between the web and worker role takes place via the Azure Queue. <strike>The worker role is also responsible for communicating with the workflow program (ProcessOrder.xoml) that places the submitted order to a queue for further processing by the restaurants</strike>. As of July 1st, Azure Workflow Service <a href="http://blogs.msdn.com/netservicesannounce/default.aspx">has been taken down</a>.&nbsp; As a result, we have taken out the workflow service related code. The key motivations for including Azure Workflow Service, in the first place, included 1) a robust host for the workflow program 2) connectivity to applications inside the enterprise (such as the restaurant manager application) </p>
<p>The biggest challenge in porting the application was related to the database. Even though the relational features for SDS have been <a href="http://blogs.msdn.com/ssds/archive/2009/03/10/9469228.aspx">announced</a>, they are not yet available. This forced us to rely on Windows Azure Table as the persistence store. The key consideration in moving the data from relational DB to Azure Table is the partitioning strategy. Consider the following the dbml diagram depicting Order, OrderDetail and OrderPayment, LINQ to SQL classes. Azure Table supports a flexible schema&nbsp; that allows entities of different types to be stored within a single table. Since there was a need to retrieve Order and OrderDetails together,&nbsp; we clustered the two together inside a single table for efficient retrieval. We partitioned the data according to order id and the RowKey was used to differentiate between the entities (i.e. &#8220;OrderItem_&#8221;+ DateTime , &#8220;Order_&#8221; + DateTime). Since the sorting is lexicographic, we use fixed length format based on Ticks. </p>
<p>&nbsp;</p>
<p><a href="http://vlele.files.wordpress.com/2009/07/clip_image001.png"><a href="http://vlele.files.wordpress.com/2009/07/clip_image00193.png"><a href="http://vlele.files.wordpress.com/2009/07/clip_image001.png"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" height="424" alt="clip_image001" src="http://vlele.files.wordpress.com/2009/07/clip_image001_thumb.png?w=302&#038;h=424" width="302" border="0"></a></a></a>
<p><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" height="54" alt="clip_image001[9]" src="http://vlele.files.wordpress.com/2009/07/clip_image0019_thumb.png?w=746&#038;h=54" width="746" border="0"><a href="http://vlele.files.wordpress.com/2009/07/clip_image00193.png"></a>
<p>&nbsp;
<p>Azure Table supports ADO.NET Data Services and REST. Fortunately, the data access code is not significantly different.&nbsp; So for example, the existing LINQ to SQL query inside the GetOrdersForRestaurant method that looks like this:</p>
<p><font face="Lucida Console">var ordersByRestaurant = (from o in db.Orders.Distinct()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where (from od in db.OrderDetails where od.RestaurantId == restaurantId select od.OrderId).Contains(o.OrderId)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select new DinnerNow.Business.Data.Order() </font></p>
<p>is changed to the following query when working with Azure Table: </p>
<p><font face="Lucida Console">var qResult = (from oItems in _context.CreateQuery&lt;OrderItemEntity&gt;(OrderTableName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where oItems.RestaurantId == restaurantId<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select oItems);</font>
<p>For additional details please refer to the file OrderProcessing.cs in the sample code that accompanies this blog post.
<p><strong>Code View</strong>
<p>The following diagram depicts the code view for the project. DinnerNow.CloudService is the Azure Service project that comprises of the web and worker role. The web role is mapped to the DinnerNow.WebUX project. Similarly the worker role is mapped to the DinnerNow.WorkerRole.
<p><a href="http://vlele.files.wordpress.com/2009/07/image3.png"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" height="240" alt="image" src="http://vlele.files.wordpress.com/2009/07/image_thumb2.png?w=206&#038;h=240" width="206" border="0"></a> </p>
<p><strong></strong>&nbsp;</p>
<p><strong>Miscellanea</strong></p>
<ul>
<li>It is recommended that configuration data be stored inside the CSCFG file (as opposed to web.config). This is because CSCFG file is stored outside the application package you upload to the Azure Portal &#8211; The application package is really a diff disk that gets applied to the base HyperV image. By storing the configuration data in the CSCFG file means that you can make changes without the need to upload a new&nbsp; application page. To read config setting from the CSCFG file use <em>GetConfigurationSetting</em> method of the <em>RoleManage</em> class. Like so:</li>
</ul>
<blockquote><p>var sslPort = Microsoft.ServiceHosting.ServiceRuntime.RoleManager.GetConfigurationSetting(&#8220;sslport&#8221;); </p>
</blockquote>
<ul>
<li>Our code is based SDK March CTP.</li>
<li>ASP.NET code is running in&nbsp; full trust (now available with the March CTP).
<li>Testing &#8211; We mostly relied on the mixed mode testing &#8211; wherein the code was executed in the developer fabric but the data was in the Azure Table.
<li>We used Cerebrata&#8217;s nifty cloud storage tool for&nbsp; all our testing &#8211; <a title="https://onlinedemo.cerebrata.com/Cerebrata.CloudStorage/default.aspx" href="https://onlinedemo.cerebrata.com/Cerebrata.CloudStorage/default.aspx">https://onlinedemo.cerebrata.com/Cerebrata.CloudStorage/default.aspx</a></li>
</ul>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/vlele.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/vlele.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/vlele.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/vlele.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/vlele.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/vlele.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/vlele.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/vlele.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/vlele.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/vlele.wordpress.com/107/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=107&subd=vlele&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://vlele.wordpress.com/2009/07/04/porting-dinnernow-net-to-azure/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ae43c20c0f5d552cd08ced6c49931722?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">vlele</media:title>
		</media:content>

		<media:content url="http://vlele.files.wordpress.com/2009/07/image_thumb.png" medium="image">
			<media:title type="html">DinnerNow</media:title>
		</media:content>

		<media:content url="http://vlele.files.wordpress.com/2009/07/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://vlele.files.wordpress.com/2009/07/clip_image001_thumb.png" medium="image">
			<media:title type="html">clip_image001</media:title>
		</media:content>

		<media:content url="http://vlele.files.wordpress.com/2009/07/clip_image0019_thumb.png" medium="image">
			<media:title type="html">clip_image001[9]</media:title>
		</media:content>

		<media:content url="http://vlele.files.wordpress.com/2009/07/image_thumb2.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Debugging SharePoint Workflows</title>
		<link>http://vlele.wordpress.com/2009/05/05/debugging-sharepoint-workflows/</link>
		<comments>http://vlele.wordpress.com/2009/05/05/debugging-sharepoint-workflows/#comments</comments>
		<pubDate>Tue, 05 May 2009 17:10:24 +0000</pubDate>
		<dc:creator>vlele</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://vlele.wordpress.com/2009/05/05/debugging-sharepoint-workflows/</guid>
		<description><![CDATA[This blog post is about tips and tricks for monitoring the health of SharePoint workflows. I will like to suggest&#160; this excellent MSDN article for additional information.
Logging information about the progress of workflows
 
The WF tracking service logs the events as the workflow progresses along. &#160;For example, consider a simple workflow (see below) that creates [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=94&subd=vlele&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h1><span style="font-size:11pt;font-family:Calibri,sans-serif;">This blog post is about tips and tricks for monitoring the health of SharePoint workflows. I will like to suggest&nbsp; <a href="http://msdn.microsoft.com/en-us/library/cc514224.aspx">this</a> excellent MSDN article for additional information.</span></h1>
<h2>Logging information about the progress of workflows</h2>
<p style="margin:0 0 0 1.45pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;"> </span></p>
<p style="margin:0 0 0 1.45pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">The WF tracking service logs the events as the workflow progresses along. <span>&nbsp;</span>For example, consider a simple workflow (see below) that creates a task and then loops until the task is 100% complete.</span></p>
<p style="margin:0 0 0 1.45pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p style="margin:0 0 0 1.45pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p style="margin:0 0 0 1.45pt;"><span><a href="http://vlele.files.wordpress.com/2009/05/clip-image002.jpg"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" height="377" alt="clip_image002" src="http://vlele.files.wordpress.com/2009/05/clip-image002-thumb.jpg?w=196&#038;h=377" width="196" border="0"></a></span></p>
<p style="margin:0 0 0 1.45pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p style="margin:0 0 0 1.45pt;"><span style="font-size:8pt;color:#666666;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p style="margin:0 0 0 1.45pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">By turning the tracking service on (see [<a href="#i">1</a>]) we can capture entries like the following, the trace output below corresponds to the workflow in Figure 1 above:</span></p>
<p style="margin:0 0 0 1.45pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<div style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;background:#daeef3;margin-left:.5in;border-left:windowtext 1pt solid;margin-right:0;border-bottom:windowtext 1pt solid;padding:1pt 4pt;">
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">System.Workflow.Runtime.Hosting Information: 0 : <span style="background:yellow;">Creating instance</span> <span style="background:lime;">1888f8e6-145c-4220-be52-99cfd09098a7</span></span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">&nbsp;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">System.Workflow.Runtime Information: 1 : Workflow Runtime: Scheduler: InstanceId: 1888f8e6-145c-4220-be52-99cfd09098a7 : Running scheduled entry: SubscriptionEvent((1)Workflow1, ActivityStatusChange(&#8216;(1)<span style="background:yellow;">createTask1</span>&#8216;, Closed, Succeeded))</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">&nbsp;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">System.Workflow.Runtime Information: 0 : Activity Status Change &#8211; Activity:<span style="background:yellow;"> whileActivity1</span> Old:Initialized; New:Executing</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">&nbsp;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:11pt;background:silver;font-family:Calibri,sans-serif;">// At this point the workflow is waiting for the user to update the task. So the workflow runtime can hydrate the running instance to the database </span><span style="font-size:9pt;font-family:'Courier New';"></span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">&nbsp;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">System.Workflow.Runtime Information: 0 : Workflow Runtime: WorkflowExecutor: <span style="background:yellow;">Got an unload request</span> for instance 1888f8e6-145c-4220-be52-99cfd09098a7</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">System.Workflow.Runtime Information: 0 : 1888f8e6-145c-4220-be52-99cfd09098a7: Calling PerformUnloading(false) on instance 1888f8e6-145c-4220-be52-99cfd09098a7 hc 13970169</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">System.Workflow.Runtime Information: 0 : Workflow Runtime: WorkflowExecutor: Unloading instance 1888f8e6-145c-4220-be52-99cfd09098a7</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">System.Workflow.Runtime.Hosting Information: 0 : TimerEventSubscriptionQueue: 1888f8e6-145c-4220-be52-99cfd09098a7 Suspend</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">System.Workflow.Runtime Information: 0 : 1888f8e6-145c-4220-be52-99cfd09098a7: <span style="background:yellow;">Calling Persist</span></span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">&nbsp;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:11pt;background:silver;font-family:Calibri,sans-serif;">// At this point the user marks the task as complete . So the workflow runtime can deserialize the workflow and pass it the TaskChanged event. This results in re-evaluation of the while loop</span><span style="font-size:11pt;font-family:Calibri,sans-serif;"></span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">&nbsp;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">System.Workflow.Runtime Stop: 0 : Workflow Trace</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">System.Workflow.Runtime.Hosting Information: 0 :<span style="background:yellow;"> Deserialized a Workflow1</span> [SampleWorkflow.Workflow1] to length 8660. Took 00:00:00.0400576.</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">System.Workflow.Runtime Information: 0 : Workflow Runtime: WorkflowExecutor: <span style="background:yellow;">Loading instance 1888f8e6-145c-4220-be52-99cfd09098a7</span></span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">&nbsp;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">System.Workflow.Runtime Information: 0 : Activity Status Change &#8211; Activity: <span style="background:yellow;">onTaskChanged1</span> Old:Executing; New:Closed</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">System.Workflow.Runtime Information: 1 : Workflow Runtime: Scheduler: InstanceId: </span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">&nbsp;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">1888f8e6-145c-4220-be52-99cfd09098a7 : Scheduling entry: SubscriptionEvent((1)<span style="background:yellow;">whileActivity1</span>, ActivityStatusChange(&#8216;(2)onTaskChanged1&#8242;, Closed, Succeeded))</span></p>
</div>
<p style="margin:0 0 0 1.45pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;"><span>&nbsp;</span></span></p>
<p style="margin:0 0 0 1.45pt;"><span style="font-size:8pt;color:#666666;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p style="margin:0 0 0 1.45pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">As you can see from the snippets above, we have information about step by step execution of the workflow.</span></p>
<p style="margin:0 0 0 1.45pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<h2>Workflow Failure Conditions</h2>
<p style="margin:0 0 0 1.45pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">Some of the common reasons why a workflow can fail include:</span></p>
<p style="margin:0 0 0 1.45pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p class="MsoNormal" style="vertical-align:middle;text-indent:-.25in;line-height:normal;margin:0 0 0 28.45pt;"><span style="font-size:12pt;"><span>a.<span style="font:7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>The WF program instance errors out because of an exception. For example, if a null object reference is encountered inside the <i>CreateTask</i> handler, in the workflow in Figure 1, above. This exception will cause the WF instance to move to the error state (reflected in the status column of the document library)</span><span style="font-size:12pt;"></span></p>
<p style="margin:0 0 0 28.45pt;"><span style="font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p style="margin:0 0 0 28.45pt;"><span><a href="http://vlele.files.wordpress.com/2009/05/clip-image004.jpg"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" height="30" alt="clip_image004" src="http://vlele.files.wordpress.com/2009/05/clip-image004-thumb.jpg?w=244&#038;h=30" width="244" border="0"></a></span></p>
<p style="margin:0 0 0 28.45pt;"><span style="font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p style="margin:0 0 0 28.45pt;"><span style="font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p style="margin:0 0 0 28.45pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">The tracking service will record this exception and typically log detailed information as shown below:</span></p>
<p style="margin:0 0 0 28.45pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<div style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;background:#daeef3;margin-left:.5in;border-left:windowtext 1pt solid;margin-right:0;border-bottom:windowtext 1pt solid;padding:1pt 4pt;">
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">System.Workflow.Runtime Critical: 0 :<span style="background:yellow;"> Uncaught exception escaped to the root of the workflow.</span></span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp; </span>In instance 9e644d58-9990-443a-a595-1685fec2c311 in activity </span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">Inner exception: System.NullReferenceException: Object reference not set to an instance of an object.</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';"><span>&nbsp;&nbsp; </span>at SampleWorkflow.Workflow1.TaskCreation(Object sender, EventArgs e)</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';"><span>&nbsp;&nbsp; </span>at System.Workflow.ComponentModel.Activity.RaiseEvent(DependencyProperty dependencyEvent, Object sender, EventArgs e)</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';"><span>&nbsp;&nbsp; </span>at System.Workflow.Activities.CallExternalMethodActivity.Execute(ActivityExecutionContext executionContext)</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';"><span>&nbsp;&nbsp; </span>at System.Workflow.ComponentModel.ActivityExecutor`1.Execute(T activity, ActivityExecutionContext executionContext)</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';"><span>&nbsp;&nbsp; </span>at System.Workflow.ComponentModel.ActivityExecutor`1.Execute(Activity activity, ActivityExecutionContext executionContext)</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';"><span>&nbsp;&nbsp; </span>at System.Workflow.ComponentModel.ActivityExecutorOperation.Run(IWorkflowCoreRuntime workflowCoreRuntime)</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';"><span>&nbsp;&nbsp; </span>at System.Workflow.Runtime.Scheduler.Run()</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">&nbsp;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;background:yellow;font-family:'Courier New';">System.Workflow.Runtime Information: 0 : Workflow Runtime: WorkflowExecutor: Terminating instance 9e644d58-9990-443a-a595-1685fec2c311</span></p>
</div>
<p style="margin:0 0 0 28.45pt;"><span style="font-family:Calibri,sans-serif;"><span>&nbsp;</span></span></p>
<p style="margin:0 0 0 28.45pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">One more point about exception conditions &#8211; there are times when we need to thrown an exception ourselves. For instance, if the user does not have appropriate permission, or there is missing data. In those cases, we could set a custom error message (See [<a href="#ii">2</a>])</span></p>
<p style="margin:0 0 0 28.45pt;"><span style="font-family:Calibri,sans-serif;">&nbsp; </span></p>
<p style="margin:0 0 0 28.45pt;"><span><a href="http://vlele.files.wordpress.com/2009/05/clip-image005.jpg"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" height="123" alt="clip_image005" src="http://vlele.files.wordpress.com/2009/05/clip-image005-thumb.jpg?w=581&#038;h=123" width="581" border="0"></a></span></p>
<p style="margin:0 0 0 28.45pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p style="margin:0 0 0 28.45pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p style="margin:0 0 0 28.45pt;"><span style="font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p style="margin:0 0 0 28.45pt;"><span style="font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p class="MsoNormal" style="vertical-align:middle;text-indent:-.25in;line-height:normal;margin:0 0 0 28.45pt;"><span><span>b.<span style="font:7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>The Application pool is recycled.<span>&nbsp; </span>The state from a previous persist point (if there was one &#8211; typically a delay activity or OnTaskChanged activity) is persisted in the database, but since there is no retry mechanism, there is no way to re-start the persisted workflow instance. For example, if the sample WF program instance was executing inside the While activity (whileActivity1 in Figure 1) when the app pool crashed, there is no automatic way to have the workflow restarted. </p>
<p>One potential solution would be to model the workflow as a state machine and include retry logic. But this would add complexity to the workflow.</p>
<p></span></p>
<p class="MsoNormal" style="vertical-align:middle;text-indent:-.25in;line-height:normal;margin:0 0 0 28.45pt;"><span><span>c.<span style="font:7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>If the correlation token is being set dynamically, there is a chance that the value gets incorrectly set in some cases. As a result, the waiting WF program instance will never receive the event. A correlation token is an identifier WF uses to tie activities to a common task &#8211; for example if CreateTask, OnTaskChanged and CompleteTask relate to a single task; they should have the same correlation token.</p>
<p></span></p>
<p class="MsoNormal" style="vertical-align:middle;text-indent:-.25in;line-height:normal;margin:0 0 0 28.45pt;"><span><span>d.<span style="font:7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>SharePoint workflow activities (like Create Task) delay database commits until a persist point is reached. This means that a CreateTask activity will not result in a &#8220;real&#8221; task being added to the list until a persist point is reached. So any direct SharePoint OM calls that attempt to reference the created task will fail until the point a persist point is reached. Please refer to [3] to dump out the </span></p>
<h3><a name="i"><span>&nbsp;</span>[1] </a>Workflow Diagnostics</h3>
<p style="margin:0;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p style="margin:0;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">Add the following section to the web.config: </span></p>
<p style="margin:0;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<div style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;background:#daeef3;margin-left:.5in;border-left:windowtext 1pt solid;margin-right:0;border-bottom:windowtext 1pt solid;padding:1pt 4pt;">
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';">&lt;</span><span style="font-size:9pt;color:#a31515;font-family:'Courier New';">system.diagnostics</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:9pt;color:#a31515;font-family:'Courier New';">switches</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:9pt;color:#a31515;font-family:'Courier New';">add</span><span style="font-size:9pt;color:blue;font-family:'Courier New';"> </span><span style="font-size:9pt;color:red;font-family:'Courier New';">name</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:9pt;font-family:'Courier New';">&#8220;<span style="color:blue;">System.Workflow LogToTraceListeners</span>&#8220;<span style="color:blue;"> </span><span style="color:red;">value</span><span style="color:blue;">=</span>&#8220;<span style="color:blue;">1</span>&#8220;<span style="color:blue;"> /&gt;</span></span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:9pt;color:#a31515;font-family:'Courier New';">add</span><span style="font-size:9pt;color:blue;font-family:'Courier New';"> </span><span style="font-size:9pt;color:red;font-family:'Courier New';">name</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:9pt;font-family:'Courier New';">&#8220;<span style="color:blue;">System.Workflow.Runtime.Hosting</span>&#8220;<span style="color:blue;"> </span><span style="color:red;">value</span><span style="color:blue;">=</span>&#8220;<span style="color:blue;">All</span>&#8220;<span style="color:blue;"> /&gt;</span></span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:9pt;color:#a31515;font-family:'Courier New';">add</span><span style="font-size:9pt;color:blue;font-family:'Courier New';"> </span><span style="font-size:9pt;color:red;font-family:'Courier New';">name</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:9pt;font-family:'Courier New';">&#8220;<span style="color:blue;">System.Workflow.Runtime</span>&#8220;<span style="color:blue;"> </span><span style="color:red;">value</span><span style="color:blue;">=</span>&#8220;<span style="color:blue;">All</span>&#8220;<span style="color:blue;"> /&gt;</span></span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:9pt;color:#a31515;font-family:'Courier New';">add</span><span style="font-size:9pt;color:blue;font-family:'Courier New';"> </span><span style="font-size:9pt;color:red;font-family:'Courier New';">name</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:9pt;font-family:'Courier New';">&#8220;<span style="color:blue;">System.Workflow.Runtime.Tracking</span>&#8220;<span style="color:blue;"> </span><span style="color:red;">value</span><span style="color:blue;">=</span>&#8220;<span style="color:blue;">All</span>&#8220;<span style="color:blue;"> /&gt;</span></span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:9pt;color:#a31515;font-family:'Courier New';">add</span><span style="font-size:9pt;color:blue;font-family:'Courier New';"> </span><span style="font-size:9pt;color:red;font-family:'Courier New';">name</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:9pt;font-family:'Courier New';">&#8220;<span style="color:blue;">System.Workflow.Activities</span>&#8220;<span style="color:blue;"> </span><span style="color:red;">value</span><span style="color:blue;">=</span>&#8220;<span style="color:blue;">All</span>&#8220;<span style="color:blue;"> /&gt;</span></span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/</span><span style="font-size:9pt;color:#a31515;font-family:'Courier New';">switches</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:9pt;color:#a31515;font-family:'Courier New';">trace</span><span style="font-size:9pt;color:blue;font-family:'Courier New';"> </span><span style="font-size:9pt;color:red;font-family:'Courier New';">autoflush</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:9pt;font-family:'Courier New';">&#8220;<span style="color:blue;">true</span>&#8220;<span style="color:blue;"> </span><span style="color:red;">indentsize</span><span style="color:blue;">=</span>&#8220;<span style="color:blue;">4</span>&#8220;<span style="color:blue;">&gt;</span></span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:9pt;color:#a31515;font-family:'Courier New';">listeners</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:9pt;color:#a31515;font-family:'Courier New';">add</span><span style="font-size:9pt;color:blue;font-family:'Courier New';"> </span><span style="font-size:9pt;color:red;font-family:'Courier New';">name</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:9pt;font-family:'Courier New';">&#8220;<span style="color:blue;">customListener</span>&#8220;</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;</span></span><span style="font-size:9pt;color:red;font-family:'Courier New';">type</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:9pt;font-family:'Courier New';">&#8220;<span style="color:blue;">System.Diagnostics.TextWriterTraceListener</span>&#8220;</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;</span></span><span style="font-size:9pt;color:red;font-family:'Courier New';">initializeData</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:9pt;font-family:'Courier New';">&#8220;<span style="color:blue;">WFTrace.log</span>&#8220;<span style="color:blue;"> /&gt;</span></span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/</span><span style="font-size:9pt;color:#a31515;font-family:'Courier New';">listeners</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/</span><span style="font-size:9pt;color:#a31515;font-family:'Courier New';">trace</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';">&lt;/</span><span style="font-size:9pt;color:#a31515;font-family:'Courier New';">system.diagnostics</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">&gt;</span><span style="font-size:9pt;font-family:'Courier New';"></span></p>
</div>
<p style="margin:0;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p style="margin:0;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p style="margin:0;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">Additionally, we can use stsadm to capture the trace messages from Workflow Infrstructure as shown below:</span></p>
<p style="margin:0;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<div style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;background:#daeef3;margin-left:31.5pt;border-left:windowtext 1pt solid;margin-right:0;border-bottom:windowtext 1pt solid;padding:1pt 4pt;">
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">@echo off</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">set SPAdminTool=%CommonProgramFiles%\Microsoft Shared\web server extensions\12\BIN\stsadm.exe</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">&nbsp;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">rem echo Logging levels before&#8230;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">rem &#8220;%SPAdminTool%&#8221; -o listlogginglevels</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">&nbsp;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">echo Setting levels&#8230;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">stsadm -o setlogginglevel -category &#8220;Workflow Features;Workflow Infrastructure&#8221; -tracelevel Verbose -windowslogginglevel Error</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">&nbsp;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">echo Restarting SPTrace service&#8230;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">net stop sptrace</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">net start sptrace</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">&nbsp;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">rem echo Logging levels after&#8230;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">rem &#8220;%SPAdminTool%&#8221; -o listlogginglevels</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">&nbsp;</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">pause </span></p>
</div>
<p style="margin:0;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p style="margin:0;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p style="margin:0;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<h3><a name="ii">[2] </a>Adding custom status message</h3>
<p style="margin:0;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p class="MsoListParagraph" style="text-indent:-.25in;"><span><span>1.<span style="font:7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>Add a custom status in workflow.xml<span></span></p>
<div style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;background:#daeef3;margin-left:.5in;border-left:windowtext 1pt solid;margin-right:0;border-bottom:windowtext 1pt solid;padding:1pt 4pt;">
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';">&lt;</span><span style="font-size:9pt;color:#a31515;font-family:'Courier New';">ExtendedStatusColumnValues</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:9pt;color:#a31515;font-family:'Courier New';">StatusColumnValue</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size:9pt;font-family:'Courier New';">Failed to start due to insufficient permissions</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">StatusColumnValue</span><span style="color:blue;">&gt;</span></span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';">&lt;/</span><span style="font-size:9pt;color:#a31515;font-family:'Courier New';">ExtendedStatusColumnValues</span><span style="font-size:9pt;color:blue;font-family:'Courier New';">&gt;</span><span style="font-size:9pt;font-family:'Courier New';">&nbsp;</span></p>
</div>
<p class="MsoListParagraphCxSpFirst"><span style="font-size:9pt;line-height:115%;font-family:'Courier New';">&nbsp;</span></p>
<p class="MsoListParagraphCxSpLast" style="text-indent:-.25in;"><span><span>2.<span style="font:7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span>Add the following code for the invoking method </p>
<div style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;background:#daeef3;margin-left:.5in;border-left:windowtext 1pt solid;margin-right:0;border-bottom:windowtext 1pt solid;padding:1pt 4pt;">
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span>&nbsp;</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">private</span><span style="font-size:10pt;font-family:'Courier New';"> <span style="color:blue;">void</span> setState1_MethodInvoking(<span style="color:blue;">object</span> sender, <span style="color:#2b91af;">EventArgs</span> e)</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:10pt;font-family:'Courier New';">{</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:10pt;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>((Microsoft.SharePoint.WorkflowActions.</span><span style="font-size:9pt;color:#2b91af;font-family:'Courier New';">SetState</span><span style="font-size:10pt;font-family:'Courier New';">)sender).State = ((<span style="color:#2b91af;">Int32</span>)SPWorkflowStatus.Max);</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:10pt;font-family:'Courier New';">}</span><span style="font-size:11pt;font-family:Calibri,sans-serif;"></span></p>
</div>
<p style="margin:0;"><span style="font-family:consolas;">&nbsp;</span></p>
<h3><span style="font-family:consolas;">&nbsp;</span><a name="iii">[3] </a>Code to extract the persisted workflow state</h3>
<p style="margin:0;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p style="margin:0;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">Since the workflow runtime is finicky about changes such as adding private variables, it is useful to dump the persisted state.</span></p>
<p style="margin:0;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<div style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;background:#daeef3;margin-left:.5in;border-left:windowtext 1pt solid;margin-right:0;border-bottom:windowtext 1pt solid;padding:1pt 4pt;">
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">System.Data.SqlClient.<span style="color:#2b91af;">SqlCommand</span> cmd = <span style="color:blue;">new</span> System.Data.SqlClient.<span style="color:#2b91af;">SqlCommand</span>(</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:#a31515;">&#8220;select InstanceData from dbo.workflow<span>&nbsp; </span>where<span>&nbsp; </span>InstanceDataSize &gt; 0&#8243;</span>);</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">System.Data.SqlClient.<span style="color:#2b91af;">SqlConnection</span> conn = <span style="color:blue;">new</span> System.Data.SqlClient.<span style="color:#2b91af;">SqlConnection</span>(</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:#a31515;">&#8220;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=WSS_Content_Portal;Data Source=CTSDEV1&#8243;</span>);</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">conn.Open();</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">cmd.Connection = conn;</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;color:blue;font-family:'Courier New';">byte</span><span style="font-size:9pt;font-family:'Courier New';">[] image = (<span style="color:blue;">byte</span>[])cmd.ExecuteScalar();</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">System.IO.<span style="color:#2b91af;">FileStream</span> fs = <span style="color:blue;">new</span> System.IO.<span style="color:#2b91af;">FileStream</span>(<span style="color:#a31515;">@&#8221;c:\data.gz&#8221;</span>, System.IO.<span style="color:#2b91af;">FileMode</span>.CreateNew);</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">fs.Write(image, 0, image.Length);</span></p>
<p class="MsoNormal" style="border-right:medium none;border-top:medium none;background:#daeef3;margin-bottom:0;border-left:medium none;line-height:normal;border-bottom:medium none;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">fs.Flush();</span></p>
<p style="border-right:medium none;border-top:medium none;background:#daeef3;border-left:medium none;border-bottom:medium none;margin:0;padding:0;"><span style="font-size:9pt;font-family:'Courier New';">fs.Close();</span><span style="font-size:9pt;font-family:'Courier New';">&nbsp;</span></p>
</div>
<p style="margin:0;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p style="margin:0;"><span style="font-family:consolas;">&nbsp;</span></p>
<p style="margin:0;">&nbsp;</p>
<p style="margin:0;"><span style="font-size:11pt;font-family:Calibri,sans-serif;">&nbsp;</span></p>
<p class="MsoNormal">&nbsp;</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/vlele.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/vlele.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/vlele.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/vlele.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/vlele.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/vlele.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/vlele.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/vlele.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/vlele.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/vlele.wordpress.com/94/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=94&subd=vlele&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://vlele.wordpress.com/2009/05/05/debugging-sharepoint-workflows/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ae43c20c0f5d552cd08ced6c49931722?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">vlele</media:title>
		</media:content>

		<media:content url="http://vlele.files.wordpress.com/2009/05/clip-image002-thumb.jpg" medium="image">
			<media:title type="html">clip_image002</media:title>
		</media:content>

		<media:content url="http://vlele.files.wordpress.com/2009/05/clip-image004-thumb.jpg" medium="image">
			<media:title type="html">clip_image004</media:title>
		</media:content>

		<media:content url="http://vlele.files.wordpress.com/2009/05/clip-image005-thumb.jpg" medium="image">
			<media:title type="html">clip_image005</media:title>
		</media:content>
	</item>
		<item>
		<title>SDS and Relational Model</title>
		<link>http://vlele.wordpress.com/2009/04/06/sds-and-relational-model/</link>
		<comments>http://vlele.wordpress.com/2009/04/06/sds-and-relational-model/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 02:41:44 +0000</pubDate>
		<dc:creator>vlele</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://vlele.wordpress.com/2009/04/06/sds-and-relational-model/</guid>
		<description><![CDATA[I read Andrew&#8217;s column on support for the relational capability within SDS. While it is great to have &#8220;change the conn string to move to cloud&#8221; capability, I think it is useful to understand how the relational model is enabled by SDS.&#160; Additionally, in my opinion, it will be also be important to understand how [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=87&subd=vlele&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I read Andrew&#8217;s <a href="http://visualstudiomagazine.com/columns/article.aspx?editorialsid=3048">column</a> on support for the relational capability within SDS. While it is great to have &#8220;change the conn string to move to cloud&#8221; capability, I think it is useful to understand how the relational model is enabled by SDS.&nbsp; Additionally, in my opinion, it will be also be important to understand how the entity based storage (offered via Azure Storage) can be leveraged when designing applications for the cloud.</p>
<p>&nbsp;</p>
<p>The architecture of the data fabric, that powers SDS, is a node based, scale-out architecture. Let us go over some of the core concepts of the data fabric :</p>
<ul>
<ul>
<li>Storage Unit &#8211; Basic unit of storage that supports the CRUD operations. Example &#8211; database row.</li>
<li>Consistency Unit &#8211; Set of storage units that can be queried and updated in a consistent manner. Example &#8211; A set of rows with the same partition keys or even an entire database instance.</li>
<li>Failover Unit &#8211; Group of consistency units that are guaranteed to be available. SDS replicates the failover units to a replica set to ensure that data is always available.</li>
</ul>
</ul>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://vlele.files.wordpress.com/2009/04/image.png"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" height="350" alt="image" src="http://vlele.files.wordpress.com/2009/04/image-thumb.png?w=640&#038;h=350" width="640" border="0"></a> </p>
<p>&nbsp;</p>
<p>Here are some things to consider when using the SDS relational model (this is <em>based on my limited understanding, of course. I urge you to view Gopal&#8217;s excellent </em><a href="http://channel9.msdn.com/pdc2008/BB03/"><em>Under the Hood talk</em></a><em> for additional details</em>)</p>
<ul>
<ul>
<li>Consistency is guaranteed inside a single node or consistency unit. This means that if your entire on-premises database instance can fit into one consistency unit, you are OK.&nbsp; But on the other hand, if you are going to exceed it, you will need to think about partitioning your relational model &#8211; <em>Until the time Microsoft adds auto-partitioning functionality on top of the relational model. </em>Note that there is no support for transactions that span across consistency units.</li>
<li>Data fabric uses dynamic partitioning to improve performance&nbsp; i.e. it can move a consistency unit around to spread the load evenly across the cluster of nodes. A single fail-over unit is designed to host one more storage units vs. dedicating the entire fail-over unit to a single consistency unit. This is because a) it easy to re-balance the load by moving the &#8220;smaller&#8221; consistency units around b) easier/faster to recreate a failed node. When you move the your entire relational DB instance to the cloud as a single consistency unit, chances are that data fabric will need to dedicate the entire fail-over unit to it (to improve performance). This can limit some of the benefits of dynamic data partitioning. </li>
<li>Bear in mind that the data fabric is based on scale-out using commodity hardware (typically 1.5 to 1.7 GHz X64 and 1.7 GB of memory &#8211; this is based on Chuck Lenzmeier&#8217;s <a href="http://channel9.msdn.com/pdc2008/ES19/">talk</a> at the PDC and obviously subject to change). </li>
<li>Consider the additional latency cost due to the fact that writes are propagated to a quorum of a replicas. </li>
</ul>
</ul>
<p>&nbsp;</p>
<p> As stated earlier, it might be worthwhile to consider the entity based storage offered by the Azure Storage, for the following reasons: </p>
<ul>
<li>If you need flexible schema or are building analysis focused applications &#8211; an entity based storage may be more suitable. </li>
<li>Entity based storage forces you to think about partitioning from ground up. This allows for almost linear scaling as additional nodes are added to the mix.&nbsp; </li>
<li>Single index (Partition Key + Row Key )may seem limiting but there are number of ways of get around this including dynamically adjusting the partition key, storing multiple types of entities inside a single table so we can partition the data&nbsp; using <em>partition key&nbsp; + entityType</em>. </li>
</ul>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/vlele.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/vlele.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/vlele.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/vlele.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/vlele.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/vlele.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/vlele.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/vlele.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/vlele.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/vlele.wordpress.com/87/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=87&subd=vlele&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://vlele.wordpress.com/2009/04/06/sds-and-relational-model/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ae43c20c0f5d552cd08ced6c49931722?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">vlele</media:title>
		</media:content>

		<media:content url="http://vlele.files.wordpress.com/2009/04/image-thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>WCF WSS4J Interop</title>
		<link>http://vlele.wordpress.com/2009/04/05/wcf-wss4j-interop/</link>
		<comments>http://vlele.wordpress.com/2009/04/05/wcf-wss4j-interop/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 14:32:51 +0000</pubDate>
		<dc:creator>vlele</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://vlele.wordpress.com/2009/04/05/wcf-wss4j-interop/</guid>
		<description><![CDATA[Recently I had to work on an interop scenario where WCF client needed to call a WSS4J service. After a bit of experimentation, I came up with the following configuration.
Here are some of the key settings to note:
Authentication Mode&#160; MutualCertificate
Message Protection Order&#160; SignBeforeEncrypt
SOAP Version&#160; 1.1
Algorithm Basic128Rsa15 
Message Security Version&#160; WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10
&#160;
&#60;?xml version=&#8220;1.0&#8220; encoding=&#8220;utf-8&#8220; ?&#62;
&#60;configuration&#62;
&#160;&#160;&#160; &#60;system.serviceModel&#62;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;client&#62;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=84&subd=vlele&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';">Recently I had to work on an interop scenario where WCF client needed to call a WSS4J service. After a bit of experimentation, I came up with the following configuration.</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';">Here are some of the key settings to note:</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><u>Authentication Mode</u>&nbsp; MutualCertificate</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><u>Message Protection Order</u>&nbsp; SignBeforeEncrypt</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><u>SOAP Version</u>&nbsp; 1.1</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><u>Algorithm</u> Basic128Rsa15 </span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><u>Message Security Version</u>&nbsp; <span style="color:blue;">WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10</span></span></p>
<p class="MsoNormal"><font face="Courier New" color="#0000ff" size="2">&nbsp;</font></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';">&lt;?</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">xml</span><span style="font-size:10pt;color:blue;font-family:'Courier New';"> </span><span style="font-size:10pt;color:red;font-family:'Courier New';">version</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:10pt;font-family:'Courier New';">&#8220;<span style="color:blue;">1.0</span>&#8220;<span style="color:blue;"> </span><span style="color:red;">encoding</span><span style="color:blue;">=</span>&#8220;<span style="color:blue;">utf-8</span>&#8220;<span style="color:blue;"> ?&gt;</span></span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';">&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">configuration</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">system.serviceModel</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">client</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">endpoint</span><span style="font-size:10pt;color:blue;font-family:'Courier New';"> </span><span style="font-size:10pt;color:red;font-family:'Courier New';">address</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:10pt;font-family:'Courier New';">&#8220;<span style="color:blue;"><a href="http://gp64156.exampleCorp.net:8080/eservices/aService"><span>http://gp64156.exampleCorp.net:8080/eservices/aService</span></a></span>&#8220;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size:10pt;color:red;font-family:'Courier New';">behaviorConfiguration</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:10pt;font-family:'Courier New';">&#8220;<span style="color:blue;">ClientCertBehavior</span>&#8220;<span style="color:blue;"> </span><span style="color:red;">binding</span><span style="color:blue;">=</span>&#8220;<span style="color:blue;">customBinding</span>&#8220;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size:10pt;color:red;font-family:'Courier New';">bindingConfiguration</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:10pt;font-family:'Courier New';">&#8220;<span style="color:blue;">JavaInterop</span>&#8220;<span style="color:blue;"> </span><span style="color:red;">contract</span><span style="color:blue;">=</span>&#8220;<span style="color:blue;">exampleCorp.Proxy.aProfileManager</span>&#8220;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size:10pt;color:red;font-family:'Courier New';">name</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:10pt;font-family:'Courier New';">&#8220;<span style="color:blue;">UserProfileManager</span>&#8220;<span style="color:blue;">&gt;</span></span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">identity</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">dns</span><span style="font-size:10pt;color:blue;font-family:'Courier New';"> </span><span style="font-size:10pt;color:red;font-family:'Courier New';">value</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:10pt;font-family:'Courier New';">&#8220;<span style="color:blue;">userprofilews</span>&#8220;<span style="color:blue;"> /&gt;</span></span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">identity</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">endpoint</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">client</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';">&nbsp;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">bindings</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">customBinding</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">binding</span><span style="font-size:10pt;color:blue;font-family:'Courier New';"> </span><span style="font-size:10pt;color:red;font-family:'Courier New';">name</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:10pt;font-family:'Courier New';">&#8220;<span style="color:blue;">JavaInterop</span>&#8220;<span style="color:blue;">&gt;</span></span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">security</span><span style="font-size:10pt;color:blue;font-family:'Courier New';"> </span><span style="font-size:10pt;color:red;font-family:'Courier New';">defaultAlgorithmSuite</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:10pt;font-family:'Courier New';">&#8220;<span style="color:blue;">Basic128Rsa15</span>&#8220;<span style="color:blue;"> </span><span style="color:red;">allowSerializedSigningTokenOnReply</span><span style="color:blue;">=</span>&#8220;<span style="color:blue;">true</span>&#8220;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size:10pt;color:red;font-family:'Courier New';">authenticationMode</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:10pt;font-family:'Courier New';">&#8220;<span style="color:blue;">MutualCertificate</span>&#8220;<span style="color:blue;"> </span><span style="color:red;">requireDerivedKeys</span><span style="color:blue;">=</span>&#8220;<span style="color:blue;">false</span>&#8220;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size:10pt;color:red;font-family:'Courier New';">securityHeaderLayout</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:10pt;font-family:'Courier New';">&#8220;<span style="color:blue;">Lax</span>&#8220;<span style="color:blue;"> </span><span style="color:red;">includeTimestamp</span><span style="color:blue;">=</span>&#8220;<span style="color:blue;">false</span>&#8220;<span style="color:blue;"> </span><span style="color:red;">messageProtectionOrder</span><span style="color:blue;">=</span>&#8220;<span style="color:blue;">SignBeforeEncrypt</span>&#8220;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size:10pt;color:red;font-family:'Courier New';">messageSecurityVersion</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:10pt;font-family:'Courier New';">&#8220;<span style="color:blue;">WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10</span>&#8220;<span style="color:blue;">&gt;</span></span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">localClientSettings</span><span style="font-size:10pt;color:blue;font-family:'Courier New';"> </span><span style="font-size:10pt;color:red;font-family:'Courier New';">detectReplays</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:10pt;font-family:'Courier New';">&#8220;<span style="color:blue;">false</span>&#8220;<span style="color:blue;"> /&gt;</span></span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">security</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">textMessageEncoding</span><span style="font-size:10pt;color:blue;font-family:'Courier New';"> </span><span style="font-size:10pt;color:red;font-family:'Courier New';">messageVersion</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:10pt;font-family:'Courier New';">&#8220;<span style="color:blue;">Soap11</span>&#8220;<span style="color:blue;"> /&gt;</span></span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">httpTransport</span><span style="font-size:10pt;color:blue;font-family:'Courier New';"> /&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">binding</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">customBinding</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">bindings</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';">&nbsp;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">behaviors</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">endpointBehaviors</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">behavior</span><span style="font-size:10pt;color:blue;font-family:'Courier New';"> </span><span style="font-size:10pt;color:red;font-family:'Courier New';">name</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:10pt;font-family:'Courier New';">&#8220;<span style="color:blue;">ClientCertBehavior</span>&#8220;<span style="color:blue;">&gt;</span></span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">clientCredentials</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">clientCertificate</span><span style="font-size:10pt;color:blue;font-family:'Courier New';"> </span><span style="font-size:10pt;color:red;font-family:'Courier New';">findValue</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:10pt;font-family:'Courier New';">&#8220;<span style="color:blue;">CN=client.com</span>&#8220;<span style="color:blue;"> /&gt;</span></span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">serviceCertificate</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">defaultCertificate</span><span style="font-size:10pt;color:blue;font-family:'Courier New';"> </span><span style="font-size:10pt;color:red;font-family:'Courier New';">findValue</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:10pt;font-family:'Courier New';">&#8220;<span style="color:blue;">userprofilews</span>&#8220;<span style="color:blue;"> </span><span style="color:red;">storeLocation</span><span style="color:blue;">=</span>&#8220;<span style="color:blue;">LocalMachine</span>&#8220;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size:10pt;color:red;font-family:'Courier New';">storeName</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">=</span><span style="font-size:10pt;font-family:'Courier New';">&#8220;<span style="color:blue;">TrustedPeople</span>&#8220;<span style="color:blue;"> </span><span style="color:red;">x509FindType</span><span style="color:blue;">=</span>&#8220;<span style="color:blue;">FindByIssuerName</span>&#8220;<span style="color:blue;"> /&gt;</span></span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">serviceCertificate</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">clientCredentials</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">behavior</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">endpointBehaviors</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">behaviors</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';"><span>&nbsp;&nbsp;&nbsp; </span>&lt;/</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">system.serviceModel</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
<p class="MsoNormal"><span style="font-size:10pt;color:blue;font-family:'Courier New';">&lt;/</span><span style="font-size:10pt;color:#a31515;font-family:'Courier New';">configuration</span><span style="font-size:10pt;color:blue;font-family:'Courier New';">&gt;</span></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/vlele.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/vlele.wordpress.com/84/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/vlele.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/vlele.wordpress.com/84/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/vlele.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/vlele.wordpress.com/84/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/vlele.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/vlele.wordpress.com/84/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/vlele.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/vlele.wordpress.com/84/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=84&subd=vlele&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://vlele.wordpress.com/2009/04/05/wcf-wss4j-interop/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ae43c20c0f5d552cd08ced6c49931722?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">vlele</media:title>
		</media:content>
	</item>
		<item>
		<title>Reporting on MOSS Data</title>
		<link>http://vlele.wordpress.com/2008/11/25/reporting-on-moss-data/</link>
		<comments>http://vlele.wordpress.com/2008/11/25/reporting-on-moss-data/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 18:13:22 +0000</pubDate>
		<dc:creator>vlele</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://vlele.wordpress.com/2008/11/25/reporting-on-moss-data/</guid>
		<description><![CDATA[&#160;
Generating reports based on the data contained within SharePoint lists is a common requirement for many projects, and yet, there is no easy or direct way to realize this functionality. Fortunately, extensibility options provided by MOSS and SQL Server Reporting Services (SSRS) can help. This post briefly discusses the various approaches for generating reports on [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=83&subd=vlele&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h3>&nbsp;</h3>
<p>Generating reports based on the data contained within SharePoint lists is a common requirement for many projects, and yet, there is no easy or direct way to realize this functionality. Fortunately, extensibility options provided by MOSS and SQL Server Reporting Services (SSRS) can help. This post briefly discusses the various approaches for generating reports on MOSS based data.<br />
<h4>SharePoint Storage Basics</h4>
<p>Sharepoint provides an abstraction around the underlying data storage (aka Content DB) wherein users don&#8217;t interface directly with the content database. Instead, the users work with lists and SharePoint in turn, stores the information appropriately inside the content DB.
<p>To be able to support various lists (lists with varying content types), SharePoint utilizes the universal pattern &#8211; where a single database table is used to capture information stored in different lists. A universal table (the userdata view inside the content DB) contains generic columns such as int1, int2, varchar1, varchar2, etc. that are mapped to the fields in a list. The mapping between fields and universal table columns is maintained inside the lists view as shown below.
<p>Here is an example of a field (Title) that is based on an existing site column
<p>&lt;FieldRef Name=&#8221;Title&#8221; ColName=&#8221;nvarchar1&#8243;/&gt;
<p>Here is an example of a field (Address) that is defined as part of a list
<p>&lt;Field Type=&#8221;Text&#8221; DisplayName=&#8221;Address&#8221; Required=&#8221;FALSE&#8221; MaxLength=&#8221;255&#8243; ID=&#8221;{76958f23-d514-4d2a-bb16-373429eb6569}&#8221; SourceID=&#8221;{45581111-aa7e-4567-9a03-684a7ef051e8}&#8221; StaticName=&#8221;Address&#8221; Name=&#8221;Address&#8221; ColName=&#8221;nvarchar3&#8243; RowOrdinal=&#8221;0&#8243;/&gt;
<p>The universal table implementation in SharePoint goes a step further, it allows fields to span across multiple rows, if needed e.g. if a custom list has more integer columns than the 16 that are available in a single row.
<p>As you can imagine, the universal pattern is really convenient from a manageability perspective. An alternative design would be to provision a new table for each list or content type. Unfortunately the downside of the universal pattern is pretty obvious as well. For example, SQL Server will lock multiple rows of a list (or folders within a list) even when a single list item is being updated. In an extreme case, the entire table may be locked leading to single-threaded access.
<p>The other obvious disadvantage is the limited ability to tune the performance, for example optimizing the index. With WSS 3.0, we now have the ability to mark a single field within a list as an &#8220;indexed&#8221; field. Indexed field can lead to significant gains in performance as long as they are used in the where clause of the query.
<p>While it is useful to look under the covers to understand the structure content db, Microsoft does not want users to have any dependencies to the underlying tables (for good reason – the underlying storage format is subject to change without notice!). Instead, they provide a number of different object model (OM) based access schemes to safely access this data. These include
<p>1) Search OM &#8211; Allows executing queries against the search engine
<p>2) Query OM &#8211; Allows executing CAML queries using classes such as SPQuery amd SPSiteData QueryThis comes in two flavors &#8211; class library and web service based OM.
<p>The White Paper in reference [1] below discusses all the OM options and how they perform under load. I recommend reading this paper in its entirety. In a nutshell, SPQuery using indexed column is the best option in terms of performance. This paper also talks about using PortalSiteMapProvider based scheme that uses caching to improve performance. I am ignoring this option for the purposes of this discussion as it does not fit the reporting needs very well.<br />
<h4>When to use Content DB as custom application data storage</h4>
<p>It should be clear from the previous section that the universal table is not designed to be:
<p><b>High performing -</b> Because of the limited indexing and locking options it is not designed for a high throughput OLTP style access.
<p><b>Tunable</b> &#8211; Schemes such as partitioning to split very large lists are not available. There is also no ability to tune the default SQL (use custom SPs etc) used by the system.
<p><b>Aggregation </b>- No ability to aggregate, group information from multiple lists close to the source of data (CAML based aggregation across lists takes place at the application tier which is much more expensive)
<p>So if your application truly requires the above traits, the best option is to store data outside the content DB and use one of the several schemes (webparts, _layout, ASPX based content pages to surface your application within SharePoint.
<p>On the other hand, if you are building an application with modest sizing requirements you can take advantage of the abstraction provided by SharePoint and thus avoid the need for any custom data access code. As an example, we built an invoicing system entirely based on the content DB. Invoices were &#8220;split&#8221; across site collections to allow the solution to scale-out (as opposed to a scale-up approach)<br />
<h4>Generating Reports based on SharePoint Data</h4>
<p>Whether you store application data inside the content db or not, there is almost always a requirement to generate reports based on the metadata associated with the document stored in SharePoint. Before we look into various reporting options, let us briefly look at some of the key characteristics of a reporting technology such as SQL Server Reporting Services (SSRS) SSRS can be broken up into three parts (as shown in the figure below)
<p>1) <b>Designer</b> -used to create a report layout
<p>2) <b>Processor</b> &#8211; binds report data to the layout
<p>3) <b>Connectivity</b> &#8211; to a data source
<p>It is easy to see that the ability to scale reports reporting generation is dependent on how fast the report data source can return the requested data. Relational databases (RDBs) with their innate ability to process set-based operations are obviously very good at this. RDBs are also very good at grouping, sorting and filtering; other common reporting requirements.
<p>SQL Server Reporting Services (SSRS), like many other reporting tools, supports connectivity to various data sources out of the box, including SQL Server, DB2, and Oracle. Again, similar to other reporting tools, SSRS allows custom data sources e.g. Active Directory, Disconnected DataSets etc., to act as the source for report data. The only requirement is that the custom data source support a forward-only stream based access to data.
<p>The other key aspect of reporting is the ease of use in creating a report layout. Designers such as the one included with SSRS make it easy to support report layouts such as cross-tab reports, nested reports etc.
<p>Finally, reporting tools exhibit many advanced capabilities such a caching, slicing (ability to support multiple reports via a single &#8220;super&#8221; dataset), scheduled report generation, delivery (PDF, Excel, Word etc.) and dynamic reports.<br />
<h4>Reporting Options</h4>
<p>Let us now look at some different options for generating reports on the SharePoint content metadata<br />
<h5>Built-in and custom WebParts </h5>
<p>If you are trying to generate a simple report (aggregated task list) based on a single list , it might be sufficient to use one of built-in webparts (for example Content Query Web part &#8211; see Reference [2] for detailed instructions).
<p>The key advantage of this approach is that security trimming takes place automatically. Another advantage is that the report is always generated on data that is current. The downside is that manual work is required to create the layout (no report designer type tool is available). Any advanced functionality such as master-detail or nesting requires additional custom coding. Finally, unless a caching scheme is used, each view of the report causes the query to be computed again imposing additional load on the system.<br />
<h5>Entity Framework </h5>
<p>The ADO.NET Entity Framework is part of VS .NET 2008 SP1. The ADO.NET Entity Framework provides a level of abstraction over a data source. The ADO.NET Entity Framework is based on the Entity Data Model (EDM). Basically the EDM allows users to model the database like the way they designed the database in the first place, probably with an Entity-Relational (ER) diagram. This level of abstraction is important because as more and more application information is being maintained in the database, the relational schema more frequently gets modified for performance and normalization. Those changes can affect the data access code in the application. For example, a product table may become a join across a few tables, but as a programmer I only really only care about what the application defines as a Product entity.
<p>So why is EDM important? It is expected that future version of SSRS works natively with the EDM. Using the EDM we could model a SharePoint list and then use SSRS to generate reports.
<p>The key advantage is that this scheme is that it allows us native, yet safe, access to the SharePoint tables. This is because EDM acts as a firewall between the underlying SharePoint content DB structure and Entity-SQL based queries. If the structure of content DB changes at some point, all we need to do is change the EDM. The Entity-SQL queries are not impacted.
<p>Native access to data stored in content DB means zero latency as well as full fidelity access to item level security.
<p>The downside of this approach is that EDM model needs to be manually defined. The other down side is that tuning options are still not available.<br />
<h5>Data Extraction Service and Operational Data Store</h5>
<p>Another reporting option is to develop a Data Extraction Service (DES) shared service similar to BDC, except this DES would export the information stored inside SharePoint out to an operation data store (ODS). DES is a generic scheme that works across various list types without the need to develop list specific custom code. It is envisioned that users will upload a BDC style XML configuration. DES will then use the configuration file to export data to an external data source on a scheduled basis. To make the transfer as efficient as possible, only differential updates will be carried over.
<p>Security (like the BDC) will be applied at the entity level and not at the SharePoint item.
<p>This scheme offers the most scalability and flexibility. Once the data is available inside ODS, any SSRS technique can be applied. All the tuning and optimization options provided by SQL Server are available as well. Further, the SharePoint performance is not impacted by reporting (although there will be cost associated with running the DES service for extracting the data from SharePoint into the ODS)
<p>The downside of this approach is the latency of data and effort required to generate the DES metadata.
<p>If this scheme seems useful, we could invest in a tool that generates the DES metadata (similar to the BDC metadata generation tools available in the market today)<br />
<h5>Reporting Services Data Extension</h5>
<p>SSRS supports a modular architecture designed for extensibility. One such extensibility option is the data processing extension which allows SSRS to connect to data sources and retrieve data.
<p>We have two options here:
<p>1) Develop a custom data extension ourselves, by wrapping the SharePoint Web Service based API. Alternatively, we could have a custom web service return a dataset. SSRS 2005 has the ability to consume a dataset directly. The latter is a bit easier because we don’t have to implement all the data extension ourselves, although the report design experience is not rich as provided by data processing extension.
<p>2) Use a commercial data extension such as the one provided by Enesys. Enesys data extension makes it possible to use SharePoint (MOSS 2007 &amp; WSS V3) lists data for building reports with Microsoft SQL Server 2005 Reporting Services &#8211; a custom XML query (with portions of CAML) can be directly embedded into the RDL.
<p>The biggest upside of this approach is that it allows the richness of the SSRS designer to be leveraged.
<p>On the downside, Enesys RS uses SharePoint Web Service OM to extract information from the content DB and is thus subjected to the inherent performance limitations of CAML.<br />
<h4>References </h4>
<p>[1] White Paper: Working with large lists in Office SharePoint® Server 2007, Steve Peschka, Microsoft: <a href="http://technet.microsoft.com/en-us/library/cc262813.aspx">http://technet.microsoft.com/en-us/library/cc262813.aspx</a>
<p>[2] Data Processing Extensions Overview, SQL Server 2008 Books Online, Microsoft,<br /><a href="http://msdn2.microsoft.com/en-us/library/ms152816.aspx?s=11">http://msdn2.microsoft.com/en-us/library/ms152816.aspx?s=11</a>
<p>[3] How to: Customize the Content Query Web Part by using Custom Properties, Microsoft,<br /><a href="http://msdn2.microsoft.com/en-us/library/aa981241.aspx">http://msdn2.microsoft.com/en-us/library/aa981241.aspx</a>
<p>[4] Enesys RS Data Extension<br /><a href="http://www.enesyssoftware.com/Products/EnesysRSDataExtension/Features/tabid/73/language/en-US/Default.aspx">http://www.enesyssoftware.com/Products/EnesysRSDataExtension/Features/tabid/73/language/en-US/Default.aspx</a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/vlele.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/vlele.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/vlele.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/vlele.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/vlele.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/vlele.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/vlele.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/vlele.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/vlele.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/vlele.wordpress.com/83/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=83&subd=vlele&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://vlele.wordpress.com/2008/11/25/reporting-on-moss-data/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ae43c20c0f5d552cd08ced6c49931722?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">vlele</media:title>
		</media:content>
	</item>
		<item>
		<title>MOSS as an Application Development Platform</title>
		<link>http://vlele.wordpress.com/2007/10/09/moss-as-an-application-development-platform/</link>
		<comments>http://vlele.wordpress.com/2007/10/09/moss-as-an-application-development-platform/#comments</comments>
		<pubDate>Tue, 09 Oct 2007 15:00:20 +0000</pubDate>
		<dc:creator>vlele</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://vlele.wordpress.com/2007/10/09/moss-as-an-application-development-platform/</guid>
		<description><![CDATA[&#xA0;
I recently recorded a DNR show on MOSS. During the session, a question about the benefit of using MOSS platform elements such as &#34;List&#34; came up. How can developers leverage these to build applications more productively. Let me try to answer this question with an example. Imagine that we are required to build a web [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=82&subd=vlele&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>&#xA0;</p>
<p>I recently recorded a DNR show on <a href="http://www.dotnetrocks.com/default.aspx?showNum=268">MOSS</a>. During the session, a question about the benefit of using MOSS platform elements such as &quot;List&quot; came up. How can developers leverage these to build applications more productively. Let me try to answer this question with an example. Imagine that we are required to build a web page that displays a list of webcast recordings. Users with administration permissions are allowed to upload new webcast recordings, and update (and delete) existing items in the list. Other users can only view existing items in the list. Further, we also have a UI requirement to customize the list rendering such that in addition to the name of the webcast and an icon (that allows users to initiate streaming), the list also allows users to download the associated presentation slide deck as well as view the description of the webcast.</p>
<p>One approach for implementing the above requirement would be to define a webcast content type that has fields that correspond to the columns described above. We can then associate the webcast content type with a SharePoint list. Using CAML (Collaborative Application Markup Language) we can customize the UI of the list to meet our requirements.</p>
<p>Note that we could have just created a list using site columns instead of defining a content type. The benefit of using a content type is that it is a reusable type that can be associated to other list instances. We can also create new content types that derive from webcast content type. SharePoint uses ASP.NET forms to allow users to insert and update list items. All data associated with the list is automatically stored in the content database. The Figure below depicts a custom webcast list.</p>
<p>&#xA0;</p>
<p><a href="http://vlele.files.wordpress.com/2007/10/clip-image001.gif"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" height="344" alt="clip_image001" src="http://vlele.files.wordpress.com/2007/10/clip-image001-thumb.gif?w=678&#038;h=344" width="678" border="0" /></a></p>
<p>While it may not seem difficult to add a list control on an ASP.NET page and hook-up some ADO.NET code to persist the data in the database, it should be noted that we have not written a single line of code thus far. We have relied on SharePoint list handling and content database to implement the list.</p>
<p>But imagine if we are required to extend the above functionality. For example, it is required that each item of the list be secured individually. Users also want to subscribe to any changes to the list (new recordings) made to the list either via RSS or email. From a QA standpoint, a content management process needs to be enforced when a new webcast recording is uploaded requiring versioning, check-in/check-out, and approval workflow. Content management requirement invariably necessitates the ability to maintain an audit trail of changes as well as the ability to undelete an item that was inadvertently deleted. Last but not the least, a search function on the site should include the information about the webcasts.</p>
<p>Now with the need for additional features, the custom ASP.NET solution is not easy. Fortunately, all of the above functions are provided by SharePoint List by default. We can even extend the SharePoint List behavior using event handlers.</p>
<p>All of the information stored inside a list is accessible, not only via the SharePoint UI, also via the Object Model (Class Library as well as Web Service based OM). This means that processes outside the host process can access the list information &#x2013; a key to building transparent applications that are reusable.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/vlele.wordpress.com/82/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/vlele.wordpress.com/82/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/vlele.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/vlele.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/vlele.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/vlele.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/vlele.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/vlele.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/vlele.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/vlele.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/vlele.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/vlele.wordpress.com/82/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=82&subd=vlele&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://vlele.wordpress.com/2007/10/09/moss-as-an-application-development-platform/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ae43c20c0f5d552cd08ced6c49931722?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">vlele</media:title>
		</media:content>

		<media:content url="http://vlele.files.wordpress.com/2007/10/clip-image001-thumb.gif" medium="image">
			<media:title type="html">clip_image001</media:title>
		</media:content>
	</item>
		<item>
		<title>WSS and Custom Authorization Provider</title>
		<link>http://vlele.wordpress.com/2007/10/09/wss-and-custom-authorization-provider/</link>
		<comments>http://vlele.wordpress.com/2007/10/09/wss-and-custom-authorization-provider/#comments</comments>
		<pubDate>Tue, 09 Oct 2007 14:54:36 +0000</pubDate>
		<dc:creator>vlele</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://vlele.wordpress.com/2007/10/09/wss-and-custom-authorization-provider/</guid>
		<description><![CDATA[As is well known by now, WSS 3.0 (and consequently MOSS) supports the ability to plug-in a custom role provider. So instead of being limited to the default AD based role provider, a custom store such as SQL database, can be used as the authorization store. As you can imagine, this gives you a lot [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=79&subd=vlele&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>As is well known by now, WSS 3.0 (and consequently MOSS) supports the ability to plug-in a custom role provider. So instead of being limited to the default AD based role provider, a custom store such as SQL database, can be used as the authorization store. As you can imagine, this gives you a lot flexibility in terms of storing and managing users. </p>
<p>Let us examine custom role provider in detail. But before we proceed, let us get a few core definitions out of the way. WSS defines the following core set of security related objects:</p>
<blockquote><p>o <i>SPUser </i>and <i>SPGroup</i> &#8211; <i>SPUser </i>represents a user, while <i>SPGroup</i> as the name suggests, represents a collection of users. WSS allows you to create custom groups.</p>
</blockquote>
<blockquote><p>o <i>SPBasePermission</i>, <i>SPRoleDefinition </i>and <i>SPRoleAssignment- SPBasePermission is right to perform a certain action within WSS. For example the right to insert list items. SPRoleDefinition is a collection of rights. For example, Contributor, Designer are built-in roles. Finally, SPRoleAssignment defines the assignment of roles for SPUser or SPGroup</i></p>
</blockquote>
<p>Irrespective of whether you use a custom authorization provider or not, WSS creates instances of above mentioned set of objects to manage security within WSS. For example, <i>SPRoleDefinition </i>object that we discussed above, relies on <i>SPUser </i>and <i>SPGroup </i>for role-to-permission mapping. </p>
<p>So how does custom provider help? Using a custom provider you can create roles and include them as part of <i>SPGroup </i>(much like you would include instances of <i>SPUser</i>). This is an important benefit as you grant access based on custom authorization rules, stored outside of WSS. </p>
<p>There is another important benefit enabled by custom role providers &#8211; Ability to manage authorization rules across site collections (<i>SPSiteCollection</i>). A <i>SPSiteCollection </i>is a security boundary within WSS. This means that <i>SPUsers </i>and <i>SPGroups </i>defined within one SPSiteCollection are not available to other <i>SPSiteCollection </i>instances. </p>
<p>A custom role, however, can span multiples site collections since the authorization provider is defined at the Web Application level (<i>SPWebApplication</i>). This way you can manage authorization across sites from one central administrative interface. On the contrary, if you only had to rely on <i>SPGroups </i>for authorization, you would have to create a separate <i>SPGroup </i>for each <em>SPSiteCollection</em> and develop a scheme to keep them synchronized. </p>
<p>I should add that AD groups can be used to achieve the same behavior as described above (I.e. ability to span <i>SPSiteCollections</i>). However, the way AD is administered in most organizations, WSS Site owners do not have the permissions to create and modify AD groups. </p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/vlele.wordpress.com/79/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/vlele.wordpress.com/79/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/vlele.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/vlele.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/vlele.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/vlele.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/vlele.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/vlele.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/vlele.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/vlele.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/vlele.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/vlele.wordpress.com/79/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vlele.wordpress.com&blog=271680&post=79&subd=vlele&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://vlele.wordpress.com/2007/10/09/wss-and-custom-authorization-provider/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ae43c20c0f5d552cd08ced6c49931722?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">vlele</media:title>
		</media:content>
	</item>
	</channel>
</rss>