Next ensure the toolbox is open and the Windows Workflow V3 node is expanded. Drag and drop a FaultHandler activity onto the Drop FaultHandlerActivity Here text.
In the Workflow Exceptions window select the faultHandlerActivity1 red exclamation, choose the Property 'FaultType' is not set or its value cannot be resolved to an actual type option.
In the properties window select the FaultType property ellipses, in the Browse and Select a .NET type window Select Referenced Assemblies | mscorlib on the Type tab. Select the System type, locate Exception in the type name column (scroll the right pane down) Select the Exception type name (System.Exception) and select OK.
In the Visual Studio Toolbox expand the Sharepoint Workflow node, Drag and drop a LogToHistoryListActivity activity into the Drop Activities Here text. Drag and drop a SetState activity on the line below the logToHistoryListActivity1 shape
Next I'll configure the Log to History List Activity to write the exception details to the Workflow History List and the Set State Activity to end the Workflow with a custom status called Error Logged.
On the InfoPathWorkflow design surface right click the logToHistoryListActivity1 shape and select the properties option. Select the HistoryDescription property and click the ellipsis.
In the Bind History Description dialog expand faultHandlersActivity1 | faultHandlerActivity1 | Fault | Message and select OK
In the properties window select the HistoryOutcome property and click the ellipsis. In the bind History Outcome to an activity dialog expand faultHandlersActivity1 | faultHandlerActivity1 | Fault - Select the StackTrace option and select OK
In the Visual Studio Solution Explorer double click the elements.xml file
Replace the metadata node and its contents with the following code
<MetaData>
<ExtendedStatusColumnValues>
<StatusColumnValue>Error Logged</StatusColumnValue>
</ExtendedStatusColumnValues>
</MetaData>
Back to the design surface for the Infopath workflow, double click the setState1 Activity, replace the setState1_MethodInvoking with the following code
private void setState1_MethodInvoking(object sender, EventArgs e)
{
setState1.State = (int)SPWorkflowStatus.Max;
}
This code will set the workflow state to the custom StatusColumnValue defined in the elements.xml file
Back to the workflow design surface, select the red exclamation next to setState1 activity
Choose the Activity setState1 does not have CorrelationToken property set, select the correlationtoken property dropdow: workflowToken
Now when an exception occurs it will be handled and logged as shown below
Create a New Site Collection and Add Quicklaunch Link to Site
The next part of this tutorial will involve programmatically creating a new site collection if the site name condition is met on the list we are attaching this custom workflow to.
Right click on the InfoPath workflow design surface and select view code. In the top area of the InfoPathWorkflow.cs file add the following import directive
using Microsoft.SharePoint.Navigation;
Next replace the method codeActivity1_ExecuteCode with the following code.
private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
//Get the Site Name
string SiteName =
workflowProperties.Item[SITE_NAME_COLUMN].ToString();
// Get the system token, instantiate new site and web objects
// in order to have permissions to create the new Site Collection
SPUserToken _sysToken = default(SPUserToken);
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite site = new SPSite(workflowProperties.Site.Url))
{
_sysToken = site.SystemAccount.UserToken;
}
});
using (SPSite siteCollection = new SPSite(workflowProperties.Site.Url, _sysToken))
{
using (SPWeb web = siteCollection.OpenWeb(workflowProperties.Web.ServerRelativeUrl))
{
//Gather user information
SPUser user = web.SiteAdministrators[0];
string adminLogin = getLoginName(user);
string adminEmail = user.Email;
string adminDisplayName = user.Name;
SPSite newSiteCollection = default(SPSite);
Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(
() =>
{
//Set the new site collection properties
newSiteCollection =
web.Site.WebApplication.Sites.Add(
"/sites/" + SiteName, // Url
SiteName,
"Site Created by Submitting InfoPath Form",
1033, // locale identifier - US English
"SGS#0", // Basic Group Work Site Template
adminLogin,
adminDisplayName,
adminEmail);
});
if (default(SPSite) != newSiteCollection)
{
// Add Site Collection Administrators
addSiteCollectionAdministrators(web.SiteAdministrators,
newSiteCollection.RootWeb.SiteAdministrators);
string newSiteCollectionUrl =
newSiteCollection.MakeFullUrl(newSiteCollection.ServerRelativeUrl);
// Add Site collection link to Quick Launch
SPNavigationNode projectSiteNode =
new SPNavigationNode(SiteName, newSiteCollectionUrl, true);
// Create or retrieve the Site Collections node
SPNavigationNode siteCollectionsNode =
ensureHeadingNode("Site Collections", web.Navigation.QuickLaunch);
siteCollectionsNode.Children.AddAsLast(projectSiteNode);
}
}
}
}
//Extract a readable username
private string getLoginName(SPUser user)
{
string loginName = default(string);
int pipePosition = user.LoginName.IndexOf("|");
if (0 >= pipePosition)
{
loginName = user.LoginName.Substring(pipePosition + 1);
}
else
{
loginName = user.LoginName;
}
return loginName;
}
// Add the Site Collection Administrators from
// the current Site Collection to the new Site Collection
private static void addSiteCollectionAdministrators(
SPUserCollection existingSiteAdmins, SPUserCollection newSiteAdmins)
{
// Add the Workflow's Site Collection Administrators
// to the new Site Collection
foreach (SPUser admin in existingSiteAdmins)
{
newSiteAdmins.Add(
admin.LoginName, admin.Email, admin.Name, admin.Notes);
}
}
// Add a custom SPQuickLaunchHeading NavNode
// if it doesn't already exist
private static SPNavigationNode ensureHeadingNode(
string nodeHeading, SPNavigationNodeCollection quickLaunch)
{
// Get the first NavNode in the Web's Quick Launch
SPNavigationNode projectSitesNode = quickLaunch[0];
if (nodeHeading != projectSitesNode.Title)
{
// Quick Launch Heading NavNode called nodeHeading
// linked to the Web's Home Page (empty string)
projectSitesNode =
new SPNavigationNode(nodeHeading, string.Empty);
quickLaunch.AddAsFirst(projectSitesNode);
}
return projectSitesNode;
}
Deploy and Test
The last part of this tutorial will involve deploying the Visual Studio Solution and testing.
From Visual Studio right click on the project name and select Deploy, ensure there are no errors in the build and wait for the process to complete.
Next, well visit the site that we deployed the workflow to, in my case it is at http://w2k8r2_2010dev/sites/apps/
Select the list that we created in step 1 - Issues
From the Ribbon select the List tab and Click the Workflow Settings dropdown | Add Workflow
Select the InfoPath Workflow from the available Workflows, enter a name for the workflow and select the Start this workflow when a new item is created checkbox
From the Issues List create a new item
Note: If your URL has an underscore (_) in it you will receive the following message: The form cannot be displayed in the browser because the use of session cookies has been disabled in the current browser settings
In my case and can simply change the machine name in the URL with Localhost after adding an alternate access mapping and everything works.
Next Add the new item - MyIssue, I'll intentionally leave the SiteName field blank to demonstrate the workflow functionality
Immediately after we submit the new item the status will change to Starting
Then the workflow status will quickly change to In Progress
The workflow status will remain at In Progress until we edit the item we submitted and add a SiteName
Note: If a SiteName is added initially the workflow will complete quickly on its own
Next I'll edit the entry and add the SiteName (MyIssues Site) and in a minute or two I will see the Quicklaunch area under Site Collections will be updated with the new SiteName. If this is the first entry then the Site Collections heading will be added and a link to the new site will be listed below.
This completes this tutorial. If you would like to download the Visual Studio Solution Click Here