<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://community.saasgrid.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">SaaSGrid Team</title><subtitle type="html" /><id>http://community.saasgrid.com/developers/b/team/atom.aspx</id><link rel="alternate" type="text/html" href="http://community.saasgrid.com/developers/b/team/" /><link rel="self" type="application/atom+xml" href="http://community.saasgrid.com/developers/b/team/atom.aspx" /><generator uri="http://telligent.com" version="5.5.133.9594">Community Server</generator><updated>2008-09-12T03:16:00Z</updated><entry><title>Using Windows Workflow Foundation in your SaaSGrid Application</title><link rel="alternate" type="text/html" href="/developers/b/team/archive/2009/10/09/using-windows-workflow-foundation-in-your-saasgrid-application.aspx" /><id>/developers/b/team/archive/2009/10/09/using-windows-workflow-foundation-in-your-saasgrid-application.aspx</id><published>2009-10-09T10:34:00Z</published><updated>2009-10-09T10:34:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;&lt;SPAN style="TEXT-ALIGN: center; WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Arial, Helvetica; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(51,51,51); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="TEXT-ALIGN: left; COLOR: rgb(128,128,128); FONT-SIZE: 13px" class=Apple-style-span&gt;This article was last updated on&amp;nbsp;November 6, 2009.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;SPAN style="TEXT-ALIGN: center; WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Arial, Helvetica; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(51,51,51); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span&gt;&lt;SPAN style="TEXT-ALIGN: left; COLOR: rgb(128,128,128); FONT-SIZE: 13px" class=Apple-style-span&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;Did you know that your SaaSGrid application can use Windows Workflow Foundation? SaaSGrid even provides native support for&amp;nbsp;the most popular&amp;nbsp;aspect of Windows Workflow Foundation:&amp;nbsp;database persistence.&lt;/P&gt;
&lt;P mce_keep="true"&gt;This article describes how to use different&amp;nbsp;features of Windows Workflow Foundation&amp;nbsp;in your&amp;nbsp;SaaSGrid application. Before reading this article, it is helpful to be familiar with Windows Workflow Foundation. &lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;SaaSGrid Considerations&lt;/STRONG&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;Windows Workflow Foundation (WF) uses a &lt;EM&gt;runtime engine&lt;/EM&gt;, with a variety of &lt;EM&gt;runtime services&lt;/EM&gt; to perform specific actions related to the workflow. The types of&amp;nbsp;runtime services include a persistence service, scheduling service, tracking service, and so on. There are &lt;EM&gt;default implementations&lt;/EM&gt; of these services included with WF.&lt;/P&gt;
&lt;P mce_keep="true"&gt;The default implementations of these services are not compatible with SaaSGrid's deployment model. Microsoft designed the default implementations of their services to communicate directly with Microsoft SQL Server. Because SaaSGrid controls database deployment to handle SaaS concerns&amp;nbsp;(e.g.&amp;nbsp;multi-tenancy), we require SaaSGrid applications to be &lt;EM&gt;database provider agnostic&amp;nbsp;&lt;/EM&gt;so&amp;nbsp;SaaSGrid's&amp;nbsp;database provider can be used when the application is deployed on the cloud.&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;It is very easy to write &lt;EM&gt;custom implementations&lt;/EM&gt; of runtime services and configure applications to use them. SaaSGrid provides a custom implementation of the persistence service that you can use to persist workflows in your SaaSGrid hosted database which is sufficient for most customers. SaaSGrid does not provide any custom implementations of other runtime services such as the tracking service. The rest of this article describes how to use our persistence service and&amp;nbsp;guidelines for writing&amp;nbsp;your own custom implementation of other runtime services.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;SaaSGrid's Persistence Service&lt;/STRONG&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;SaaSGrid provides a persistence service that you can use. All that is needed is to configure the engine to use it. The following example&amp;nbsp;&lt;EM&gt;App.config&lt;/EM&gt; file provides an example of this. Note the usage of the &lt;A href="http://community.saasgrid.com/developers/b/team/archive/2008/05/07/using-saasgrid-s-conditional-configuration-system.aspx" mce_href="/blogs/saasgriddevs/archive/2008/05/07/using-saasgrid-s-conditional-configuration-system.aspx"&gt;conditional configuration system&lt;/A&gt; to make it easy to develop and test your application locally. &lt;/P&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;lt;?&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;xml&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;version&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;"&lt;SPAN style="COLOR: blue"&gt;1.0&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;encoding&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;utf-8&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt; ?&amp;gt;&lt;BR&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;configuration&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;configSections&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;section&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;name&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;"&lt;SPAN style="COLOR: blue"&gt;WorkflowRuntime&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;type&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt; /&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;configSections&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;WorkflowRuntime&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;CommonParameters&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;!--&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;SaaSGrid Local Configuration&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;add&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;name&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;"&lt;SPAN style="COLOR: blue"&gt;ConnectionString&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;value&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;Data Source=db1_s.apprenda.local\devsql01;Initial Catalog=IssueTracker; Integrated Security=True;&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt; /&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;!--&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;End SaaSGrid Local Configuration&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;!--&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;SaaSGrid Live Configuration&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;add name="ConnectionString" value="Ignored by SaaSGrid" /&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;add name="ConnectionProvider" value="SaaSGrid.Data.SqlClient"/&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;End SaaSGrid Live Configuration&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;CommonParameters&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Services&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;!--&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;SaaSGrid Local Configuration&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;add&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt; &lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: red; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;type&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;=&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;"&lt;SPAN style="COLOR: blue"&gt;System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;UnloadOnIdle&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;true&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;LoadIntervalSeconds&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt;5&lt;/SPAN&gt;"&lt;SPAN style="COLOR: blue"&gt; /&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;!--&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;End SaaSGrid Local Configuration&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&amp;lt;!--&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;SaaSGrid Live Configuration&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;add type="Apprenda.SaaSGrid.Data.Workflow.SqlPersistenceService, SaaSGrid.Data, Version=1.0.00000.0, Culture=neutral, PublicKeyToken=null" UnloadOnIdle="true" LoadIntervalSeconds="5" /&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: green; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;End SaaSGrid Live Configuration&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;--&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;Services&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;WorkflowRuntime&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;BR&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: #a31515; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;configuration&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Courier New'; COLOR: blue; FONT-SIZE: 10pt; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt; 
&lt;P mce_keep="true"&gt;
&lt;P mce_keep="true"&gt;Note that SaaSGrid's provided SQL persistence service requires the usage&amp;nbsp;of&amp;nbsp;an App.config section in the manner demostrated above, even though it is technically possible to configure&amp;nbsp;runtime services via code.&amp;nbsp;This manner of applying configuration is consistent with how we require you to configure services and classic database connectivity.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;Developing your own Runtime Services&lt;/STRONG&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;As previously mentioned, SaaSGrid does not provide an implementation for other runtime services that you may wish to take advantage of. Fortunately,&amp;nbsp;it is very easy to write your own, and plenty of documentation is available &lt;A href="http://msdn.microsoft.com/en-us/library/ms734705.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/ms734705.aspx"&gt;on the MSDN Website&lt;/A&gt;. &lt;/P&gt;
&lt;P mce_keep="true"&gt;The main&amp;nbsp;thing to&amp;nbsp;keep in mind&amp;nbsp;when writing your&amp;nbsp;runtime service's database connectivity is to use a &lt;A href="http://community.saasgrid.com/developers/b/team/archive/2008/04/30/database-access-on-saasgrid.aspx" mce_href="/blogs/saasgriddevs/archive/2008/04/30/database-access-on-saasgrid.aspx"&gt;configuration-based database provider and connection&lt;/A&gt;&amp;nbsp;just as you would for any other code you write in SaaSGrid. In fact, you probably won't be the first person who wishes to use a different provider than SQL Server! There are many blog postings and sample code out there on how to create custom runtime services. &lt;/P&gt;
&lt;P mce_keep="true"&gt;If you can share your experience about creating and using your own runtime service with SaaSGrid, please comment or post in our forums. We'd love to hear about it!&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;Closing Remarks&lt;/STRONG&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;To summarize, Workflow Foundation's default implementation of runtime services won't run on SaaSGrid because they are programmed to use the Microsoft SQL Server database provider.&amp;nbsp;SaaSGrid provides a native implementation of the most commonly used&amp;nbsp;feature of Workflow Foundation, which is the persistence service, but&amp;nbsp;you must&amp;nbsp;configure your workflow engine to use it. It is easy to create your own implementations of other runtime services, but be sure to design them to be database provider agnostic and loaded by configuration as you would any SaaSGrid application.&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://community.saasgrid.com/aggbug.aspx?PostID=744" width="1" height="1"&gt;</content><author><name>pmiles</name><uri>http://community.saasgrid.com/members/pmiles/</uri></author></entry><entry><title>Migrating an Existing Application to SaaSGrid</title><link rel="alternate" type="text/html" href="/developers/b/team/archive/2009/06/02/migrating-an-existing-application-to-saasgrid.aspx" /><id>/developers/b/team/archive/2009/06/02/migrating-an-existing-application-to-saasgrid.aspx</id><published>2009-06-02T20:19:00Z</published><updated>2009-06-02T20:19:00Z</updated><content type="html">&lt;p&gt;A common question that we get is &amp;quot;What will it take to change my existing .NET application to work on SaaSGrid?&amp;quot;&lt;/p&gt;
&lt;p&gt;The answer depends on these factors:&lt;/p&gt;
&lt;ul class="unIndentedList"&gt;
&lt;li&gt;The current architectural structure of your application and how closely it matches that of SaaSGrid&amp;#39;s required structure.&lt;/li&gt;
&lt;li&gt;How your application currently handles functionality that SaaSGrid&amp;#39;s platform offers for you, such as authentication, roles, purchasing, subscription management, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this article, I will briefly describe each of these items which will serve as a starting point for understanding what it will take to make your application work on SaaSGrid.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style="text-decoration:underline;"&gt;Application Structure&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;SaaSGrid applications are physical divided into the following 3 components, explained in further detail below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Data Persistence&lt;/li&gt;
&lt;li&gt;Business Logic&lt;/li&gt;
&lt;li&gt;User Interface&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;b&gt;data persistence layer&lt;/b&gt; (if required for your application) can consist of any standard database elements such as tables, views, etc. You may have exactly one database &amp;amp; schema per application.&lt;/p&gt;
&lt;p&gt;The &lt;b&gt;business logic layer&lt;/b&gt; consists of one or more WCF-based web services. The web services encapsulate your business logic, are consumed by your user interface(s) or other services, and are responsible for interactions with the data persistence layer. Interactions with the data persistence layer must be in a &amp;quot;provider agnostic way&amp;quot; meaning that your database connections are established via a factory that relies on configured preferences. &lt;/p&gt;
&lt;p&gt;The &lt;b&gt;user interface layer&lt;/b&gt; (if required for your application) consists of one or more ASP.Net or Silverlight applications that consume the web services from the business logic layer. The user interface cannot access the data persistence layer.&lt;/p&gt;
&lt;p&gt;Structuring your application in this way permits us to scale out and deploy your application components as your customer base grows, and permits us to establish multi-tenancy for your application without your needing to incorporate this into your application design. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style="text-decoration:underline;"&gt;SaaSGrid&amp;#39;s Feature Set&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;SaaSGrid offers a wide array of features and an API to take full advantage of them, which up until now would typically be handled to some extent by an existing application. This includes aspects such as multi-tenancy, billing, user &amp;amp; role management, access control, feature usage monitoring, and much more. These generally can be divided into two categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Features that SaaSGrid handles completely but may exist in your application, such as creating a user, authentication, and billing.&lt;/li&gt;
&lt;li&gt;Features that SaaSGrid provides that are tapped via the SaaSGrid API when developing your application, such as securable checks and feature usage monitoring.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Where there is feature overlap, it may be necessary to remove or change code and your data model to work with SaaSGrid. Generally speaking, the more overlap your application has with SaaSGrid&amp;#39;s feature set, the more work is required to modify your application to use SaaSGrid and its API. Of course, this all depends on the complexity of your application and its requirements.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;In conclusion, this information gives you a better idea of what it takes to get your application working on SaaSGrid, but please also take a look at the following references which can help provide some additional insight:&lt;/p&gt;
&lt;ul class="unIndentedList"&gt;
&lt;li&gt;&lt;a href="http://apprenda.com/platform/saasgrid-introduction/"&gt;SaaSGrid Platform Page&lt;/a&gt; - an introduction to the features of SaaSGrid&lt;/li&gt;
&lt;li&gt;&lt;a href="http://community.saasgrid.com/developers/m/developer-guides/765.aspx"&gt;SaaSGrid Quickstart&lt;/a&gt; - leads you through a basic example to familiarize yourself with SaaSGrid concepts and the SaaSGrid API&lt;/li&gt;
&lt;li&gt;&lt;a href="http://community.saasgrid.com/developers/m/"&gt;Downloads page&lt;/a&gt; - contains code samples, the SDK, and other documentation&lt;/li&gt;
&lt;li&gt;Demo - a great way to familiarize yourself with the SaaSGrid&amp;#39;s features and capabilities (contact your sales contact for more info)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have any additional questions please post in our developer forums.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://community.saasgrid.com/aggbug.aspx?PostID=742" width="1" height="1"&gt;</content><author><name>pmiles</name><uri>http://community.saasgrid.com/members/pmiles/</uri></author><category term="legacy" scheme="http://community.saasgrid.com/developers/b/team/archive/tags/legacy/" /><category term="migration" scheme="http://community.saasgrid.com/developers/b/team/archive/tags/migration/" /></entry><entry><title>Accessing Other Tenant’s Data in an Application</title><link rel="alternate" type="text/html" href="/developers/b/team/archive/2009/06/01/accessing-other-tenant-s-data-in-an-application.aspx" /><id>/developers/b/team/archive/2009/06/01/accessing-other-tenant-s-data-in-an-application.aspx</id><published>2009-06-01T18:27:00Z</published><updated>2009-06-01T18:27:00Z</updated><content type="html">&lt;p&gt;Consider the following use cases:&lt;/p&gt;

&lt;ul class="unIndentedList"&gt;
&lt;li&gt;
My application permits tenants to create events,
and I want to publish a list of all of those events in another location.&lt;/li&gt;

&lt;li&gt;
I want tenants to be able to mark data as
sharable so it can be viewed by other tenants.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SaaSGrid's built-in Tenant and Provider Contexts', in
conjunction with a concept called "impersonation", provides a mechanism that
can be used to access data for any and all tenants of an application. This
article will discuss how this can be done and presents a basic example that
involves modifying the existing Taskr sample application.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Introduction to the
Tenant and Provider Context&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Before getting started, let's review and compare the Tenant
and Provider Context:&lt;/p&gt;

&lt;table border="1" cellpadding="0" cellspacing="0"&gt;
 &lt;tbody&gt;
&lt;tr&gt;
  
&lt;td valign="top" width="319"&gt;
  
&lt;p&gt;&lt;b&gt;Tenant Context&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  
&lt;td valign="top" width="319"&gt;
  
&lt;p&gt;&lt;b&gt;Provider Context&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 
&lt;tr&gt;
  
&lt;td valign="top" width="319"&gt;
  
&lt;ul class="unIndentedList"&gt;
&lt;li&gt;
  Provides information about the tenant that the
  application's logged in user belongs to &lt;/li&gt;
&lt;/ul&gt;
  
&lt;ul class="unIndentedList"&gt;
&lt;li&gt;
  Automatically established&lt;/li&gt;
&lt;/ul&gt;
  
&lt;ul class="unIndentedList"&gt;
&lt;li&gt;
  Database queries done only apply to data
  pertaining to the appropriate tenant&lt;/li&gt;
&lt;/ul&gt;
  &lt;/td&gt;
  
&lt;td valign="top" width="319"&gt;
  
&lt;ul class="unIndentedList"&gt;
&lt;li&gt;
  Provides information about the provider of the
  application currently being used&lt;/li&gt;
&lt;/ul&gt;
  
&lt;ul class="unIndentedList"&gt;
&lt;li&gt;
  Manually established&lt;/li&gt;
&lt;/ul&gt;
  
&lt;ul class="unIndentedList"&gt;
&lt;li&gt;
  Database queries done apply to all data
  pertaining to the application (all tenant's data)&lt;/li&gt;
&lt;/ul&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;&lt;b&gt;&lt;i&gt;Note:&lt;/i&gt;&lt;/b&gt; In addition to the Tenant and Provider Contexts', there
is also Session, Request, User, and Subscription Contexts' that will not be
discussed further here but may be helpful when developing your application.
Please consult the SaaSGrid Developer Guide for additional information.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Using the Provider
Context to Get Application Data&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;All database queries done within an instance of the Provider
Context apply to all of an application's data. See the code snippet below to
see an example of creating and using the provider context. &lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b style=""&gt;&lt;u&gt;&lt;span style="font-family: 'Courier New'; color: rgb(227, 108, 10);"&gt;Sample Provider Context Usage&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;span style="font-family: 'Courier New'; color: rgb(227, 108, 10);"&gt;&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;using&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;ProviderContext&lt;/span&gt;
providerContext = &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;ProviderContext&lt;/span&gt;.NewProviderContext())&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;// Data queries
here execute for all application &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;// data - not
just the current user's tenant.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;

&lt;p&gt;"Wrapping" database calls as shown above is essentially all
that is required to do basic operations that pertain to all data in the system.
This approach does have some limitations pertaining to data retrieval: &lt;/p&gt;

&lt;ul class="unIndentedList"&gt;
&lt;li&gt;
No information is returned pertaining to the
tenant of each data item. For example, if I have a database query that returns
a list of all tasks, there is no way to tell which task corresponds to which
tenant. (This is addressed in the next section.)&lt;/li&gt;

&lt;li&gt;
When developing locally, there will be no
difference in the data returned. This is because the database that you are
using locally by design contains a single tenant's data. &lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;In the next section, we'll take a look at another approach
that allows you to retrieve data while knowing which tenant created it. This is
enabled with a concept called "context impersonation." &lt;/p&gt;

&lt;p&gt;&lt;b&gt;Context Impersonation&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;It is possible to nest the Tenant and Provider Contexts
within one another to affect the scope of a command being executed, much like
the stack available within a traditional programming language. The diagram
below shows how the scope of commands are changed as the application developer
manually instantiates various Tenant and Provider contexts. &lt;/p&gt;&lt;p&gt;&lt;a href="http://community.saasgrid.com/images/old-content/stack.jpg"&gt;&lt;img src="http://community.saasgrid.com/images/old-content/stack.jpg" border="0"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;The following code example shows how to use context
impersonation to perform data retrieval for all of a provider's data while
having access to information about the tenant that created it.&lt;/p&gt;


&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b style=""&gt;&lt;u&gt;&lt;span style="font-family: 'Courier New'; color: rgb(227, 108, 10);"&gt;Sample Context Impersonation&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;span style="font-family: 'Courier New'; color: rgb(227, 108, 10);"&gt;&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;using&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;ProviderContext&lt;/span&gt;
providerContext = &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;ProviderContext&lt;/span&gt;.NewProviderContext())&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(43, 145, 175);"&gt;ITenantProfile&lt;/span&gt;&amp;gt; customers = &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;providerContext.GetCustomers();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; customer &lt;span style="color: blue;"&gt;in&lt;/span&gt;
customers)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;TenantContext&lt;/span&gt; tenantContext =&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;TenantContext&lt;/span&gt;.NewTenantContext(customer.ID))&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;// Data
queries here execute for the &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;//
designated tenant. You can link&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;// the
tenant information to the data this way.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&amp;nbsp;

&lt;p&gt;&lt;b&gt;Warning:&lt;/b&gt; This specific
code example could take a very long time if your application has many
customers. You'll probably want to consider calling code that loops through
every tenant sparingly due to the performance implications.&lt;/p&gt;

&lt;p&gt;Please also note that we are cognizant of the anticipated
need to include tenant data, or some means of linking rows with tenant
information, for data returned from queries executed in a provider context. We're
looking to include this in a future release of SaaSGrid, thus eliminating the need
to loop through each tenant.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Live Example&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;We produced an additional sample that demonstrates usage of
the Provider and Tenant Context. We took the "Taskr with Linq" example, and
added an additional view beneath the task list showing all of the tasks from
other companies, as depicted in the screenshot below. &lt;/p&gt;&lt;p&gt;&lt;a href="http://community.saasgrid.com/images/old-content/taskrpc.jpg" mce_href="http://community.saasgrid.com/images/old-content/taskrpc.jpg"&gt;&lt;img src="http://community.saasgrid.com/images/old-content/taskrpc.jpg" mce_src="http://community.saasgrid.com/images/old-content/taskrpc.jpg" border="0"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;An additional method on the Taskr Core service was
implemented to return the data for this grid, whose code is shown below. As you
can see, this loops through each and every tenant and builds the list of tasks
that should be displayed on the grid.&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b style=""&gt;&lt;u&gt;&lt;span style="font-family: 'Courier New'; color: rgb(227, 108, 10);"&gt;Taskr Service Addition&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;span style="font-family: 'Courier New'; color: rgb(227, 108, 10);"&gt;&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(43, 145, 175);"&gt;Guid&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt; myTenantId = &lt;span style="color: rgb(43, 145, 175);"&gt;TenantContext&lt;/span&gt;.Current.GetCompanyProfile().Id;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(43, 145, 175);"&gt;IList&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&amp;lt;&lt;span style="color: rgb(43, 145, 175);"&gt;TaskFromOtherDTO&lt;/span&gt;&amp;gt; tasks = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(43, 145, 175);"&gt;TaskFromOtherDTO&lt;/span&gt;&amp;gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;using&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;ProviderContext&lt;/span&gt; providerContext = &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;ProviderContext&lt;/span&gt;.NewProviderContext())&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(43, 145, 175);"&gt;ITenantProfile&lt;/span&gt;&amp;gt; customers =
providerContext.GetCustomers();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; customer &lt;span style="color: blue;"&gt;in&lt;/span&gt;
customers)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;
(!customer.Id.Equals(myTenantId))&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;using&lt;/span&gt;
(&lt;span style="color: rgb(43, 145, 175);"&gt;TenantContext&lt;/span&gt; tenantContext =&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;TenantContext&lt;/span&gt;.NewTenantContext(customer.Id))&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;TaskrDataContext&lt;/span&gt;
db = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;TaskrDataContext&lt;/span&gt;(&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;ConfigurationProvider&lt;/span&gt;.GetConnection(&lt;span style="color: rgb(163, 21, 21);"&gt;"Taskr"&lt;/span&gt;));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt;
(&lt;span style="color: blue;"&gt;var&lt;/span&gt; task &lt;span style="color: blue;"&gt;in&lt;/span&gt;
db.Tasks.OrderBy(t =&amp;gt; t.DueDate))&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;tasks.Add(&lt;span style="color: rgb(43, 145, 175);"&gt;TaskFromOtherDTO&lt;/span&gt;.StaticMapFrom(&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;task, customer.Name));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;return&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt; tasks;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;


&lt;p&gt;You can download the full sample of this special Taskr version from our download area by
&lt;a href="/files/folders/samples/entry373.aspx" mce_href="/files/folders/samples/entry373.aspx"&gt;clicking here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Of course, as always, please post a comment to this article
or post in our developer center if you have any questions or feedback.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://community.saasgrid.com/aggbug.aspx?PostID=741" width="1" height="1"&gt;</content><author><name>pmiles</name><uri>http://community.saasgrid.com/members/pmiles/</uri></author></entry><entry><title>Using built-in ASP.NET providers on public websites</title><link rel="alternate" type="text/html" href="/developers/b/team/archive/2009/04/17/using-built-in-asp-net-providers-on-public-websites.aspx" /><id>/developers/b/team/archive/2009/04/17/using-built-in-asp-net-providers-on-public-websites.aspx</id><published>2009-04-17T19:36:00Z</published><updated>2009-04-17T19:36:00Z</updated><content type="html">&lt;p&gt;This article assumes that you are creating a &lt;a href="http://64.34.180.162/blogs/saasgriddevs/archive/2009/02/25/public-websites-amp-concurrent-usage.aspx" mce_href="http://64.34.180.162/blogs/saasgriddevs/archive/2009/02/25/public-websites-amp-concurrent-usage.aspx"&gt;public website&lt;/a&gt; for your SaaSGrid application, and you wish to take advantage of ASP.NET's Providers. This article talks about considerations to keep in mind when using these providers within a SaaSGrid application.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Recall that ASP.Net Providers provide an extensible way to perform common application tasks such as user authentication, role management, and more. Basic implementations of these providers exist, and many of them utilize your SQL Server Database to operate. An excellent way to get familiar with all of the ASP.Net Providers is to take a look at &lt;a href="http://msdn.microsoft.com/en-us/asp.net/aa336558.aspx" mce_href="http://msdn.microsoft.com/en-us/asp.net/aa336558.aspx"&gt;Microsoft's Provider Toolkit&lt;/a&gt; site.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The tenant's website typically wouldn't use any of these providers because of SaaSGrid's built-in user, subscription, and role management capabilities, but they can be useful on a public website that require these capabilities.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;There are two key considerations to always keep in mind not only when using these providers but also when writing any ASP.NET Web Application for SaaSGrid:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;No direct database access: &lt;/b&gt;SaaSGrid applications are 3 tiers with a clear division between the presentation, business, and persistence layers. Your application's data access must be coordinated through the WCF services that make up your business layer.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;No Microsoft SQL Server Client-specific Code: &lt;/b&gt;SaaSGrid uses its own client to handle database calls within the SaaSGrid cloud. Therefore, you must program your connectivity against ADO.NET Abstract classes (e.g. &lt;i&gt;DbConnection&lt;/i&gt;, not &lt;i&gt;SqlConnection&lt;/i&gt;). &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These two considerations severely restrict which implementations of the included ASP.NET Providers you can use. For example, the &lt;i&gt;SqlMembershipProvider &lt;/i&gt;cannot be used because it accesses the database directly, and its &lt;a href="http://weblogs.asp.net/scottgu/archive/2006/04/13/442772.aspx" mce_href="http://weblogs.asp.net/scottgu/archive/2006/04/13/442772.aspx"&gt;underlying implementation&lt;/a&gt; uses the &lt;i&gt;SqlConnection &lt;/i&gt;class instead of the generic ADO.NET class. &lt;/p&gt;&lt;p&gt;Fortunately, Microsoft has introduced &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.applicationservices.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.web.applicationservices.aspx"&gt;WCF-based Provider Services&lt;/a&gt; (which others have &lt;a href="http://monstersgotmy.net/post/WCF-MembershipProvider-and-RoleProvider-Schweeeet.aspx" mce_href="http://monstersgotmy.net/post/WCF-MembershipProvider-and-RoleProvider-Schweeeet.aspx"&gt;improved&lt;/a&gt; to address some limitations). Therefore, you can take advantage of the ASP.NET Provider Model in your ASP.NET application, and create a WCF Service with the appropriate logic as needed. &lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://community.saasgrid.com/aggbug.aspx?PostID=739" width="1" height="1"&gt;</content><author><name>pmiles</name><uri>http://community.saasgrid.com/members/pmiles/</uri></author></entry><entry><title>An Intro To The SaaSGridControlToolkit</title><link rel="alternate" type="text/html" href="/developers/b/team/archive/2009/03/31/an-intro-to-the-saasgridcontroltoolkit.aspx" /><id>/developers/b/team/archive/2009/03/31/an-intro-to-the-saasgridcontroltoolkit.aspx</id><published>2009-03-31T12:15:00Z</published><updated>2009-03-31T12:15:00Z</updated><content type="html">&lt;p&gt;Last week we released the first version of a development library called the &lt;a href="http://64.34.180.162/files/folders/tools/entry292.aspx" title="Download the SaaSGrid Control Toolkit" target="_blank" mce_href="http://64.34.180.162/files/folders/tools/entry292.aspx"&gt;SaaSGridControlToolkit&lt;/a&gt; that will make developing ASP.NET user interfaces for SaaSGrid even easier.&amp;nbsp; The SaaSGridControlToolkit is a collection of ASP.NET controls that provide out-of-the-box functionality powered by the SaaSGrid API and the SaaSGrid operating environment itself at runtime.&amp;nbsp; Development of the SaaSGridControlToolkit is an ongoing effort here at Apprenda. &lt;b&gt;If you've developed any ASP.NET user controls that utilize the SaaSGrid API and would like us to include them in future releases of the SaaSGridControlToolkit, please let us know!&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Start by &lt;a href="http://64.34.180.162/files/folders/tools/entry292.aspx" title="Download the SaaSGrid Control Toolkit" target="_blank" mce_href="http://64.34.180.162/files/folders/tools/entry292.aspx"&gt;downloading the latest release of the SaaSGridControlToolkit library&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;u&gt;Example: LogoutHyperLink&lt;/u&gt;&lt;/b&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;The first control we'll look at is the LogoutHyperLink (SaaSGridControlToolkit.LogoutHyperLink).&amp;nbsp; This very basic control simply renders a hyperlink to an ASP.NET page that directs the user to the SaaSGrid logout URL. The reason this control is important as an out-of-the-box component is because there is no notion of "logging out" of an application while developing locally. Since authentication is handled by the SaaSGrid cloud instance that applications are deployed to, a developer could not reliably build a logout button into their application without knowledge of that cloud instance's URL and authentication paths.&amp;nbsp; This is where the LogoutHyperLink comes in.&amp;nbsp; The control obtains information from the SaaSGrid runtime and renders a 'Logout' link to the proper URL, allowing the user to exit the application.&lt;/p&gt;&lt;p&gt;The LogoutHyperLink control has one property that can be overridden, and that is the Text property. By default, the text of the hyperlink is 'Logout'. By overriding this property, developers can render the text of their choice.&lt;/p&gt;&lt;p&gt;For example, the simple tag on an ASP.NET page might look like this: &amp;lt;SaaSGridControlToolkit:LogoutHyperLink runat="server" Text="Logout of MyApp" /&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Important Note: &lt;/b&gt;The LogoutHyperLink control uses SaaSGrid cloud instance information that is only available in &lt;b&gt;live&lt;/b&gt; SaaSGrid environments. During local development, the control still appears exactly as it will when deployed, but the link triggers a javascript alert telling the developer that the control will work when the application is deployed. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Lastly, you may recognize the LogoutHyperLink, because we use it in the SaaSGrid Portals!&lt;/p&gt;&lt;p&gt;&lt;img src="http://64.34.180.162/blogs/saasgriddevs/LogoutHyperLink.gif" title="LogoutHyperLink Example" alt="LogoutHyperLink Example" mce_src="http://64.34.180.162/blogs/saasgriddevs/LogoutHyperLink.gif" width="220" height="100" /&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://community.saasgrid.com/aggbug.aspx?PostID=736" width="1" height="1"&gt;</content><author><name>mammerman</name><uri>http://community.saasgrid.com/members/mammerman/</uri></author></entry><entry><title>Updates to the SaaSGrid Mocker</title><link rel="alternate" type="text/html" href="/developers/b/team/archive/2009/03/09/updates-to-the-saasgrid-mocker.aspx" /><id>/developers/b/team/archive/2009/03/09/updates-to-the-saasgrid-mocker.aspx</id><published>2009-03-10T02:22:00Z</published><updated>2009-03-10T02:22:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;We've just released a new version of the SaaSGrid Mocker to support the new functionality introduced with the latest version of the SaaSGrid SDK (v 1.6) as well as some minor bug fixes.&lt;/P&gt;
&lt;P mce_keep="true"&gt;The bug fixes are related to issues trying to save the active configuration and in the process we also introduced the ability to “Save As…” on the active configuration allowing you to easily create configuration copies.&lt;/P&gt;
&lt;P mce_keep="true"&gt;The new functionality is to support public websites and concurrent subscriptions through a new section:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://community.saasgrid.com/images/old-content/ConcurrentSubscriptions.png"&gt;&lt;IMG src="http://community.saasgrid.com/images/old-content/ConcurrentSubscriptions.png" width=700 border=0&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;You can get the new Mocker &lt;A class="" title="Download the Mocker" href="http://community.saasgrid.com/developers/m/samples/768.aspx" mce_href="/files/folders/tools/default.aspx"&gt;here&lt;/A&gt; or by downloading the latest version of the SaaSGrid SDK &lt;A class="" title="Download the SaaSGrid SDK" href="http://community.saasgrid.com/developers/m/saasgrid-sdk/" mce_href="/files/folders/sdk/default.aspx"&gt;here&lt;/A&gt;. &lt;BR&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://community.saasgrid.com/aggbug.aspx?PostID=734" width="1" height="1"&gt;</content><author><name>asultan</name><uri>http://community.saasgrid.com/members/asultan/</uri></author></entry><entry><title>Public Websites &amp; Concurrent Usage</title><link rel="alternate" type="text/html" href="/developers/b/team/archive/2009/02/25/public-websites-amp-concurrent-usage.aspx" /><id>/developers/b/team/archive/2009/02/25/public-websites-amp-concurrent-usage.aspx</id><published>2009-02-25T17:11:00Z</published><updated>2009-02-25T17:11:00Z</updated><content type="html">&lt;P mce_keep="true"&gt;&lt;STRONG&gt;Introduction&lt;/STRONG&gt;: With&amp;nbsp;the release of the SaaSGrid SDK v1.6 we introduced 2 very cool new features, the first one is the ability to support the notion of public websites and the second one which goes hand in hand with the first one is the ability to control application usage based on the number of concurrent users using the application.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Public websites are a set of user interfaces that do not require authentication into SaaSGrid in the traditional sense but instead it allows you to expose a website that contacts your application web services&amp;nbsp;and access is controlled based on the number of concurrent users accessing the website.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Common examples of applications that would benefit from this functionality are applications such as: Help Desk software that might allow end users to track the status of their tickets or navigate knowledge base articles that are available to the public for limited functionality. Another example can be a Bug Tracking application that allows end users to submit bugs through a web form&amp;nbsp;or allow&amp;nbsp;end users to see if the bugs have been resolved.&lt;/P&gt;
&lt;P mce_keep="true"&gt;The goal is that you can expose limited functionality to "restricted" users without having to charge for the full amount of a named user since their usage of the application would only be really limited.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Now that we know what the two features are, let's dive a bit into how to use them:&lt;/P&gt;
&lt;P mce_keep="true"&gt;The first thing you need to do is create a public website. Public websites are identical to regular websites with the only difference that they will go under a new section in you application archive called &lt;STRONG&gt;PublicInterfaces&lt;/STRONG&gt;. This is done to allow maximum flexibility in the creation of the website as well as to instruct SaaSGrid how to deploy your application. If you were to look at an archive with a public website it would look like this:&lt;/P&gt;
&lt;DIV style="TEXT-ALIGN: center"&gt;&lt;A href="http://community.saasgrid.com/images/old-content/ArchiveLayout_PublicInterfaces.png" mce_href="http://community.saasgrid.com/images/old-content/ArchiveLayout_PublicInterfaces.png"&gt;&lt;IMG src="http://community.saasgrid.com/images/old-content/ArchiveLayout_PublicInterfaces.png" border=0 mce_src="http://community.saasgrid.com/images/old-content/ArchiveLayout_PublicInterfaces.png"&gt;&lt;/A&gt;&lt;/DIV&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;Creating an httpModule&lt;/STRONG&gt;: The second thing you need to do is create an httpModule where you will establish a session to SaaSGrid and grab a concurrent subscription from the pool of subscriptions, you should return the subscription to the pool when the subscription is no longer in use.&lt;/P&gt;
&lt;P mce_keep="true"&gt;You can find a sample httpModule&amp;nbsp;below that works on a per request basis, if you are planning on having "authenticated users" using the public websites we will cover keeping a long running session in a future article but this should get you started.&lt;/P&gt;
&lt;P&gt;[code]&lt;BR&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#000000 size=2&gt;/// &amp;lt;summary&amp;gt;&lt;BR&gt;/// This is a small module that establishes sessions based on a&lt;BR&gt;/// request basis.&lt;BR&gt;/// &amp;lt;/summary&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=2&gt;
&lt;P mce_keep="true"&gt;&lt;/FONT&gt;public class RequestBasedModule : IHttpModule&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private Guid subscriptionId = Guid.Empty;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private Session sess = null;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Dispose() { }&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Init(HttpApplication context)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.BeginRequest += BeginRequestHandler;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.EndRequest += EndRequestHandler;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void BeginRequestHandler(object sender, EventArgs e)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sess = Session.EstablishSession();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; subscriptionId = TenantContext.Current.AssignConcurrentSubscription();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void EndRequestHandler(object sender, EventArgs e)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Guid.Empty != subscriptionId)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TenantContext.Current.RemoveSubscriptionAssignee(subscriptionId);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (null != sess)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sess.ReleaseSession();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/P&gt;
&lt;P mce_keep="true"&gt;[/code]&lt;/P&gt;
&lt;P mce_keep="true"&gt;When your application is deployed in SaaSGrid, if you had a public website, SaaSGrid will create two websites for each tenant that signs up to your application under the following protocol: &lt;U&gt;http://app_alias.tenant_alias.saasgrid_instance.com&lt;/U&gt; and &lt;U&gt;http://public.app_alias.tenant_alias.saasgrid_instance.com&lt;/U&gt; where app_alias is the alias of your application, tenant_alias is the alias of the tenant signing up and saasgrid_instance.com is the host name of the SaaSGrid instance being used. This allows each tenant to map a custom domain name to their applications, both the private and public portions.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;Setting up the Local Environment&lt;/STRONG&gt;: In order to test public websites and concurrent users in your local environment you need to add a new section to the execution context called concurrentSubscriptions that simulate the number of concurrent subscriptions available for the tenant. The new tag looks like this:&lt;/P&gt;
&lt;P mce_keep="true"&gt;[code]&amp;lt; concurrentSubscriptions limit="5" /&amp;gt;[/code]&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;Sample Application&lt;/STRONG&gt;:&amp;nbsp;Please use the &lt;A class="" title="FAQ Manager" href="http://community.saasgrid.com/developers/m/samples/769.aspx" mce_href="/files/folders/samples/entry260.aspx"&gt;following sample&lt;/A&gt; as a reference of how to set this up and don't hesitate to use the forums if you have any questions.&lt;/P&gt;
&lt;P mce_keep="true"&gt;Cheers!&lt;/P&gt;
&lt;P mce_keep="true"&gt;- Abe&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://community.saasgrid.com/aggbug.aspx?PostID=733" width="1" height="1"&gt;</content><author><name>asultan</name><uri>http://community.saasgrid.com/members/asultan/</uri></author></entry><entry><title>LINQ to SQL Common Pitfalls</title><link rel="alternate" type="text/html" href="/developers/b/team/archive/2009/02/12/linq-to-sql-common-pitfalls.aspx" /><id>/developers/b/team/archive/2009/02/12/linq-to-sql-common-pitfalls.aspx</id><published>2009-02-12T13:00:00Z</published><updated>2009-02-12T13:00:00Z</updated><content type="html">&lt;P&gt;By default, LINQ to SQL uses fully qualified object names derived from the application's datacontext file (.dbml) during compilation. When you initially create this datacontext file for your application, every table entry has a property called 'Source' which contains the fully qualified table name for that table.&amp;nbsp; By default, this 'Source' property is set to dbo.[TableName], indicating the default dbo schema.&amp;nbsp; An issue arises after deploying this application into a live SaaSGrid environment.&amp;nbsp; You will get the following error message:&lt;/P&gt;
&lt;P&gt;&lt;B&gt;[SQL Operation] permission denied on object '[TableName]', database '[GUID]', schema 'dbo'.&lt;/B&gt; &lt;/P&gt;
&lt;P&gt;The reason for this error is that SaaSGrid does not allow explicit schema references in SQL statements. The simple fix for this is to remove any schema references in your datacontext file.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;B&gt;The following default setting is INCORRECT:&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;&lt;IMG title="Taskr Task Data Context Wrong" height=200 alt="Taskr Task Data Context" src="http://community.saasgrid.com/images/old-content/TaskrTaskDataContextWrong.jpg" width=604 align=middle&gt;&lt;/P&gt;
&lt;P&gt;&lt;B&gt;Consider the following CORRECT example from the &lt;A title="Taskr With Linq" href="http://community.saasgrid.com/developers/m/samples/767.aspx" mce_href="/files/folders/samples/entry149.aspx"&gt;Taskr With LINQ example&lt;/A&gt;:&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;&lt;IMG title="Taskr Task Data Context" height=200 alt="Taskr Task Data Context" src="http://community.saasgrid.com/images/old-content/TaskrTaskDataContext.jpg" width=604 align=middle&gt;&lt;/P&gt;
&lt;P&gt;Notice that the 'Source' property is simply the name of the table 'Task', rather than the fully qualified table name 'dbo.Task'.&lt;/P&gt;
&lt;P&gt;Another common pitfall using LINQ to SQL is trying to use auto incrementing columns as the idnetity column, at this time we don't support auto incrementing columns and instead we recomment that you use a Guid as the identity column.&lt;BR&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://community.saasgrid.com/aggbug.aspx?PostID=731" width="1" height="1"&gt;</content><author><name>mammerman</name><uri>http://community.saasgrid.com/members/mammerman/</uri></author></entry><entry><title>Options for Locating the SaaSGrid Configuration File</title><link rel="alternate" type="text/html" href="/developers/b/team/archive/2009/02/10/options-for-locating-the-saasgrid-configuration-file.aspx" /><id>/developers/b/team/archive/2009/02/10/options-for-locating-the-saasgrid-configuration-file.aspx</id><published>2009-02-11T03:12:00Z</published><updated>2009-02-11T03:12:00Z</updated><content type="html">
&lt;p&gt;One of the powerful features of the SaaSGrid platform is the ability to work against a "mock" SaaSGrid environment when developing locally. An XML file is read when executing code locally to establish the context of the user and tenant. This article will describe the options that you have for how to locate and reference this file when developing on SaaSGrid.&lt;br /&gt;&lt;br /&gt;There are two options for specifying the location of the SaaSGrid Settings file:&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Place a file called &lt;i&gt;SaaSGrid.cfg.xml&lt;/i&gt; in the root directory of your client code (typically a web project)&lt;/li&gt;
&lt;li&gt;Place a file in a specific location, and configure the client code to look for it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Option 1: Root Directory&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This option is the easiest option, and happens by default when creating a new SaaSGrid Solution using Visual Studio.&lt;br /&gt;&lt;br /&gt;If you need to do this manually, follow these steps:&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Right-click the project in Visual Studio&lt;/li&gt;
&lt;li&gt;Under the &lt;b&gt;SaaSGrid&lt;/b&gt; category, choose &lt;b&gt;SaaSGrid Configuration File&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Call the file &lt;b&gt;SaaSGrid.cfg.xml&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;b&gt;Option 2: Specific Location&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Sometimes an alternate location for the configuration file is needed. Common scenarios include sharing the file between multiple users or projects. &lt;br /&gt;&lt;br /&gt;First, create the configuration file in the desired location. Then, update either the &lt;b&gt;App.config&lt;/b&gt; or &lt;b&gt;Web.config&lt;/b&gt; with the following sections:&lt;br /&gt;&lt;br /&gt;

&lt;code&gt;
&amp;lt;configSections&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;section name="saaSGridLocal" type="System.Configuration.AppSettingsSection"/&amp;gt;&lt;br /&gt;
&amp;lt;/configSections&amp;gt;&lt;br /&gt;&lt;br /&gt;

&amp;lt;saaSGridLocal&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;add key="configFile" value="disk(\)::driveletter:@\Path\to\file.cfg.xml"/&amp;gt;&lt;br /&gt;
&amp;lt;/saaSGridLocal&amp;gt;&lt;br /&gt;&lt;br /&gt;
&lt;/code&gt;

Finally, update the configFile key point to the appropriate location.&lt;br /&gt;&lt;br /&gt;If you need additional information, see the &lt;a href="http://64.34.180.162/files/folders/developer_guides/entry11.aspx" title="Developing on SaaSGrid" mce_href="http://64.34.180.162/files/folders/developer_guides/entry11.aspx"&gt;Developing on SaaSGrid&lt;/a&gt; reference guide, also installed with the &lt;a href="http://64.34.180.162/files/folders/sdk/entry12.aspx" title="SaaSGrid SDK" mce_href="http://64.34.180.162/files/folders/sdk/entry12.aspx"&gt;SaaSGrid SDK&lt;/a&gt;. &lt;br /&gt;&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://community.saasgrid.com/aggbug.aspx?PostID=730" width="1" height="1"&gt;</content><author><name>pmiles</name><uri>http://community.saasgrid.com/members/pmiles/</uri></author></entry><entry><title>Want to use SaaSGrid meters to limit pageviews?</title><link rel="alternate" type="text/html" href="/developers/b/team/archive/2009/01/29/want-to-use-saasgrid-meters-to-limit-pageviews.aspx" /><id>/developers/b/team/archive/2009/01/29/want-to-use-saasgrid-meters-to-limit-pageviews.aspx</id><published>2009-01-29T19:26:00Z</published><updated>2009-01-29T19:26:00Z</updated><content type="html">&lt;p&gt;A nifty aspect of the SaaSGrid API and the various contexts (Tenant, User, Subscription) is that they are accessible at any point in the lifecycle of an ASP.NET request in your application.&amp;nbsp; You are not limited to accessing the API in the codebehind of your ASPX pages or other UI handlers. You can use many other ASP.NET features in conjunction with the SaaSGrid API.&amp;nbsp; A perfect example is HttpModules.&amp;nbsp; Consider the following example, where an ISV wants customers to pay for viewing a particular URL or resource type within their application:&lt;/p&gt;&lt;p&gt;The ISV writes an HttpModule called PageViewModule. The module's handler for BeginRequest looks like this:&lt;/p&gt;&lt;p&gt;[code language="csharp"]&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpContext ctx = HttpContext.Current;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SubscriptionContext subscriptionCtx = SubscriptionContext.Instance;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (subscriptionCtx.IsBlockExhausted("PageViews").Value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.Response.Write("I'm sorry, you've exceeded the number of page views allowed by your subscription.");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.Response.End();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;/p&gt;&lt;p&gt;[/code] &lt;/p&gt;&lt;p&gt;The handler simply checks against the SaaSGrid API to see if the block meter called "PageViews" is exhausted, and if it is the handler writes to the response stream and then aborts processing using Response.End() - the only thing sent back to the browser will be the text "I'm sorry, you've exceeded the number of page views allowed by your subscription". Now imagine a scenario where a customer purchases a subscription that comes with 1,000 pageviews... on the 1,001th page view the user of that subscription will receive this message. The ISV may give the customer the ability to purchase more blocks of PageViews, thus adding to the meter - 1,000 included, blocks of +500 for $10 each. The possibilities are terrific!&lt;/p&gt;&lt;p&gt;But, if we're going to limit the user's page views, we're going to need to decrement the "PageView" meter each time they utilize its functionality.&amp;nbsp; Using the SaaSGrid API, the implementation for that is simple, and it is found in the handler for EndRequest within the HttpModule:&lt;/p&gt;&lt;p&gt;[code language="csharp"] &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SubscriptionContext subscriptionCtx = SubscriptionContext.Instance;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!subscriptionCtx.IsBlockExhausted("PageViews").Value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sCtx.DecrementBlock("PageViews");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;[/code]&lt;/p&gt;&lt;p&gt;We do this in the EndRequest handler because we only want to decrement the block meter "PageViews" if we are certain that the response is going to make it back to browser, and that there were no internal errors during processing the request that caused the request to abort (You could also check Server.LastError to ensure that all went well and that the user is not going to get back an error page instead of what they were expecting).&lt;/p&gt;&lt;p&gt;And there we have an HttpModule that will allow a user to make X requests (where X is the size of the block "PageViews" that they purchased as part of their subscription), and then gives the user a simple message telling them that they've used up the block. &lt;/p&gt;&lt;p&gt;Don't forget that an HttpModule applies to all requests within the web application. It's up to you to get creative in the module if you want to limit which request types, filetypes, or query string parameters will affect the usage of a meter.&amp;nbsp; For instance, if you built an application that renders images in various forms, and there is a query string parameter that tells your application to render the image in hi-res, but you have a block meter that limits the number of hi-res images a user can view, you can check for that query string parameter before decrementing the block!&amp;nbsp; If the hi-res block is exhausted, simply do a Response.Redirect() to the url of a placeholder image that let's the user know they've exceeded the number of hi-res images they are allowed to view.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://community.saasgrid.com/aggbug.aspx?PostID=729" width="1" height="1"&gt;</content><author><name>mammerman</name><uri>http://community.saasgrid.com/members/mammerman/</uri></author></entry><entry><title>Approaches to calling a WCF service from Javascript</title><link rel="alternate" type="text/html" href="/developers/b/team/archive/2009/01/29/approaches-to-calling-a-wcf-service-from-javascript.aspx" /><id>/developers/b/team/archive/2009/01/29/approaches-to-calling-a-wcf-service-from-javascript.aspx</id><published>2009-01-29T13:34:00Z</published><updated>2009-01-29T13:34:00Z</updated><content type="html">&lt;p&gt;Most existing Javascript frameworks (Microsoft AJAX, ExtJS, jQuery, etc) give the client developer a clean and easy way to make AJAX calls to the server, receive data back, and update a portion of the current page without needing to make a roundtrip post that reloads the entire page. The newest release of ASP.NET contain classes that make this process even easier, especially when contacting WCF service endpoints directly from Javascript.&lt;/p&gt;&lt;p&gt;&lt;u&gt;Consuming a WCF Service From Javascript&lt;/u&gt;&lt;b&gt;&lt;u&gt; Within an ASP.NET Web Application&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;ASP.NET provides a set of classes and controls that make consuming WCF services quite easy.&amp;nbsp; This is because these controls actually generate Javascript proxy classes for you on the client that wrap all interaction with the WCF service.&amp;nbsp; This makes communicating with WCF from Javascript very similar to doing the same in C#.&amp;nbsp; The key to consuming WCF web services from the client in an ASP.NET application is the ScriptManager control.&amp;nbsp; When this control is included on the page, it is able to read the WSDLs of included WCF service references and it outputs Javascript proxy code to the browser.&amp;nbsp; This makes Javascript objects available to the rest of your client scripts after the page loads.&amp;nbsp; Here's how to consume a WCF called 'MyWCFService' using the ScriptManager control:&lt;/p&gt;&lt;p&gt;[code language="csharp"]&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:ScriptManager runat="server"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Services&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:ServiceReference Path="MyWCFService.svc" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Services&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:ScriptManager&amp;gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;[/code] &lt;/p&gt;&lt;p&gt;The inclusion of MyWCFService via a ServiceReference tag tells the ScriptManager control to 'consume' the WSDL of the WCF service located at the specified path and output javascript to the browser.&amp;nbsp; There are articles online that describe this process in greater detail.&amp;nbsp; Basically, this means that if the full namespace of your MyWCFService class is MyApp.MyWCFService, you will now have a Javascript object called MyApp.MyWCFService whose prototype contains all the methods of your web service, and you can call them in Javascript as if they were simply another method on your client:&lt;/p&gt;&lt;p&gt;[code language="javascript"]&lt;/p&gt;&lt;p&gt;var results = MyApp.MyWCFService.Method1(parameters); &lt;br /&gt;&lt;/p&gt;&lt;p&gt;[/code] &lt;/p&gt;&lt;p&gt;For more information and detailed samples, see &lt;a href="http://www.asp.net/ajax/documentation/live/" mce_href="http://www.asp.net/ajax/documentation/live/"&gt;http://www.asp.net/ajax/documentation/live/&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;u&gt;Consuming a WCF Service From Javascript &lt;b&gt;Outside of an ASP.NET Web Application&lt;/b&gt;&lt;/u&gt; &lt;/p&gt;&lt;p&gt;You may want to contact a WCF service from Javascript outside of an ASP.NET web application (for instance if you are building desktop apps or widgets that communicate with your SaaSGrid app), which means you'll be doing so without the benefit of the ScriptManager control.&amp;nbsp; Because a hosted WCF service exposes a WSDL contract just like any other web service (think of ASMX, for example), you can still contact that web service using Javascript. If you are using the Microsoft Ajax client libraries, you can make an asyncronous web service call like this:&lt;/p&gt;&lt;p&gt;[code language="javascript"]&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sys.Net.WebServiceProxy.invoke(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'MyWCFService.svc',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Method1',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { parameters as json },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; successCallbackFunction,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; errorCallbackFunction, timeoutCallbackFunction);&amp;nbsp; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;[/code] &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Not surprisingly, this is actually what your ScriptManager-generated proxy classes do within an ASP.NET application like in the example above. Just, in this case, you are calling the WCF service directly yourself using the Microsoft Ajax client library built-in Ajax utilities.&amp;nbsp; For more information about this method of calling a WCF web service from Javascript, view the&amp;nbsp; documentation on using the &lt;a href="http://www.asp.net/AJAX/Documentation/Live/ClientReference/Sys.Net/WebServiceProxyClass/WebServiceProxyInvokeMethod.aspx" mce_href="http://www.asp.net/AJAX/Documentation/Live/ClientReference/Sys.Net/WebServiceProxyClass/WebServiceProxyInvokeMethod.aspx"&gt;Sys.Net.WebServiceProxy invoke&lt;/a&gt; method for communication.&lt;/p&gt;&lt;p&gt;Another technique, if you don't have access directly to the WCF service endpoint via the web, is to make a front-end web service using ASP.NET's ASMX structure, and communicate with that endpoint from your Javascript.&amp;nbsp; From within your ASMX web service class, you can use a proxy to communicate with your WCF service just as you would if you were utilizing the WCF service from a code-behind on an ASPX page.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Hopefully this information will be useful when you are designing the methods of communication you will use from the client to your web services deployed on SaaSGrid.&amp;nbsp; If you have any questions, feel free to post them in the comments or email me directly at mammerman [at] apprenda [dot] com.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://community.saasgrid.com/aggbug.aspx?PostID=728" width="1" height="1"&gt;</content><author><name>mammerman</name><uri>http://community.saasgrid.com/members/mammerman/</uri></author></entry><entry><title>Writing Silverlight User Interfaces for SaaSGrid Applications</title><link rel="alternate" type="text/html" href="/developers/b/team/archive/2009/01/22/writing-silverlight-user-interfaces-for-saasgrid-applications.aspx" /><id>/developers/b/team/archive/2009/01/22/writing-silverlight-user-interfaces-for-saasgrid-applications.aspx</id><published>2009-01-22T17:26:00Z</published><updated>2009-01-22T17:26:00Z</updated><content type="html">
&lt;p&gt;SaaSGrid application deployments support a variety of technologies at the user interface layer. Consider the following scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Standard &lt;a href="http://www.asp.net" target="_blank" mce_href="http://www.asp.net"&gt;ASP.NET&lt;/a&gt; web user interface using traditional WebForms.&lt;/li&gt;

&lt;li&gt;Standard &lt;a href="http://www.asp.net" target="_blank" mce_href="http://www.asp.net"&gt;ASP.NET&lt;/a&gt; web user interface using the new &lt;a href="http://www.asp.net/mvc" target="_blank" mce_href="http://www.asp.net/mvc"&gt;ASP.NET MVC Framework&lt;/a&gt; &lt;/li&gt;

&lt;li&gt;"Client only" user interface utilizing client frameworks such as &lt;a href="http://ajax.asp.net" target="_blank" mce_href="http://ajax.asp.net"&gt;Microsoft Ajax&lt;/a&gt;, &lt;a href="http://www.extjs.com" target="_blank" mce_href="http://www.extjs.com"&gt;ExtJs&lt;/a&gt;, &lt;a href="http://developer.yahoo.com/yui/" target="_blank" mce_href="http://developer.yahoo.com/yui/"&gt;YUI&lt;/a&gt;, or &lt;a href="http://www.mootools.net" target="_blank" mce_href="http://www.mootools.net"&gt;MooTools&lt;/a&gt;.&lt;/li&gt;

&lt;li&gt;"Client only" user interface utilizing presentation frameworks such as &lt;a href="http://www.adobe.com/products/flash/" target="_blank" mce_href="http://www.adobe.com/products/flash/"&gt;Flash&lt;/a&gt; or &lt;a href="http://www.microsoft.com/silverlight/" target="_blank" mce_href="http://www.microsoft.com/silverlight/"&gt;Silverlight&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the case of user interfaces that implement data retrieval by way of AJAX requests, developers will need to create an intermediary ASP.NET web service (typically .asmx files) in their user interface project that communicates with the backing WCF services of their application. &lt;/p&gt;

&lt;p&gt;&lt;b&gt;This requirement applies to user interfaces built with Silverlight.&lt;/b&gt;
Here is an good article that explains how to implement this technique
from a Silverlight frontend:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.silverlightshow.net/items/Consuming-ASMX-Web-Services-with-Silverlight-2.aspx" target="_blank" mce_href="http://www.silverlightshow.net/items/Consuming-ASMX-Web-Services-with-Silverlight-2.aspx"&gt;Consuming ASMX Web Services with Silverlight 2&lt;/a&gt;&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;img src="http://64.34.180.162/blogs/saasgriddevs/silverlightsaasgrid.jpg" title="Consuming ASMX Web Service From Silverlight" alt="Consuming ASMX Web Service From Silverlight" mce_src="http://64.34.180.162/blogs/saasgriddevs/silverlightsaasgrid.jpg" width="618" align="middle" height="413" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://community.saasgrid.com/aggbug.aspx?PostID=727" width="1" height="1"&gt;</content><author><name>mammerman</name><uri>http://community.saasgrid.com/members/mammerman/</uri></author></entry><entry><title>Starting WCF Services in Visual Studio 2005</title><link rel="alternate" type="text/html" href="/developers/b/team/archive/2009/01/20/starting-wcf-services-in-visual-studio-2005.aspx" /><id>/developers/b/team/archive/2009/01/20/starting-wcf-services-in-visual-studio-2005.aspx</id><published>2009-01-21T02:06:00Z</published><updated>2009-01-21T02:06:00Z</updated><content type="html">&lt;p&gt;Unlike Visual Studio 2008, Visual Studio 2005 provides no automatic way to launch a WCF Service. This is a major pain point for those of you developing SaaSGrid applications, but this article leads you through the process of creating a simple helper project that can start one or more WCF Services inside of Visual Studio 2005.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This article was written specifically to work with the Calculator example, which is created during a tutorial included with the QuickStart document (installed with the SDK). It should be easy to adapt this example to your specific implementation, but if you have any trouble, don't hesitate to post to our &lt;a href="http://64.34.180.162/forums/" title="Developer Forums" mce_href="http://64.34.180.162/forums/"&gt;developer forums&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Right-click on the open solution, and add choose &lt;b&gt;Add -&amp;gt; New Project&lt;/b&gt;.&lt;/li&gt;

&lt;li&gt;Choose &lt;b&gt;Console Application&lt;/b&gt; as the project type, and set the name to ServiceStarter. Press OK.&lt;br /&gt;&lt;/li&gt;

&lt;li&gt;For the new project, add these references:&lt;/li&gt;

&lt;/ol&gt;&lt;ul&gt;
&lt;li&gt;CalculatorService (project reference)&lt;/li&gt;&lt;li&gt;Apprenda.Execution.CallContextStorage&lt;/li&gt;&lt;li&gt;Apprenda.FSDrivers&lt;br /&gt;&lt;/li&gt;

&lt;li&gt;SaaSGrid.API.Local&lt;/li&gt;

&lt;li&gt;System.ServiceModel&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;Edit the &lt;b&gt;Main&lt;/b&gt; method in &lt;b&gt;Program.cs&lt;/b&gt; to look like the following:&lt;br /&gt;&lt;/li&gt;


&lt;/ul&gt;&lt;pre&gt;    static void Main(string[] args)&lt;br /&gt;    {&lt;br /&gt;        ServiceHost host1 = new ServiceHost(typeof(Calculator));&lt;br /&gt;&lt;br /&gt;        host1.Open();&lt;br /&gt;&lt;br /&gt;        Console.WriteLine("Services started; press Enter to stop.");&lt;br /&gt;        Console.ReadLine();&lt;br /&gt;&lt;br /&gt;        try&lt;br /&gt;        {&lt;br /&gt;            host1.Close();&lt;br /&gt;        }&lt;br /&gt;        catch { }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;

&lt;ul&gt;&lt;li&gt;Add the following using directives:&lt;/li&gt;
&lt;/ul&gt;&lt;pre&gt;    using System.ServiceModel;&lt;br /&gt;    using CalculatorService;&lt;/pre&gt;

&lt;ul&gt;&lt;li&gt;Verify that the solution compiles.&lt;/li&gt;
&lt;li&gt;Right-click the &lt;b&gt;ServiceStarter&lt;/b&gt; project and add a new &lt;b&gt;Application Configuration File&lt;/b&gt;.Keep the default name and press OK.&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Copy the contents of &lt;b&gt;App.config&lt;/b&gt; from the &lt;b&gt;CalculatorService&lt;/b&gt; project into the one that you just created.&lt;/li&gt;
&lt;li&gt;You should now be able to run the service. To do so, right-click on the project, select &lt;b&gt;Debug -&amp;gt; Start New Instance&lt;/b&gt;. If the service is started you'll see &lt;i&gt;"Services started; press Enter to stop."&lt;/i&gt;&lt;br /&gt;&lt;/li&gt;


&lt;/ul&gt;&lt;p&gt;You can now run the UI in addition to the service if you are ready to test your service calls. Leave the service running using the steps above, but detach from it by selecting &lt;b&gt;Debug -&amp;gt; Detach All&lt;/b&gt;. The command window should still be open, leaving the service running, but you can now start up any other project using conventional means.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://community.saasgrid.com/aggbug.aspx?PostID=726" width="1" height="1"&gt;</content><author><name>pmiles</name><uri>http://community.saasgrid.com/members/pmiles/</uri></author></entry><entry><title>Introducing the SaaSGrid Mocker!</title><link rel="alternate" type="text/html" href="/developers/b/team/archive/2009/01/08/introducing-the-saasgrid-mocker.aspx" /><id>/developers/b/team/archive/2009/01/08/introducing-the-saasgrid-mocker.aspx</id><published>2009-01-08T14:46:00Z</published><updated>2009-01-08T14:46:00Z</updated><content type="html">&lt;p mce_keep="true"&gt;&lt;b&gt;&lt;a href="http://community.saasgrid.com/images/old-content/Taskr.png"&gt;&lt;/a&gt;Who should read this article?&lt;/b&gt;&lt;br&gt;If you are developing a SaaSGrid application you should read this article to understand how the new SaaSGrid Mocker can help you debug your application right from Visual Studio prior to deploying it to a cloud instance of SaaSGrid.&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;b&gt;What is the SaaSGrid Mocker?&lt;br&gt;&lt;/b&gt;The SaaSGrid Mocker is a new tool that allows developers to easily mock out a simulation SaaSGrid environment to test and debug their applications locally. Using the Mocker, developers can test different subscription, customer and security scenarios during development without having to test in the cloud.&lt;/p&gt;
&lt;p mce_keep="true"&gt;When developing SaaSGrid applications, developers have the ability to use the API to tap into certain resources available through SaaSGrid such as user information, feature metering, securables and other data.&amp;nbsp; These resources are available in a live environment based on the logged in user, their credentials and their subscription. To simulate this on a local environment the SaaSGrid SDK provides a local implementation that simulates the live environment based on an XML definition (known as SaaSGrid.cfg.xml files).&lt;/p&gt;
&lt;p mce_keep="true"&gt;The SaaSGrid Mocker is a front end to a standard, hand-modifiable SaaSGrid configuration file, thus allowing for easier manipulation. It can be used to either modify an on-disk file or can be used to attach to a locally executing SaaSGrid application and modify execution settings at runtime.&lt;/p&gt;
&lt;p mce_keep="true"&gt;So let’s take a look at using the SaaSGrid Mocker:&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;b&gt;Using the SaaSGrid Mocker:&lt;/b&gt;&lt;/p&gt;&lt;p mce_keep="true"&gt;To start, &lt;a href="/files/folders/tools/default.aspx" title="SaaSGrid Tools" mce_href="/files/folders/tools/default.aspx"&gt;download the SaaSGrid Mocker here&lt;/a&gt;. &lt;br&gt;&lt;/p&gt;
&lt;p mce_keep="true"&gt;The SaaSGrid Mocker can be divided into two primary functional areas:&lt;/p&gt;&lt;p mce_keep="true"&gt;1) A "database" of mock customers (the local SaaSGrid Tenants section in the configuration file). &lt;/p&gt;&lt;p mce_keep="true"&gt;2) A section that establishes runtime parameters, such as which customer to 'Run As' and any subscription parameters that will dictate the behavior you are testing (the local SaaSGrid ExecutionContext section in the configuration file).&lt;br&gt;&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;b&gt;Customers Section&lt;/b&gt;&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;a href="http://community.saasgrid.com/images/old-content/customers.png" mce_href="http://community.saasgrid.com/images/old-content/customers.png"&gt;&lt;img src="http://community.saasgrid.com/images/old-content/customers.png" mce_src="http://community.saasgrid.com/images/old-content/customers.png" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;b&gt;Application Parameters&lt;/b&gt;&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;a href="http://community.saasgrid.com/images/old-content/Securables.png" mce_href="http://community.saasgrid.com/images/old-content/Securables.png"&gt;&lt;img src="http://community.saasgrid.com/images/old-content/Securables.png" mce_src="http://community.saasgrid.com/images/old-content/Securables.png" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;b&gt;Running Customer&lt;/b&gt;&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;a href="http://community.saasgrid.com/images/old-content/Features.png" mce_href="http://community.saasgrid.com/images/old-content/Features.png"&gt;&lt;img src="http://community.saasgrid.com/images/old-content/Features.png" mce_src="http://community.saasgrid.com/images/old-content/Features.png" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p mce_keep="true"&gt;By changing which one of your customers is running the application or by modifying execution parameters such as meters that the user has access to, you can see how your application handles boundary conditions when features are disabled or simply exhausted and test your applications reaction to those changes.&lt;/p&gt;
&lt;p mce_keep="true"&gt;Next we will follow along&amp;nbsp;with a simple case&amp;nbsp;using the &lt;a href="/files/folders/samples/default.aspx" class="" title="Download the example to follow along!" target="_blank" mce_href="/files/folders/samples/default.aspx"&gt;Taskr&amp;nbsp;example&lt;/a&gt; to see how you can use the SaaSGrid Mocker to help you when developing locally.&amp;nbsp;&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;b&gt;Following along with Taskr!&lt;/b&gt;&lt;/p&gt;
&lt;p mce_keep="true"&gt;The first thing you need to do is download the Taskr example on the community portal and get it up and running. Once you get Taskr running you should see a screen like this one:&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;a href="http://community.saasgrid.com/images/old-content/Taskr.png"&gt;&lt;img src="http://community.saasgrid.com/images/old-content/Taskr.png" width="75%" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p mce_keep="true"&gt;After Taskr is up and running you should be able to attach with the mocker so that you can load the current configuration being used. You do this by either pressing Ctrl+Shift+O or by clicking Options | Live Debugging | Load Configuration. Once the configuration is loaded you should see this in the mocker:&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;a href="http://community.saasgrid.com/images/old-content/Live%20%Loaded%20Mocker.png"&gt;&lt;img src="http://community.saasgrid.com/images/old-content/Live%20%Loaded%20Mocker.png" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Notice how in the Execution Context the running user is Jorge Lucas which matches the welcome message of Taskr!. Try switching the running as user to something else, push the configuration changes back to Taskr (Ctrl+Shift+S or Options | Live Debugging | Push Configuration) and notice how the welcome message should be for the newly selected user.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://community.saasgrid.com/images/old-content/Running%20As%20Jorge.png"&gt;&lt;img src="http://community.saasgrid.com/images/old-content/Running%20As%20Jorge.png" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It's easy to see how with the help of the Mocker you can easily test different scenarios on how your application behaves depending on different subscription cases, for example when the running user has reached the maximum count for an allowed limiter, or when a feature is not available to a user or when a user doesn't have the necessary roles to access a securable or many other examples.&lt;/p&gt;
&lt;p&gt;We invite you to &lt;a href="/files/folders/tools/default.aspx" title="SaaSGrid Tools" mce_href="/files/folders/tools/default.aspx"&gt;start using the Mocker&lt;/a&gt; to help you build your SaaSGrid application's and give us feedback on how we can improve it.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Problems you may encounter:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The SaaSGrid Mocker was only introduced with the SaaSGrid SDK v1.5 released on January 08 2009, if you are trying to attach to an application that was developed with an earlier version of the SDK you won't be able to. In order to attach to&amp;nbsp;an older application you must first download and install the latest version of the SDK &lt;a href="/files/folders/sdk/default.aspx" class="" title="Download the latest version of the SDK" target="_blank" mce_href="/files/folders/sdk/default.aspx"&gt;here&lt;/a&gt;&amp;nbsp;and then modify the Web.config of your root web application to include the following:&lt;/p&gt;
&lt;p&gt;[code lang="xml"]&lt;/p&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;
&lt;/font&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#a31515"&gt;&lt;font size="2" color="#a31515"&gt;configSections&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#a31515"&gt;&lt;font size="2" color="#a31515"&gt;section&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#ff0000"&gt;&lt;font size="2" color="#ff0000"&gt;name&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;=&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;saaSGridLocal&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#ff0000"&gt;&lt;font size="2" color="#ff0000"&gt;type&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;=&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;System.Configuration.AppSettingsSection&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;"&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt; /&amp;gt;&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#a31515"&gt;&lt;font size="2" color="#a31515"&gt;configSections&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;
&lt;/font&gt;&lt;/font&gt;&lt;p&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#a31515"&gt;&lt;font size="2" color="#a31515"&gt;saaSGridLocal&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#a31515"&gt;&lt;font size="2" color="#a31515"&gt;add&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#ff0000"&gt;&lt;font size="2" color="#ff0000"&gt;key&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;=&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#000000"&gt;"&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;allowLiveAttaching&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#000000"&gt;"&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#ff0000"&gt;&lt;font size="2" color="#ff0000"&gt;value&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;=&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#000000"&gt;"&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;true&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#000000"&gt;"&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;/&amp;gt;&lt;br&gt;&amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#a31515"&gt;&lt;font size="2" color="#a31515"&gt;saaSGridLocal&lt;/font&gt;&lt;/font&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;font size="2" color="#0000ff"&gt;&lt;font size="2" color="#0000ff"&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
&lt;p&gt;[/code]&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://community.saasgrid.com/aggbug.aspx?PostID=725" width="1" height="1"&gt;</content><author><name>asultan</name><uri>http://community.saasgrid.com/members/asultan/</uri></author></entry><entry><title>Microsoft SaaS Architecture Team Experiences SaaSGrid</title><link rel="alternate" type="text/html" href="/developers/b/team/archive/2008/09/12/microsoft-saas-architecture-team-experiences-saasgrid.aspx" /><id>/developers/b/team/archive/2008/09/12/microsoft-saas-architecture-team-experiences-saasgrid.aspx</id><published>2008-09-12T10:16:00Z</published><updated>2008-09-12T10:16:00Z</updated><content type="html">&lt;p&gt;Recently, we had the opportunity to demo SaaSGrid to Eugenio Pace and Gianpaolo Carraro from Microsoft's SaaS Architecture team. You can read about their impressions of the platform here:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/eugeniop/archive/2008/09/11/northwind-hosting-exists-it-s-better-than-what-you-saw-and-it-s-called-saasgrid.aspx" title="Northwind Hosting exists, it's better than what you saw and it's called SaaSGrid" target="_blank" mce_href="http://blogs.msdn.com/eugeniop/archive/2008/09/11/northwind-hosting-exists-it-s-better-than-what-you-saw-and-it-s-called-saasgrid.aspx"&gt;Northwind Hosting exists, it's better than what you saw and it's called SaaSGrid&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;During the demo, Apprenda's team and the SaaS Architecture team from Microsoft had some terrific conversations surrounding all of the ideas they've expressed over the course of the past couple of years. One key concept that kept coming up was about the 'non-intrusive' nature of SaaSGrid. This was especially great to hear during this conversation because we've taken great care while designing SaaSGrid to ensure that the platform provides expected platform-esque services without clobbering the efforts of ISVs who deploy to it. We believe that ISVs should not have to relinquish their IP by uploading source code through mangling processes, or worse yet, write their SaaS apps in a new proprietary language among other things.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Sinclair Schuller helps the conversation along in his newest SaaSBlogs post: &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.saasblogs.com/2008/09/12/how-important-is-non-intrusiveness-in-a-paas-offering/" target="_blank" mce_href="http://www.saasblogs.com/2008/09/12/how-important-is-non-intrusiveness-in-a-paas-offering/"&gt;How Important Is "Non Intrusiveness" In A PaaS Offering?&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://community.saasgrid.com/aggbug.aspx?PostID=713" width="1" height="1"&gt;</content><author><name>mammerman</name><uri>http://community.saasgrid.com/members/mammerman/</uri></author></entry></feed>