Few things to remember While Developing Sandboxed solutions

SharePoint 2010 provides a great new feature called “Sandboxed Solutions” which separates the User Code Host Process from IIS Worker Process and let the Site Collection Administrator deploy the solution easily from Solution Gallery without direct intervention or concern of Farm Administrator and thus it does not affect the application pool while maintaining stability across the Farm. But, Sandboxed Solution has got some limitations that we should remember:

1. You cannot develop any Visual Web Part, Application pages etc. as Sandboxed Solutions which requires direct access to 14 hive.

2. You cannot use any code which requires elevated privileges. For example: SPSecurity object is not supported in Sandboxed Solution. Often we are used to use SPSecurity.RunWithElevatedPriveleges which runs the segment of code as a system account which is not supported at all in Sandboxed Solution. Although, it will not throw any validation error while building the solution from Visual Studio 2010, it will eventually throw an error saying “Failied to load assembly” while running the feature which tries to execute SPSecurity object after deployment.

3. You cannot access another site collection as Sandboxed Solution restricts you only to Current Site Collection.

4. Normal Debugging method from Visual Studio 2010 will not work for Sandboxed Solution if you have already deployed it. You can debug it in normal way by pressing “F5” before deploying though. In order to debug an already Deployed Sandboxed Solution, you need to attach to Sandboxed Worker Process “SPUCWorkerProcess.exe” manually because it does not run under the IIS Worker Process used by SharePoint also known as w3wp.exe.

Another way of sending Data from External List to Data View Web Part of Form page of a List

Previously, I told about how you can send Filtered data from an external list to a New/Edit form page’s Data View Web Part by connecting the web parts. Today, I will show another easy way to populate Data within a Data View Web Part sent from a External List.

This time around, I have used Inline Coding inside the Form Page (You have to go in Advanced mode to write inline code and modify the web.config for allowing).

Open up your form page and find the following:

<asp:Content ContentPlaceHolderId="PlaceHolderMain" runat="server">

I have to use my code inside this tag. So, first of all create some Text Fields which will grab the values of the Data sent from the External list.

<asp:TextBox ID="txtID" runat="server" Text="" Visible="false"/>
<asp:TextBox ID="txtFullName" runat="server" Text="" Visible="false"/>
<asp:TextBox ID="txtEmail" runat="server" Text="" Visible="false"/>
<asp:TextBox ID="txtPhone" runat="server" Text="" Visible="false"/>

Note that, I set the visibility to false as obviously you don’t want to show these on your Forms

For writing C# code inside the form, we have to add a tag like the following:

<script runat="server" type="text/c#">

Now, I need to write the logic inside the Page_Load event as that is when my External List will interact with this form and populate the fields.

protected void Page_Load(object sender, EventArgs e)
        {
         
       //Get the current site
         SPWeb currentWeb = SPContext.Current.Web;
       //Get the current user
         SPUser currentUser = currentWeb.CurrentUser;
        //Get the current user's login name
              string username1 = currentWeb.CurrentUser.LoginName.ToString();
              
      //As current username's format is ABC\username, i need to use substring to get "username"
             string username2 = username1.Remove(0,4); 

      //This username exist in the external List as Upper Case
             string currentUsername=username2.ToUpper(); 
         
      //Elevate the permission of current user to use System Account
         SPSecurity.RunWithElevatedPrivileges(delegate()
                {
                
                    using (SPSite site = new SPSite(SPContext.Current.Web.Url))
                    {
                        using (SPWeb web = site.OpenWeb())
                        {
                        
                        //Get the List of this current form page, in my case it is "Request For Change"
                         SPList list1 = web.Lists["Request For Change"];  
                            
                            bool isMember=false;
                          //Checking the current user whether he belongs to a particular group
                            isMember=SPContext.Current.Web.IsCurrentUserMemberOfGroup(web.Groups["Request For Change Members"].ID);
                            bool isModerator=false;
                            isModerator=SPContext.Current.Web.IsCurrentUserMemberOfGroup(web.Groups["Request For Change Moderators"].ID);
                            bool isAdmin=false;
                            isAdmin=SPContext.Current.Web.IsCurrentUserMemberOfGroup(web.Groups["Request For Change Admin"].ID);

                       //If the user does not belong to any group, redirect him to the main home page of the site
                            if(isMember==false && isModerator==false && isAdmin==false)
                            {
                                Context.Response.Redirect(SPContext.Current.Web.Url.ToString());
                            }

                  //Get the External List, in my case the name is "eBusinessInfo"      
              SPList list=web.Lists["eBusinessInfo"];
                 //Using CAML
               SPQuery theQuery=new SPQuery();

                            theQuery.ViewFields="<FieldRef Name='ID' /><FieldRef Name='FULL_NAME' /><FieldRef Name='EMAIL' /><FieldRef Name='WORK_PHONE' /><FieldRef Name='USER_NAME' />" ;
                            theQuery.Query = @"<Where>
                            <Eq>
                                <FieldRef Name='USER_NAME' />
                                <Value Type='Text'>"+ currentUsername +@"</Value>
                            </Eq>
                            </Where>";
                            //get the Result of CAML query
                            SPListItemCollection foundItem = list.GetItems(theQuery);
                           //Store the ID, Full Name, Email and Phone inside the TextBox that we created before
                            txtID.Text= foundItem[0]["ID"].ToString();
                            txtFullName.Text = foundItem[0]["FULL_NAME"].ToString();
                            string strEmail= foundItem[0]["EMAIL"].ToString();
                            if(foundItem[0]["WORK_PHONE"]==null)
                            txtPhone.Text= "";
                            else
                            txtPhone.Text=foundItem[0]["WORK_PHONE"].ToString();
                            //string strPhone=foundItem[0]["WORK_PHONE"].ToString();
                            if(strEmail != null)
                            
                            txtEmail.Text = foundItem[0]["EMAIL"].ToString();
                            else
                            txtEmail.Text= "N/A";
                            
                        
                            }
                        }
                    
                    });

        }

</script>

Upto now, I have retrieved the value from the external list using a CAML query and stored the value inside the TextBox Fields. Now, In order to use these values inside my form, I have to find the following web part zone:

<WebPartPages:WebPartZone runat=“server” FrameType=“None” ID=“Main” Title=“loc:Main”><ZoneTemplate>

 
add the parameters inside this web part zone:
<ParameterBinding Name="paramID" Location="Control(txtID, Text)" DefaultValue=""/> 
<ParameterBinding Name="paramFullName" Location="Control(txtFullName, Text)" DefaultValue=""/>
<ParameterBinding Name="paramEmail" Location="Control(txtEmail, Text)" DefaultValue=""/>
<ParameterBinding Name="paramPhone" Location="Control(txtPhone, Text)" DefaultValue=""/>

 

Then, add the parameters inside the XSLT right after this web part zone.

<xsl:param name="paramID" />
<xsl:param name="paramFullName" />
<xsl:param name="paramEmail" />
<xsl:param name="paramPhone" />

Now, Instead of using SharePoint:FormField for the desired fields, change those like the following:

<asp:TextBox runat="server" id="ff1{$Pos}" ReadOnly="True" Text="{$paramID}" __designer:bind="{ddwrt:DataBind('i',concat('ff1',$Pos),'Text','TextChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@ID')}"/>

While changing this, do not forget to change “Value” and “ValueChanged” to “Text” and “TextChanged” respectively inside the Tag. That’s it. Now, save the form and see the result!

Hide form fields using JQuery and SharePoint Web Services

There are many occasions when we need to hide certain form fields based on some permission / group settings. Well, there is an easy way of achieving this using a JQuery plugin called “SPServices” which is free to use.

Using this plugin, you can call any in built SharePoint web service, get the value retrieved by the web services and use it in your form easily.

In this example, I have three types of users for a specific list which are “Users”, “Moderators” & “Admin”. I would like to check the current user which group he belongs and based on that I am going to hide/show some fields.

First of all, Download the SPServices plugin from here and then open your form in Advanced Mode using SharePoint Designer 2010 and look for the following line:

<asp:Content ContentPlaceHolderId="PlaceHolderBodyAreaClass" runat="server">

Add the script for SPServices:

<script type="text/javascript" src="http://(YOUR SITE URL)/(SAVED FOLDER FOR SPSERVICES)/jquery.SPServices-0.6.2.min.js"></script>

and add the following code under that

<script type="text/javascript">
    $(document).ready( function ()
    {
                    var isUserOnly = false; //User group member only
            var isModerator= false;
            var isAdmin=false;
                    var MODERATORGROUP = "Moderators"; // SPGroup named “Moderators”
                    var ADMINGROUP = "Admin";  // SPGroup named “Admin”

                    $().SPServices
                    ({
                      operation: "GetGroupCollectionFromUser", //Calling GetGroupCollectionFromUser.asmx web service
                      userLoginName: $().SPServices.SPGetCurrentUser(), //Calling Current User
                      async: false,
                      completefunc: function(xData, Status)
                      {
                                        $(xData.responseXML).find("Groups").each(function() //Retrieving the values from Group method of Web Service
                                        {
                                             $(this).find("Group").each(function()  //Parsing through all the groups the current user belongs to
                                             {
                        //Checking whether Current User belongs to Admin Group

                                                  if(($(this).attr("Name").toLowerCase() === ADMINGROUP.toLowerCase()))
                                                    isAdmin = true;
                        //Checking whether Current User belongs to Moderators Group

                          else if(($(this).attr("Name").toLowerCase() === MODERATORGROUP.toLowerCase()))
                            isModerator=true; 

                        //If Current User does not belong to Moderators or Admin, then definitely a normal user

                          else
                            isUserOnly=true;
                                             });
                                        });
                         }
                   }); // Closing SPServices Method

                   if(isUserOnly)
                   {

                        //Hide fields as this user is Not a member of Modeartora or Admin Group

               jP.Form.readForm("http://teamradiant/sites/rfc/").Comments.hide();
               jP.Form.readForm("http://teamradiant/sites/rfc/").Approval.hide();
                    }
           if(isModerator)
            {
            //Hide Approval field if the current user belongs to Moderators Group

                jP.Form.readForm("http://teamradiant/sites/rfc/").Approval.hide();

            //Show Comments field if the current user belongs to Mdoerators Group

                jP.Form.readForm("http://teamradiant/sites/rfc/").Comments.hide();
            }
            if(isAdmin)
            {

            //Show both fields if the current user belongs to Admin group

                 jP.Form.readForm("http://teamradiant/sites/rfc/").Comments.show();
                 jP.Form.readForm("http://teamradiant/sites/rfc/").Approval.show();
            }

   });
</script>
After that save the Form, and check that it works!

How to create Dynamic Column in a List Event Receiver & set the Column Name with a Dynamic Value and set Value of that Column for Current List item?

Few days ago, I was working on a List where the necessity of creating dynamic column raised. Also, the need to initiate the column name inside an event receiver and setting the value of the newly column for the current item were needed. So, I created a custom (demo) List which is named as “DemoProjects”.

I created the following columns:

Title, Description, Comments, RadComments (for checking the event)

I needed the column to be created for an existing List item. So, I created a new item like the following keeping “Comments” and “RadComments” blank.

image

image

Now, in order to create the event receiver I created a new project of “Event Receiver” type in Visual Studio 2010.

I set the “ItemUpdated” method to True as I need to create the column while updating the list item.

image

After that, Visual Studio automatically creates the method name and parameters for ItemUpdated method

 public override void ItemUpdated(SPItemEventProperties properties)
 {
    base.ItemUpdated(properties);
 }

Now, this base.ItemUpdated runs will run for each custom list. In order to attain my objective, I have modified this method to the following: ( I have tried to clarify all the steps by commenting each line of code )

  1. public override void ItemUpdated(SPItemEventProperties properties)
  2.        {
  3.            if (properties.ListTitle == “DemoProjects”)
  4.            {
  5.                string colComments = “”; // Column Display name
  6.                string colCommentsStr = “”;  //  Internal name of the Column name
  7.                string curUser = “”;  // Current user name
  8.                using (SPSite site1 = new SPSite(properties.SiteId)) //Accessing the current site with current user permission
  9.                {
  10.                    using (SPWeb web1 = site1.OpenWeb(properties.RelativeWebUrl))
  11.                    {
  12.                        curUser = web1.CurrentUser.Name.ToString();  // Getting the current user display name
  13.                    }
  14.                }
  15.                SPSecurity.RunWithElevatedPrivileges(delegate()  // To Elevate the permisson of the current user which runs as a system acc to create the list column
  16.                {
  17.                    using (SPSite site = new SPSite(properties.SiteId))
  18.                    {
  19.                        using (SPWeb web = site.OpenWeb(properties.RelativeWebUrl))
  20.                        {
  21.                            EventFiringEnabled = false;   // Disabling the events firing to prevent unnecessary actions
  22.                            web.AllowUnsafeUpdates = true;  // To execute actions which are not permitted by default
  23.                            SPList radList = web.Lists[properties.ListId];  // Getting the current List
  24.                            SPListItem project = web.Lists[properties.ListId].GetItemById(properties.ListItem.ID); // Getting the Current List Item
  25.                            colComments = “Comments: “ + curUser; // Setting the column name with current user name
  26.                            if (!radList.Fields.ContainsField(colComments))
  27.                            {
  28.                                radList.Fields.Add(colComments, SPFieldType.Note, false); // Adding new column in current List
  29.                                radList.Update(); // Updating the current List after adding new column
  30.                                Guid guidViewID = radList.Views[“All Items”].ID; // Getting the Guid for “All items” view of current list
  31.                                SPView vw = radList.GetView(guidViewID);
  32.                                vw.ViewFields.Add(colComments);  // Adding the new column in All items view
  33.                                vw.Update();  // Updating the All items view
  34.                                project.Update(); // Updating the current List item
  35.                                base.ItemUpdated(properties);  // Attaching current event to current list item
  36.                                radList.Update();  // Updating the current list
  37.                            }
  38.                            colCommentsStr = radList.Fields[colComments].InternalName.ToString(); // Getting the internal name of newly created column
  39.                        }
  40.                    }
  41.                });
  42.                using (SPSite site2 = new SPSite(properties.SiteId))  // Again accessing the site with current user permission
  43.                {
  44.                    using (SPWeb web2 = site2.OpenWeb(properties.RelativeWebUrl))
  45.                    {
  46.                        SPListItem project1 = web2.Lists[properties.ListId].GetItemById(properties.ListItem.ID); // Getting current List item
  47.                        project1[colCommentsStr] = project1[“Comments”].ToString(); // Setting current item’s new column’s value to Comments column
  48.                        project1[“RadComments”] = “Done!”; // Settting RadComments column’s value to “Done”
  49.                        project1.Update();   // Updating the current list item
  50.                        web2.AllowUnsafeUpdates = false; // After completing the action setting unsafe updates to false
  51.                    }
  52.                }
  53.            }
  54.            EventFiringEnabled = true;  // Enabling event firing for user interaction
  55.            base.ItemUpdated(properties); // Attaching current event to current list item
  56.        }

Now, after deploying this Event Receiver, I edited the previously created new item.

image

Notice that, I kept “RadComment” blank and there are currently no other columns in this list except these four. So, what happened when I clicked “Save”.

See the following window:

image

So, my dynamic column got created now (Comments: Current User name) and the value is also set by the event receiver which made it possible to know who commented the item. Now, if another user edits this item, another “Comment: Username” will be automatically be created and thus I can track all the comments made by the item editors and find out what he commented for that item. That’s pretty cool, isn’t it? Enjoy!!

How to install SharePoint 2010 Server Farm Setup without Active Directory on Windows Server 2008?

In SharePoint 2010, there are two types of installations: Farm  and Standalone. If you want to install SP 2010 on a single machine, it will not allow you to install farm set up out of the box as by default it requires Active Directory which means your machine needs to join a domain where Microsoft Active Directory has been already setup. To workaround this problem for Windows Server 2008 machine, you could do the following:

1. Install SQL Server 2008 R2 Development/Enterprise edition.

2.  Install SharePoint 2010 Installation using Farm Setup.

3. Before proceeding to launch the SP2010 Configuration Wizard, open the SP2010 PowerShell and run this command:

New-SPConfigurationDatabase

After that, you will get the following window:

image

Enter a Database Name (i.e SharePoint_Config_Db)

Next:

Enter a Database Server: (Your Database server name, if the database is hosted on the same machine, type in your machine name)

After that you will get a login prompt to enter your Farm Credentials:

image

Important Thing to note here, while entering your username in the credentials window, use this format : [Your machine Name]\[User Name]

(i.e TeamRadiant\Morshed)

You will be prompted to enter password again in the PowerShell. Type in your password again. That’s it. You are done!!

Now, run the SharePoint 2010 Configuration Wizard, where you will get the following window:

image

 

You will see your newly created Database Name appearing here.

After getting this window, click “Next” and your wizard will complete all the necessary actions to complete your farm setup. After that, you can launch the “Central Admin” site and you will be presented with the wizard which you may choose to run or you may configure it manually without running wizard.

How to Send Filtered Data from an External List to a Data View Web part of a Form Page?

When we develop Custom Form Page, on various occasions we need to retrieve Form Field Data from a SharePoint List or another External List.  In this example,  I am going to show how you can obtain data from an External List and send those data to your form fields while loading a New Form page.

Keep in your mind that in SharePoint 2010, when we create a new Form from SP Designer 2010, we get a Data View Web Part for the Form Fields.

First, let us create a custom Form page (which is a Web Part page) from the SP Designer 2010. Then, create parameters for fields which we need to get the data from the external list. To insert parameters in SP Designer 2010, Select Parameters from the Ribbon->Options. You should see the following window:

image

Now, click on “New Parameter”. For my requirements, I have created four new parameters for “ID”, “Name”, “Email” and “Phone”. Give any name for the Parameter name and Choose none for Parameter Source and none for Default Value. Click Ok.  Save your page.

image

Then, open that page in your Web Page and go to Site Actions->Edit Page. Now, you will see the web part zones where you can add a new web part. Click on “Add a Web Part” and choose your desired External List from the pop up window. Click “Add”. After adding the external list web part, select from the top right corner where you will get similar to the following window:

image

Choose Connections->Send Row of Data To. Here, “Request For Change” is the web part where I want to send the values.

image

Choose, “Get Parameters From” from Connection Type. Then select the tab “Configure Connection”.

image

Click Finish. Now, with this setting, I can only pass one value as a parameter to my consumer web part. This is a shortcoming of using web front end to create web part connection. If we want to send another, we cannot do so as we get the following window where there is no option for inserting additional fields.

image

To get rid of this situation, let us switch back to SP Designer 2010 and open the Custom New Form page in Advanced Edit mode. Here, you will notice that the External List which we added is being shown as “XSLTListViewWebPart”. Select the web part and click on “Manage Connections”. You will get like the following window:

image

Notice that our earlier connection which we created from the Web Front end is already there. Click on “Modify”.

image

You can now see the details of this web part connection (Source, Target, Action). Select “Send Row of Data To”.

image

Now, select “Connect to a Web part on this page”. Click “Next”.

image

Here, you can see the Target Web part and Target Action. Choose Target action “Get Parameters From”.

image

Here is the thing; you can now map multiple fields with multiple parameters that you created before.  For my case:

Columns in eBusinessInfo (External List)            Inputs to Request For Change (Consumer Web Part)

Email                                                                    paramEmail

ID                                                                         paramID

Work_Phone                                                        paramPhone

Full Name                                                             paramName

After mapping all the fields, click Next-> Finish. Now, my web part connection between the external list and form Data View Web Part is complete. But, yet I cannot use the values directly as a parameter. To do so, I need to modify my required Fields (SharePoint:FormField) and convert those as “TextBox” to use the parameter.

For example: For “Name” field, I have got the following form field.

<SharePoint:FormField runat="server" id="ff3{$Pos}" ControlMode="New" FieldName="Full_x0020_Name" __designer:bind="{ddwrt:DataBind('i',concat('ff3',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Full_x0020_Name')}"/>

 

Convert the above form field as:

<asp:TextBox runat="server" id="ff3{$Pos}"  Text="{$paramName}" ReadOnly="True" __designer:bind="{ddwrt:DataBind('i',concat('ff3',$Pos),'Text','TextChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Full_x0020_Name')}"/>

 

Important thing to note: Remove “ControlMode” and “FieldName” property and Change “Value” to “Text” and “ValueChanged” to “TextChanged” inside _designer: bind property.  As I want the Name to be read only , that’s why I kept ReadOnly=”True”.

Convert the other three fields in the same way and then preview your Form Page. I forgot one thing to mention here; of course, you don’t want to show up your External list in your New Form page. To do so, go to the property of the External List Web part and set “Hidden=True”. Now, if you browse your page in preview mode, you will see the values got populated in your Data View Web Part of your new Form Page.

How to create an External List from an External Content Type after deploying your Business Data Connectivity Model?

When you deploy a BDC Model in SharePoint 2010 as an External Content Type, it gets stored in your web application. But, your site and site collection cannot just use that yet because of some permission issues. So, in order to let that External Content type usable in your sites and site collections, you have to go to the central administration.

image

Go to Application management->Manage Service Applications. Click on Business Data Connectivity Service.

image

You will see your external content type here if you have successfully deployed your BDC model using any connector (SQL server, .NET Assembly or WCF Service).

image

Select your External Content Type and Click on “Set Object Permissions”. After that, you will see the following window where you will need to add your users who can use this content type in your sites and site collections.

image

Now that you are done with the permission settings, you will be able to create External List from this External content type inside your site.

Go to your site and from the “Site Actions”, go to more options and and click on List like the following screenshot:

image

From here, Choose “External List” and click on Create, you will get the following window:

image

Type in a Name for your External List and Choose the External Content Type from the Item Picker (Furthest icon to the right under “External Contet Type” box). You will see your External Content Type there ( You can also write the name of your ECT directly here)

image

After selecting the content type, the name of your “External Content Type” will be displayed. Click on “Create”.

That’s it. After that, you will be redirected to the Default View of your newly created External List.

How to save a site as template (WSP) and then import necessary files from that WSP in VS 2010 and deploy to another site or site collection?

In SharePoint 2010, there is a nice feature provided by VS 2010 which lets the developer import the WSP into VS 2010 environment where you can select your necessary lists, libraries, reusable workflows and see all these in code view in Visual Studio environment. You can later on deploy this to any site or site collection on your server. Important thing to note that, VS 2010 only allows you to deploy locally which means you cannot deploy anything if your SP server exists elsewhere.

First, let us see how easily you can save a site as a template from the web interface:

Go to site settings of your site. From “Site Actions”, select “Save Site as Template” (Publishing feature needs to be enabled for a site to view this option for a site [not site collection])

 

image

Now, Fill up the name of the file which will be saved as. You can select “Include Content” if you want your custom forms and custom reusable workflows to be available in the solution package. If you keep it unselected, it will not save any custom forms or reusable workflows.

image

Now, after clicking “OK”, you will be redirected to the page where the solution package is saved as template. Click on the file to download and save it.

After saving the WSP file, open your Visual Studio 2010 in “Administrator” mode and follow the steps below:

image

Choose “Import SharePoint Solution Package” from Installed templates.

image

Specify your site or site collection URL.

image

Browse to the location where you saved the “WSP” file.

image

After clicking on “Next”, you will see all the files available inside that WSP.

image

Now, you can deselect all and select only the required ones; after click on “Finish” you may get this window which will show a warning about the dependencies. Click “Yes” if required.

 

image

 

After that you will get a message saying “The solution is imported successfully”.

image

Now, you will be able drill down into all the fields you chose before and see the code for each field in VS. After modifying (if you require so), you will need to click on “Deploy” to deploy the site to your preferred location (which you mentioned while creating the project, you can change the URL from Solution Explorer too).

Once deployed, you will be able to see the elements in your site’s “All Site Content” and the settings for the lists and libraries will be exactly as it was in the other site settings from where you saved the template.

How to use Inline Code In SharePoint Designer 2010?

SharePoint 2010 does not allow inline coding for Form pages created from SP Designer. If you use inline coding in any form page (New, Edit or Display), you will get into an error which will say “Code Block is not allowed on this page”.

To resolve this, you need to change the web.config file of your web application.

For example: If your web application uses Port 80,  you have to go to to port 80 directory which generally resides in C:\inetpub\wwwroot\wss\VirtualDirectories\80

go inside that port number directory where you will find the web.config file where you will need to modify. Look for the tag <PageParserPaths> in the web.config.

Now, if you want to allow inline coding for all the site collections under that web application you will need to add the following:

<PageParserPaths>
        <PageParserPath VirtualPath="/*" CompilationMode="Always" AllowServerSideScript="true" IncludeSubFolders="true" />
</PageParserPaths>

Now, above code will allow inline coding in all the form pages in SharePoint Designer 2010 under that particular web application across all the site collections and sites. Use IncludeSubFolders=”true” if you want that coding enabled for all the site collections or sites under that web app.

If you want to allow inline coding only for a particular site collection you will need to change the code to the following:

<PageParserPaths>
        <PageParserPath VirtualPath="/sites/sitename/*" CompilationMode="Always" AllowServerSideScript="true" IncludeSubFolders="true" />
 </PageParserPaths>

 

For a particular page inside a site or site collection:

<PageParserPaths>
        <PageParserPath VirtualPath="/sites/sitename/PageName.aspx" CompilationMode="Always" AllowServerSideScript="true" IncludeSubFolders="true" />
</PageParserPaths>

Change the PageName.aspx to your page name.

For master page of your root level site collection:

<PageParserPaths>
    <PageParserPath VirtualPath="/_catalogs/masterpage/*" CompilationMode="Always" AllowServerSideScript="true" IncludeSubFolders="true" />
</PageParserPaths>

 

How to solve web service access problem for an anonymous enabled site in SharePoint 2010?

Recently, I was trying to build an InfoPath 2010 form in SP 2010 where I created Data Connection using UserProfileService.asmx web service within my site collection. Although, while setting up the connection I didn’t face any problem and I could see all the properties in the advanced mode for that data connection. I checked the Web Service URL directly to see the methods which would return me the required parameter.

After configuring everything, I was getting an error which stated “Unauthorized operation” while previewing the form in InfoPath:

The SOAP response indicates that an error occurred on the server:

Server was unable to process request. —> Unauthorized operation

I realized that some permission issue need to be resolved. I then contacted our Administrator to configure the InfoPath form services settings from the Central Admin site.

There are few things which you need to know before you can use the web services such as UserProfileService.asmx.

There is a service application in SharePoint named as “User Profile Service” which need to be set up or could be setup already in your farm. I will not go into the details of configuring it. After activating this service, the user who need to access the web services related to this, need to have have full permission access for this service which you can configure by selecting the service (Central Administration->Application Management->Manage Service Account) and adding the user in two categories (Administration and Permission), both of which require to provide full access for that particular user.

image

image

After spending enough time, I figured out that although, my web application was anonymously enabled, SharePoint does not allow the web services to run anonymously by any means. It has to pass through authentication in the IIS.

There are few workarounds which you can follow:

First Option: If your web application uses Windows Authentication (To Check, which authentication your web application is using, go to Central Admin->Application Management->Manage Web Applications; select your web app and click on “Authentication Providers”, under Membership zone, click on “Default”; under Authentication Type, you will see whether your site is using Windows, Forms or Single Sign on), Disable Anonymous Access for this web application and the web service will run perfectly (Remember, if you disable anonymous access at the web app level, all the site collections under that web app will automatically disable anonymous access option). This option is an easy way to fix the web service access problem if all the site collections for your web app really does not require anonymous access.

Second Option: (If you want to enable “anoymouos access”)

To let the users access your site anonymously, and at the same time to access the web service within that web app or site collection level, you will need to change your Authentication Type from “Windows” to “Form Based”. Now, I will not go into the detailed steps of configuring form based authentication for your server which is described here.

Third Option: (The Best one which suited me)

Actually, if you want to keep intact all the settings of your existing web app, and don’t want to mess up the settings, this option could be the best one for you. First of all, you will need to extend your web application for Intranet use. To do this

Go to Central Admin->App Management->Manage Web App, select your web app and select “Extend” from the ribbon.

image

You will find the following window:

imageimage

Select the Public URL Zone as “Intranet”. and make sure to Disable Anonymous Access.

Let’s say your Default Zone URL is : http://teams.SPWebApp.com/ then the extended Web Application URL would be : http://servername:portnumber/

Now, while calling the web services from InfoPath, you will need to provide the Extended Zone (Intranet) URL and things will work like charm. That means, when the web services will be called from your forms, it will call the Intranet URL which has “Anonymous Disabled” which will not interfere with your Default Zone URL which has “Anonymous Enabled”. So, you will be able to use Windows Form Authentication while providing the anonymous access feature to the users to call your required web services. Now, that’s a great workaround to avoid setting up “Form Based Authentication” (second option).