Satya Kanithi's Professional Blog

April 5, 2011

My Experience with Visio Services/Workflow Visualization

Filed under: SharePoint 2010 — kanithis @ 10:00 pm

Here are my findings or thoughts on SharePoint Workflow with Visio Visualization so far…

Visio Graphics Service

SharePoint 2010 now offers Workflow Visualization using Visio 2010 and Visio Services. Before starting on using Visualization, you must have the Visio Graphics Service proxy running in the Farm, Otherwise you may see the error “There are no addresses available for this application.” as shown below

image

Some times even if you Start the Visio Services, you may see the above error, either have patience till worker process gets recycled or simple IISRESET on the server would work.

Visio 2010 Premium

Visio 2010 Premium has SharePoint stencils to create a simple SharePoint workflow, but this can only create basic flow and can not publish directly to SharePoint. Once you are done with Workflow you must Export to a VWI (Visio Workflow Interchange) file to further process in SharePoint designer as shown below.

image           image                    image

Using Visio Premium is not necessary to create Workflow Visualization as SharePoint designer is the utility that does create final diagram, however Its always best practice to use Visio first to have a skeleton of process if available.

Visio Workflow Interchange

What does VWI file contains, its basically like any other MS office file, its a ZIP file containing VDX(Visio Drawing), XOML (Main Workflow File), XOML.RULES(Stores all conditions and rules), XOML.WFCONFIG.XML(Configuration File). At this point XOML will only contains the basic flow. All these files will be used when you import the VWI to SharePoint designer. Take a look at any saved VWI file by adding .ZIP at the end.

image

If you see carefully VDX is the final file that will be displayed in the SharePoint site under Workflow Visualization

SharePoint Designer 2010

Once you have the VWI file, you need to import it using image

Now you can Edit the Workflow, here all the you might see various Steps and some Activities based on your Visio workflow. Most of the Activities in Visio will be converted as Activity holder with description of what that should do. These descriptions are very useful in the final diagram it creates as shown below.

image   –>  image

All these descriptions are stored as “ShapeText” under Description Attribute of the Element in XOML file. So if in any case, you have to add more descriptions in SharePoint designer, unfortunately you have to change the XOML file.

So what ever the changes you will make in the SPD, it will create a new VDX file (Visio Diagram). To do this you must set the Workflow property “Show workflow visualization on status page” and Visio Graphics Service running.

image

Changing workflow XML files

Workflow specific files such as XOML, XOML.RULES, xoml.wfconfig.xml can be changed from SPD but have to be careful.

You can always what are the files stored under the workflow from All Files section as shown below

image

XOML.WFCONFIG.XML file is the configuration file that contains configuration information about the workflow, like references to all XML files with version. When ever you change any of these XML file a new version will be created automatically. If you make any modifications in XOML  of V1.0, then your changes will be stored in server as V2.0, but the configuration file still refers the old XOML file unless you change it.

You might see this error “Visio Services was unable to load this Web Drawing……..” if the config xml is referring to the XOML version which is not available in the server.

image

One more important thing to consider when you are making changes to XOML file, SharePoint designer caches workflow data, so if you change the XOML file and open back in SPD it will not show your modifications unless you close the Site and re open it.

Understanding Configuration file (xoml.wfconfig.xml)

Here are the important attributes of the Config xml file

XomlHref : XOML File Name; XomlVersion: Version of the XOML file; RulesHref: XOML.RULES file; RulesVersion: Version of the Rules File; PreviewVersion: Current Visio Diagram Version; PreviewHref: Visio Diagram;

Note: Check this article on how to move the Workflow between lists

March 7, 2011

Calling a SharePoint page from Report Viewer web part using SP Dialog box

Filed under: SharePoint 2010 — kanithis @ 9:03 pm

If you are using a Report Viewer web part to show a SSRS report either in Native or Integrated mode and want to open a page in modal dialog box, i think its easy to use SP ModalDialog property and it looks much better in Share Point 2010.

In the report designer, under Placeholder properties of any text, add the following Expression for Action property

="javascript:void(SP.UI.ModalDialog.ShowPopupDialog(‘/SitePages/Test.aspx’))"

Its as simple as this, this will open the new page in a Share Point way. But make sure that Test.aspx is either an Application page or a ASPX page not any Web Part page that requires a Ribbon control, otherwise you might see this error below.

The Ribbon Tab with id: "Ribbon.Read" has not been made available for this page or does not exist.
Use Ribbon.MakeTabAvailable().

November 1, 2010

How to set permissions on Business Data Connectivity entities dynamically (Programmatically) in SP 2010

Filed under: SharePoint 2010 — kanithis @ 8:41 pm

Setting permissions on individual BDC entities using Central Admin in SharePoint 2010 is a big pain especially if there are several entities and several users/groups involved.

Following is the code based solution (Visual Studio) that will set permissions on certain BDC entities. We can either create a small Windows Project or put this in Feature receiver.

//Create Service Context Object ; site – is the SPSite Object , if using feature receiver , use SPFeatureReceiverProperties

SPServiceContext spc = SPServiceContext.GetContext(site);
BdcServiceApplicationProxy proxy = (BdcServiceApplicationProxy)spc.GetDefaultProxy(typeof(BdcServiceApplicationProxy)); //BDC proxy instance
AdministrationMetadataCatalog catalog = proxy.GetAdministrationMetadataCatalog(); //To administer the BDC service Metadata store
//Loop through the entities that  match wild card NameSpace (Custom) and wild card entity name (AdventureWorks) with active only

foreach (Entity entity in catalog.GetEntities("*Custom*", "*AdventureWorks*", true))
         {
            IAccessControlList acl = entity.GetAccessControlList();
           //Set access Execute, Edit, SelectableInClients and SetPermissions to Domain\Admin user

          acl.Add(new IndividualAccessControlEntry(BdcAccessControlList.TranslateFriendlyStringToEncodedClaim("Domain\\Admin"), BdcRights.Execute | BdcRights.Edit | BdcRights.SelectableInClients | BdcRights.SetPermissions));
          acl.Add(new IndividualAccessControlEntry(BdcAccessControlList.TranslateFriendlyStringToEncodedClaim("Domain\\Group1"), BdcRights.Execute | BdcRights.Edit | BdcRights.SelectableInClients));
           acl.Add(new IndividualAccessControlEntry(BdcAccessControlList.TranslateFriendlyStringToEncodedClaim("Domain\\User1"), BdcRights.Execute | BdcRights.Edit ));
           acl.Add(new IndividualAccessControlEntry(BdcAccessControlList.TranslateFriendlyStringToEncodedClaim("Domain\\User2"), BdcRights.Execute ));
            entity.SetAccessControlList(acl); //Set the permissions

               //Copy entity permissions to its methods so that they can be executed by the added user
               entity.CopyAclAcrossChildren();

        }

You might want to wrap the whole code as a delegate and run using SPSecurity.RunWithElevatedPrivileges

Also make sure when ever setting permissions on BDC entities using code model, one of the permissions must include SetPermissions otherwise the error “An error occurred while trying to assign an Access Control List to ‘IEntity’ with name ‘****’. At least one user/group in the Access Control List must have the SetPermissions right to avoid creating a non-manageable object.” is thrown.

September 10, 2010

Important points to consider while developing in SharePoint 2010

Filed under: SharePoint 2010 — kanithis @ 2:00 pm
  • While updating external list with a workflow you may often get the error “The workflow could not create the item in the external data source. Make sure the user has permissions to access the external data source and create items.”. To avoid this, you must use Secure Store ID for the External Content Type, and the App Pool account for the content web application must be included as a member of that SSID. Also the app pool account must have permissions to the ECT entity in the BDC service application.
  • External lists are not flexible enough as compared to regular list when it comes to customization of forms with InfoPath. External list forms do not support additional data connections.
  • When ever you make changes to the BDC entity, it happens to lose the permissions on the BDC entity. You always have to set permissions.
  • Updater method in BCS modal never provides detailed and proper information in Trace logs if any error occurs, but Creator method always provides detailed information to the point. So do the Creator method first and correct any Data Type mismatches and then Updater should work fine.
  • In order to implement Update/Delete/Insert operations on an external list using BCS modal (code solution), the underlying table must have a Primary Key

September 7, 2010

Application Error in EditForm of External List using custom BCS solution in SharePoint 2010

Filed under: SharePoint 2010 — kanithis @ 9:24 pm

 

I often received a web.config error message in EdiForm of an External List using a custom BCS model with my own implementations for Updater method in .NET assembly.

Trace logs showing an error message as “Application error when access /Lists/***/EditForm.aspx, Error=The data source control failed to execute the update command. ***** at Microsoft.SharePoint.WebPartPages.DataFormWebPart.UpdateCallback

This was frustrating as there are no details about this error, debugging using VS2010 did not help either.

So after weeks of trail and error i found out that one of the Data Type was defined as “String” in BCS Entity model but its actual Data Type should be “Character” as defined in LINQ to SQL object.

SharePoint BCS model is very stringent on Data Types and not very specific when reporting the error messages. Also it is important to make sure that Identifier field must have Updater Field be set to True in the Updater method.

May 12, 2010

How to create a dynamic rule or authorization in WCF service

Filed under: .NET — kanithis @ 4:51 pm

In order to create a dynamic or customized code for authorization, WCF provides a serviceauthorization, here is the way to implement it.

For example if i have a service which updates Employee information and need validation that only employees that have group ID as “12345” could be updated, in order to do this follow the below steps

  • Add a new class (Validation) to your project and have this class inherit from the ServiceAuthorizationManager class in the System.ServiceModel namespace. (The ServiceAuthorizationManager class provides an Overridable method called CheckAccess(). This passes information about the current request in the OperationContext, and also passes in the messgae data itself by reference.
  • Override the CheckAccess() method and the class should look like below

public class Validation : ServiceAuthorizationManager
    {
        public override bool CheckAccess(OperationContext operationContext, ref System.ServiceModel.Channels.Message message)
        {}

  • In the body of the function, remove any existing code. Since this validation is applied on all OperationContracts or Methods, you can add filters for specific actions, in my example i want this validation to apply only on OperationContract UpdateEmployee then following is the way to apply the filter

string action = operationContext.RequestContext.RequestMessage.Headers.Action;
if (action.EndsWith(“UpdateEmployee")){}

  • So once we have the filter then that is where we need to create a buffered copy of the message by calling the CreateBufferedCopy() of the message argument

var copy = message.CreateBufferedCopy(100000);

  • Using the copy variable, we can clone the message by calling the CreateMessage(), and then get access to the body contents by calling GetReaderAtBodyContents(). Store this into an XmlReader object, and also put this into using block to ensure cleanup. (Trick here is that we are only allowed to read the message once. So what we are doing is creating an in-memory buffer from the message, then using that to inspect the data.)

using (XmlReader reader = copy.CreateMessage().GetReaderAtBodyContents())
                {
                    while (reader.Read())
                    {

}}

  • From here, we’re using regular .NET XML code. Inside the loop check to see if the current node Name contains GroupID. (GroupID is the name of the element that holds the GroupID of the employee, its a part of DataMember). If it does, then read the contents of the element as a string, and check if the string contains the text “12345”. If it does, then access will be allowed, otherwise denied. Here is the complete code of the Validation class looks like.

public override bool CheckAccess(OperationContext operationContext, ref System.ServiceModel.Channels.Message message)
        {
            string action = operationContext.RequestContext.RequestMessage.Headers.Action;
            bool allowedAccess = false;

            if (action.EndsWith("UpdateEmployee"))
            {
                var copy = message.CreateBufferedCopy(100000);
                using (XmlReader reader = copy.CreateMessage().GetReaderAtBodyContents())
                {
                    while (reader.Read())
                    {
                        if (reader.Name.Contains("GroupID"))
                        {
                            string role = reader.ReadElementContentAsString();
                            allowedAccess = role.Contains("12345");
                        }
                    }
                }
                message = copy.CreateMessage(); //Generate a fresh copy of the message so that it can be processed by WCF.
            }
            else
            {
                allowedAccess = true;
            }
            return allowedAccess;
        }
    }

  • The final step is to plug this authorization class into your service using configuration as follows

<serviceBehaviors>
                <behavior name="Service1Behavior">
                    <serviceAuthorization serviceAuthorizationManagerType="Validation, Service1"/>
                </behavior>
            </serviceBehaviors>

How to hide Left Navigation Menu (Quick Launch) in SP

Filed under: MOSS 2007 — kanithis @ 1:42 pm

Quick Launch is rendered using a delegate control by SPContentSiteMap provider.

  1. One  way to remove the Quick Launch bar is to modify the Master Page to remove the delegate control
  2. Other way is to hide the Quick Launch in a Content Editor Web Part as follows.
    • Add Content Editor Web Part to a Web Part Zone
    • Select Edit – Modify Shared Web Part
    • Under Layout, check the Hidden option
    • Click the Source Editor button and add the following CSS
    • <style>
      .ms-navframe {
      display:none;
      }
      </style>

January 26, 2010

ADO .NET Entity Model Drawbacks

Filed under: .NET — kanithis @ 4:16 pm

Following are the drawbacks/issues of ADO .NET Entity Framework (VS2008/3.5 SP1) which i encountered so far…

  • The Update Model Wizard overwrites the existing storage model when updating the EDM based on database changes. This means that any custom changes you made to the storage model will not be reflected in the updated model. So if you have any custom entities, make a backup of the existing EDM file before doing the update from database. For this same reason i always work on XML notation rather than in designer. This is very frustrating especially if you have huge model with all custom tables, views and Stored Procedures.
  • Entity model always enforces to use propertyref key, if you have not specified one, it throws an error “EntityType ‘… ‘ has no key defined”. So always you have to define ref key and the key column must not be a null value column, this is true even for Views as well.
  • Should be very careful in setting the ref keys, if they are not properly set the LINQ queries against the entity object may not work properly especially if queries have orderby clause. Make sure the ref keys have unique output especially when you are using Views and the designer creates some sort of default Ref Keys and they may not be unique.
  • If you are trying to modify the key column, entity model throws an error message “XXX is part of the object’s key information and cannot be modified.” This does makes sense but not in some situations especially if the key column consists of multiple columns and you want to update the value of one of the column eventually it wouldn’t. To overcome this remove the column that you would like to be on update  from object’s key.
  • I often get the error “The number of members in the conceptual type ‘XXX’ does not match with the number of members on the object side type ‘XXX’. Make sure the number of members are the same.” when i edit the entity model (edmx) file using xml editor. This means that the designer and xml are not in sync, after the edits in xml file just open the edmx in entity designer and move stuff around and save it. Error gone…
  • No support for Batch Updates, only one command per action. Also no support for DML statements using EntityCommand object

January 7, 2010

Custom web.config changes using generic SharePoint feature receiver

Filed under: MOSS 2007 — kanithis @ 10:29 pm

While I was looking for a general solution to edit Web.Config using a SharePoint feature, I found an excellent article from Ryan McIntyre about creating an external XML file with all the custom modifications and using a common feature receiver, it would take the changes from the external xml file and merge them in web.config using SPWebConfigModification object.

I am impressed with this approach, as this will eliminate frequent changes to the feature receiver class and avoid compilation and rebuilding WSP. Just change the XML file and re activate the feature, it’s that simple. Enough said, details including the feature receiver class is in his site below.

http://randomdust.com/blogs/ryan/archive/2008/03/22/featurereceiver-for-applying-custom-web-config-changes.aspx

But the code Ryan used for feature receiver class, works only for element modifications not for creating new sections. In my case I got to create a new section in the web.config file for example “connectionStrings”. After further exploring the code, he used EnsureChildNode modification type, this will be good only for modifications, if you want create new sections we must use EnsureSection. But EnsueSection has a disadvantage, we can’t remove the sections from web.config on de activating the feature. But I felt it is fine to leave an empty section in the web.config, it doesn’t harm. Following are my modifications (highlighted) to the feature receiver class that Ryan developed, to accommodate both sections and elements.

protected SPFeatureReceiverProperties _properties;

public override void FeatureActivated(SPFeatureReceiverProperties properties) {

string fileLoc = properties.Definition.RootDirectory + “\\WebConfigChanges.xml”;

//Check to see if a WebConfigChanges.xml file exists. If yes, we have work to do

if (System.IO.File.Exists(fileLoc))

{

//Grab the properties

_properties = properties;

this.ProcessChanges(fileLoc, false);

}

}

public override void FeatureDeactivating(SPFeatureReceiverProperties properties) {

string fileLoc = properties.Definition.RootDirectory + “\\WebConfigChanges.xml”;

//Check to see if a WebConfigChanges.xml file exists. If yes, we have work to do

if (System.IO.File.Exists(fileLoc))

{ //Grab the properties

_properties = properties;

this.ProcessChanges(fileLoc, true);

}

}

public override void FeatureInstalled(SPFeatureReceiverProperties properties) {

/* no op */

}

public override void FeatureUninstalling(SPFeatureReceiverProperties properties) {

/* no op */

}

private void ProcessChanges(string FileLocation, bool removeModification)

{

string xPathLocation;

string elementName;

string sectionName;

Dictionary<string, string> attributes = new Dictionary<string, string>();

using (XmlReader reader = XmlReader.Create(FileLocation))

{

//Loop through all of the changes

while(reader.ReadToFollowing(“WebConfigChange”))

{

//Clean out any attributes from past iterations

attributes.Clear();

xPathLocation = reader.GetAttribute(“XPathLocation”);

elementName = reader.GetAttribute(“ElementName”);

//Check if there is any new Section required

sectionName = reader.GetAttribute(“SectionName”);

elementName = reader.GetAttribute(“ElementName”);

//Make sure we have at least a path and element

if (xPathLocation == null || elementName == null || sectionName == null)

throw new Exception(“WebConfigChange missing required XPathLocation or ElementName or SectionName attributes”);

//Get the Attributes to apply

if (reader.ReadToDescendant(“Attribute”))

{

do

{

attributes.Add(reader.GetAttribute(“Name”), reader.GetAttribute(“Value”));

} while (reader.ReadToNextSibling(“Attribute”));

}

//Do the update

UpdateWebConfig(xPathLocation, elementName, sectionName, attributes, removeModification);

}

}

}

private void UpdateWebConfig(string XPathLocation, string ElementName, string SectionName,

Dictionary<string, string> Attributes, bool removeModification)

{

try

{

SPWebApplication webApp = null;

//Get the web app

//First check if it was deployed to a Site Collection

SPSiteCollection siteCol = _properties.Feature.Parent as SPSiteCollection;

if (siteCol == null)

{

//Check if it was deployed to a site

SPSite site = _properties.Feature.Parent as SPSite;

if (site == null)

{

//Check if it was deployed to a Site

SPWeb web = _properties.Feature.Parent as SPWeb;

if (web != null)

webApp = web.Site.WebApplication;

}

else

webApp = SPWebApplication.Lookup(new Uri(site.Url));

}

else

webApp = siteCol.WebApplication;

if (webApp != null)

{

SPWebConfigModification modification;

//If no section name

if (SectionName == null)

{

modification = new SPWebConfigModification(ElementName + CreateAttributeString(Attributes), XPathLocation);

modification.Owner = “Company.MOSS.FeatureReceiver”;

modification.Sequence = 0;

modification.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode;

modification.Value = string.Format(CultureInfo.InvariantCulture, CreateModificationValueString(ElementName, Attributes), CreateModificationValueArgs(Attributes));

}

else

{

modification = new SPWebConfigModification(SectionName, XPathLocation);

modification.Owner = ” Company.MOSS.FeatureReceiver”;

modification.Sequence = 0;

modification.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureSection;

modification.Value = String.Format(“<{0}/>”, SectionName);

}

 

if (removeModification)

webApp.WebConfigModifications.Remove(modification);

else

webApp.WebConfigModifications.Add(modification);

webApp.Farm.Services.GetValue<SPWebService>().ApplyWebConfigModifications();

}

else

throw new ApplicationException(“Could not locate a web application”);

}

catch (Exception ex)

{

System.Diagnostics.EventLog el = new System.Diagnostics.EventLog();

el.Source = “WebConfigFeature”;

el.WriteEntry(ex.Message);

}

}

/// <summary>

/// Accepts a dictionary object with all of the attributes for the web modification and

/// creates a string representing the attribute values which can be used when creating

/// the SPWebConfigModification object.

/// </summary>

/// <param name=”Attributes”></param>

/// <returns></returns>

private string CreateAttributeString(Dictionary<string, string> Attributes)

{

//Create a string that looks like this (no line breaks):

//[@Assembly=\"Company.Moss.Activities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9eed2245513232a4\"]

//[@Namespace=\"Company.Moss.Activities\"]

//[@TypeName=\"*\"][@Authorized=\"True\"]

string result = “”;

//Check if there are attributes

if (Attributes.Count > 0)

{

foreach (KeyValuePair<string, string> kvp in Attributes)

{

result += “[@" + kvp.Key + "=\"" + kvp.Value + "\"]“;

}

}

return result;

}

private string CreateModificationValueString(string ElementName, Dictionary<string, string> Attributes)

{

//Create a string that looks like this:

//”<authorizedType Assembly=\”{0}\” Namespace=\”{1}\” TypeName=\”{2}\” Authorized=\”{3}\”/>”

string result = “<” + ElementName;

//Check if there are attributes (Kind of silly if there aren’t!)

if (Attributes.Count > 0)

{

int i = 0;

foreach (string key in Attributes.Keys)

{

result += ” ” + key + “=\”{” + i.ToString() + “}\”";

i++;

}

}

result += ” />”;

return result;

}

private object[] CreateModificationValueArgs(Dictionary<string, string> Attributes)

{

//Create an object that looks like this:

//”Company.Moss.Activities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9eed2245513232a4″, “Company.Moss.Activities”, “*”, “True”

object[] result = new object[Attributes.Count];

int i = 0;

foreach(string value in Attributes.Values)

{

result[i] = value;

i++;

}

return result;

}

Here is the sample WebConfigChanges.xml file with connectionStrings section and other elements.

<?xml version=”1.0″ encoding=”utf-8″ ?>

<WebConfigChanges>

<WebConfigChange XPathLocation=”configuration” SectionName=”connectionStrings”>

</WebConfigChange>

<WebConfigChange XPathLocation=”configuration/connectionStrings” ElementName=”add”>

<Attributes>

<Attribute Name=”name” Value=”MOSSConnectionString” />

<Attribute Name=”connectionString” Value=”Data Source=XXX;Initial Catalog=XXX;User Id=XXX; Password=XXX” />

<Attribute Name=”providerName” Value=”System.Data.SqlClient” />

</Attributes>

</WebConfigChange>

<WebConfigChange XPathLocation=”configuration/system.web/httpHandlers” ElementName=”add”>

<Attributes>

<Attribute Name=”verb” Value=”*” />

<Attribute Name=”path” Value=”ChartImg.axd” />

<Attribute Name=”type” Value=”System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ />

</Attributes>

</WebConfigChange>

</WebConfigChanges>

Remember to place this file in the folder where elements.xml of the feature file is located under the 12 hive.

December 31, 2009

Custom .NET Application integration to SharePoint

Filed under: MOSS 2007 — kanithis @ 3:07 pm

My thoughts on several integration levels of a custom .NET application to SharePoint…

  • Integration Level 0 (No Integration)

Advantages

  • Simplest solution as there is no need to integrate with MOSS 2007 or deploy.
  • More reliable as there is no reliance on MOSS 2007 services.
  • Server requirements are reduced as SharePoint services are not running/not required.
  • Simpler development and deployment model and debugging.
  • Regular workstations can be used for development and Visual Studio 2008 is good for development and no add-ons or extensions required.
  • Can take advantage of third party tools such as DevExpress and Log4net with little or no setup changes.
  • Service account can be used for database access, no need to worry about Single Sign On.

Disadvantages

  • Limited integration with existing MOSS 2007 portals.
  • Another hosting environment to maintain.
  • Cannot take advantage of list data that is available in MOSS 2007.
  • MasterPages and Login pages with common user controls must be developed.
  • Cannot take advantage of SharePoint security model
  • Integrating to MOSS 2010 will be another complete effort.

  

  • Integration Level 1 (Using ASP.NET 3.5 hosted inside MOSS 2007 as Application Pages)

Advantages

  • Simpler development Model compared to higher levels of integration and debugging the Business objects and data objects is possible.
  • SharePoint is aware of the page – so the link is natively visible to portals (i.e. the link doesn’t need to be added to SharePoint)
  • Can take advantage of SharePoint master page, so the look and fell will be consistent across the organization. This will fasten the development process as there is no need for login and other user controls.
  • Application can be developed in regular ASP .NET fashion and integrated into MOSS 2007 as application pages, so regular ASP .NET debugging can be leveraged.
  • Single hosting environment and other Windows 2003 web servers can be taken off
  • Can take advantage of SharePoint’s security model such as User Profile.
  • Can take advantage of some of SharePoint’s features for future development.
  • Can take advantage of collaboration with some existing list data.
  • Don’t have to concentrate as much as for regular .NET apps regarding the AppScan vulnerabilities
  • Can take advantage of .Net 3.5 features such as ADO .NET entity framework and LINQ compared to higher levels of integration
  • Since each page is independent of other, MOSS 2010 migration will be easier compared to higher levels of integration.
  • Can take advantage of MOSS features in application enhancements.

Disadvantages

  • Dependency upon MOSS.
  • More powerful servers are required as there will be single hosting environment that process both regular SharePoint information and ASP .NET web application.
  • Initial setup of integrating ASP .NET web app into MOSS 2007 could be a night mare as there are some configuration changes, master file changes and some code changes to integrate the custom.master file.
  • May find some difficulties working with some third party controls such as Dev Express.
  • May find some challenges in using open source utilities such as Log4net and Microsoft Data Access Applications blocks as MOSS 2007 requires the signed assembly.
  • Changes in development and deployment process as there will be integration and that needs to be done on a web server which has SharePoint installed.
  • Verbose logging should be enabled in order to track down the errors in the integration part.
  • Double hop issue, must use local db account to access the DB or configure Single Sign On.
  • Cannot use proper identity impersonate with SharePoint security model.

  

  • Integration Level 2 (Using ASP.NET 3.5 and developing inside MOSS 2007)

Advantages

  • Single hosting environment.
  • Can take advantage of full SharePoint’s security model.
  • Can take advantage of SharePoint’s rich controls such as SPGridView, built-in web parts and Workflows.
  • Can integrate with existing list data if any.
  • Can take advantages of MOSS 2010 easy development framework such as BCS.

Disadvantages

  • Dependency upon MOSS 2007.
  • Site Pages render slower in MOSS 2007.
  • There is reliance on more components – so reliability of system is lower.
  • More powerful servers are required as there will be single hosting environment that process both regular SharePoint information and ASP .NET web application.
  • May find some difficulties working with some third party controls such as Dev Express.
  • May find some challenges in using open source utilities such as Log4net and Microsoft Data Access Applications blocks as MOSS 2007 requires the signed assembly.
  • Difficulty in troubleshooting. There are different log files to search for the error and it’s not clear where to look.
  • Development environment issues could arise as work stations do not have SharePoint libraries installed.
  • Reduced ability to use new .NET 3.5 features such as ADO .NET entity framework and LINQ.
  • Oracle client must be installed on the server in order to connect to Oracle db
  • More effort in migrating to MOSS 2010 compared to Integration Level 1.

  

  • Integration Level 3 (Deep Integration with MOSS 2007 using Lists , Business Data Catalog and Data Sources)

Advantages

  • Single hosting environment.
  • Can take full advantage of SharePoint’s security model.
  • Can take advantage of SharePoint’s rich controls such as SPGridView, built-in web parts and Workflows.
  • Can leverage current look and feel of SharePoint sites if they already exist.
  • Lists are easily customized by users.
  • Notifications when data changes.
  • Can take advantages of MOSS 2010 easy development framework such as BCS.

Disadvantages

  • Complete revamp of business process flow and this will require significant user education.
  • Dependency upon MOSS 2007.
  • Site Pages render slower in MOSS 2007.
  • There is reliance on more components – so reliability of system is lower.
  • More powerful web servers and SQL server required.
  • Difficulty in troubleshooting. There are different log files to search for the error and it’s not clear where to look.
  • Performance and scalability issues using Business Data Catalog to connect to external data sources.
  • Insane Development Requirements: You must have a Windows 2003/2008 Server as your Workstation; you really should be local Administrator on it.
  • More effort in migrating to MOSS 2010 compared to other Integration Levels. 
Older Posts »

Theme: WordPress Classic. Blog at WordPress.com.

Follow

Get every new post delivered to your Inbox.