Wednesday, August 31, 2011

Error updating User Profile property on commit

Error: Updates are currently disallowed on GET requests. To allow updates on a GET, set the 'AllowUnsafeUpdates' property on SPWeb.


I saw many people has came across this is error when updating user profile property values, but I couldnt find a solid solution to this issue. So thought of posting a article on this one. The error may be misleading. Many think web.AllowUnsafeUpdates=true will solve the issue. But it wouldn't because this update will not have any impact on the User Profile Service application. 

Try the below code, it should solve the issue.





The difference here is SPContext.Current.Web.AllowUnsafeUpdates=true will update the current user profile to allow updates. Also make sure that there is no context given when Instantiating UserProfileManager object as it gets populated automatically when run on a personal site context. 

Tuesday, August 30, 2011

Hide Any Site template in Create Site section- SharePoint 2010

We may need to block creation of sites based on certain templates. For example my organisation does not like the employees to create blog site of their own in their personal mysite. 

There is a quick and dirty way to modify the webtemp.xml file to hide the template we dont want to show up. Its never a good approach to modify the default SharePoint config files. Also webtemp.xml file modification will affect farm level settings.

In SharePoint 2010 we can hide the templates of desired nature from the Create site page so no one can create site based on the particular template. This can by achieved by creating a new feature with a event handler code.

1. Create a new Empty SharePoint project.
2. Add a new feature element.Scope it to Web
3. Add a new event receiver to that feature element.
4. Paste  the below code(this code will hide the blog template at the site level)

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
SPWeb web = properties.Feature.Parent as SPWeb;
SPWebTemplateCollection existingWebTemps = web.GetAvailableWebTemplates(1033); ;
Collection<SPWebTemplate> newWebTemps = new Collection<SPWebTemplate>();
for (int i = 0; i < existingWebTemps.Count; i++)
{
if (!existingWebTemps[i].Title.ToLower().Contains("blog"))
{
newWebTemps.Add(existingWebTemps[i]);
}
}
web.SetAvailableWebTemplates(newWebTemps, 1033);
web.Update();
}

5.Deploy the solution and activate the feature. You will no longer see the blog template visible to the user in the Create site page.

6. To revert back and to show all the templates use the below code at Feature deactivating event.

 web.AllowAllWebTemplates() ;

Saturday, August 6, 2011

Get User profile using Console App- Object reference error at Server context

Today I was trying to retrieve user profiles properties using a console application. Its a very simple application just pulls some metadata from the userprofilesmanager. Previously I have get and set profile properties in my SharePoint application many times. Thought it would be a piece of cake for me. Not though.

This is the code I have written in the program.cs. But to my surprise I was getting object reference error. I was thinking that url might be the wrong thing. But its not.


            SPSite site = new SPSite("http://suresh-pc:100/default.aspx");
            ServerContext context = ServerContext.GetContext(site);
            UserProfileManager upm = new UserProfileManager(context);
            UserProfile profile = upm.GetUserProfile("moss/suresh");

This error is a misleading one. You dont have permission to pull data from User Profile Service application basically.

Go to Central Admin- Manage Service applications- Click User Profile Service Application(click the row not the link).- In the ribbon select Manage Permmissions


Provide full permission for the user trying to access the User profile manager.

Build the application and run again.

Saturday, July 16, 2011

SharePoint 2010 Content Editor webpart

I am a very big fan of Content Editor Webpart in Moss 2007. I have done many site customization's using CEWP in SharePoint 2007. Place a new html file, hack DOM elements using JQuery and modify the html elements, javascript etcs., I almost love it. Even I have developed a complete site using few CEWP's in SharePoint 2007.

I was hoping SharePoint 2010 would offer much more functionality to CEWP. But to the sad part it has worsened it usability. When I first tried inserting a CEWP in my SharePoint 2010 site, I virtually struggled to use it. I was trying to figure our how to insert my custom html. There was no Source editor in WebPart editor panel.

Edit Html source has been moved to the Ribbon. You have to click the "HTML-EditHTMLSource" and place your html.


And the worst part is now you cannot place any javascript code in the source editor(edit html source).

To place a javascript code you need to create a text file or html file and put your code there. Save it to some document library and link the file as show below in the editor pane


I like it in one way. We can checkin the code in Source control and deploy the text file or html file to the layouts folder and we can link it in our webpart so that we can have a backup of the code.

Friday, July 15, 2011

Custom Workflow Activity for SharePoint Designer 2010

Back in Moss 2007 we had the feature of creating a new custom activity for SharePoint designer. I never tried that. Yesterday I had to present a POC to a customer on Custom activity for SharePoint designer 2010. The requirement is pretty simple.

User will be presented with a simple list. On creating of a new item, a approval workflow will be triggered. On approval, a new subsite has to be created. So I thought creating a custom activity in designer and using that to create a designer workflow would to do the trick.

I will describe with steps to create a custom activity for a SharePoint designer 2010 below. Since creating a approval workflow is simple I m not going to cover it :-)

1. Open Visual Studio
2. Select the “File->New->Project”
3. For template, select “Workflow->Workflow Activity Library” ( If you don't see this template, then target your environment to .Net 3.5.)
4. For Name, type “CustomActivities”
7. Rename Activity1.cs to CustomAction.cs
8. Right click the project, select “Add Reference”
9. Add the following references:
o C:\program files\common files\microsoft shared\web server
extensions\14\isapi\Microsoft.SharePoint.dll

I dont want to jump into full code directly. Lets go Step by Step.

Create a new function which creates new site




To make your custom code we need to override the Execute method of System.Workflow.Activities.
Call our CreateSite() function within the Execute method.



We have created a simple activity which is good enough to create a new SharePoint site. But if you notice I have hardcoded the siteTitle and siteURLRequested. Not good practice ah..

Lets create a new set of properties to get and set values for our title and url parameters. Before that to make the properties to be picked by the SharePoint designer we need to create Dependency properties as below.


   public static DependencyProperty TaskTitleProperty = DependencyProperty.Register("TaskTitle", typeof(string), typeof(CustomAction));

        [Category("Cross-Site Actions"), Browsable(true)]
        [DesignerSerializationVisibility
          (DesignerSerializationVisibility.Visible)]
        public string TaskTitle
        {
            get
            {
                return ((string)
                    (base.GetValue(CustomAction.TaskTitleProperty)));
            }
            set
            {
                base.SetValue(CustomAction.TaskTitleProperty, value);
            }
        }

Note that we need to prefix the DependencyProperty with the word "Property" else VS2010 is going to shout at you.

Now use the dependency property created in our CreateSite method. Overall code looks like below.


So create another dependency property for siteUrlRequested as well which i m not doing here. Sign the assembly and build it. Place the assembly in GAC using gacutil.exe(never  install manually).

We are done with the coding part. Now lets register our newly created activity with the SharePoint designer.

If you navigate to 14 hive folder under 1033/Workflows/ you will find MOSS.ACTIONS and WSS.ACTIONS.

As a good housekeeping we will create a new ACTIONS file. Say CustomAction.ACTIONS.

Place the below xml in it to register our custom activity.


<WorkflowInfo>
  <Actions Sequential="then" Parallel="and">
     <Action Name="Create Site"
    ClassName="CustomActivities.CustomActions"
    Assembly="CustomActivities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a3170baa21b0a3e9"
    AppliesTo="all" Category="Custom Site Actions">
        <RuleDesigner 
           Sentence="Create a Site titled %1">
           <FieldBind Field="TaskTitle" DesignerType="TextArea" 
              Id="1"/>
        </RuleDesigner>
         <Parameters>
            <Parameter Name="TaskTitle" Type="System.String, mscorlib" 
              Direction="In" />
         </Parameters>
     </Action>
  </Actions>
</WorkflowInfo>

Save the file and close.  We have a very last step that to register our dll as a Authorized type with my webapplication. Navigate to web.config in the file system and make the below entry.

<authorizedType Assembly="CustomActivities, Version=1.0.0.0, 
   Culture=neutral, PublicKeyToken=a3170baa21b0a3e9"     
   Namespace="CustomActivities" TypeName="*" Authorized="True" />
Save the web.config. There you go..
Perform and IISReset and load the designer. You will see a new activity added under "Custom Site Actions"

Saturday, June 11, 2011

What does IISReset really do

IISReset- perhaps the first lesson every SharePoint developer and administrators learn.
But when we start to do extreme programming(really lol), we eventually forget to do this.. cool lemme come to the meat of the subject..

Last week I have to support from development side for a uat deployment of our new solution. Every thing worked well in my environment as always. My development environment is a standalone farm. testing, uat and prod are medium farms..

We deployed the code. loaded the site..Some code error..ahhh.. i could see clearly from the error that the new code is not referred by the page. We did redeployment as I insisted  confidently that Web hosting team didn't do the deployment as I specified in the install notes. Whenever something go wrong then its other mistake. lol...

So we deployed the solution..again same error. Now Web hosting team hit me back stating its my error.

on multiple refresh of the page, i saw the site loading correctly on few instances. ahhhh i caught the culprit. "DLL caching". I asked to do IISReset on all the WFE's. It worked.

So whats the issue.

Whenever we deploy a new code which has a dll we probably need to do a IISReset.
You know why, SharePoint when hosted in IIS caches the dll from GAC and renders the page from it. So we have to tell the GAC to take the new dll from GAC after new deployment of our code.

Do we need to do IISReset on all new deployment. Answer is no.

1. When we do partial trusted solution SharePoint automatically picks up the new dll from the bin. We dont need an IISReset.
2. When we deploy features, we dont need it unless and until it doesn't has any code.

Most of the prod servers doesn't allow us to do IISReset. Then how to tell my IIS to take the new dll from the GAC.

Use the below script to refresh the application pool.


Option Explicit
'*** spsapppoolrecycle.vbs
'*** Script to recycle Sharepoint Portal Server application pool
'*** For use when deploying updated version of Webparts in the GAC
'*** Author: Michael Christensen, mac@landscentret.dk
'*** Provided AS IS with no warranties
'*** Heavily based on this posting by David Wang:
'*** http://tinyurl.com/4k26n
Const WEBSITEID = 1
Dim objApp
Dim AppPoolId
Dim objAppPool
Set objApp = GetObject("IIS://localhost/w3svc/" & WEBSITEID  & "/root")
AppPoolId = objApp.AppPoolId
WScript.Echo "AppPoolID: " & AppPoolId
Set objAppPool = GetObject( "IIS://localhost/w3svc/AppPools/" + AppPoolId )
objAppPool.Recycle()
WScript.Echo "AppPool recycled."

The script assumes that Sharepoint is installed on the virtual server with ID 1. This will usually be the case, otherwise the actual ID could probably be determined programmatically.

Probably next time when you deploy the new code,,think whether is necessary to do an IISRESET after deployment.

Saturday, May 14, 2011

Blank SharePoint Site in Windows 7

Another issue with SharePoint 2010 installation in Windows 7. When I create a new site collection through central administration and browse through the page, it shows a blank page. Even sometimes I receive the blank page when I open Central administration. Weird :-(

After doing many changes and I have even reinstalled the farm to get rid of this issue. No luck. After a long time I found the issue is with the authentication.

to make the sites to work do the following.
1. go to IIS : cmd-inetmgr.
2. Go to your site collection.
3. Click Authentication


4.Right click Basic authentication and enable it.
5. There you go..refresh the page..you will see you sites.. bravo..

cannot connect to configuration database

I have installed SharePoint 2010 in Windows 7. I had to do many configuration changes to make it work. Not excited though. It should work in the same way as it should have in Windows server. Whenever i turn off my system, start again and broswe to anysites or central admin I receive this error.
"cannot connect to configuration database"..

very annoying ah?..

The reason is everytime you turn off you system, the SQL Server(SharePoint) services also get stopped.

To make the sites to work normally go to Services.msc and make sure the following services are running. If not right click and start it.

1. SQL Server (MSSQLSERVER)
2. SQL Server (SHAREPOINT)


Thursday, April 14, 2011

Personal sites(MySite) configuration in SharePoint 2007


The first thing you should do is make sure you’ve created a Shared Service Provider (SSP). To check this do the following:
  1. Go to MOSS 2007 Central Administration
  2. Click on Shared Services Administration in left navigation
    1. If this list is not empty then click on an SSP
    2. If this list is empty then click New SSP and create a Shared Service Provider  
Once on the Shared Services Administration page for your SSP you should see at least 3 sections titled: User Profiles and My Sites, Audiences and Search. To get started you’ll need to import user profiles from the directory.To import user profiles:
  1. Under User Profiles and My Sites click on the link labeled “User profiles and properties”
  2. On the User Profiles and Properties page click on “Configure profile import”
  3. Provide a default access account, specify an account that has read access to your directory.Note: This account needs to also have Manage User Profiles rights, verify click on “Personalization services permissions” under User Profiles and My Sites on the SSP Admin page. To keep things simple until you have a grasp of the service you should use the SharePoint Admin account.
  4. Click OK
  5. On the User Profiles and Properties page click on “Start full import”
  6. Verify that import started and wait until import has completed before moving on to other personalization admin tasks (this may take a few hours)
  7. After import is complete to view the results click on “View user profiles” on the User Profiles and Properties page
The SSP administrative portion of My Site should have been configured when you created the SSP. So while waiting on profile import to complete you can explore the non administrative parts of My Site.To create a My Site:
  1. Click on My Site in the global actions bar which is in the top right corner of every SharePoint page
  2. Wait while your My Site is created
  3. After creation is complete check to make sure the name of the site created is titled with your name
    1. If not then open a new browser window with your credentials and click the My Site link again or copy the URL behind the My Site link into the browser window.Note: My Site is highly personalized so it works best when its created using your credentials and not those of an admin account or alternate account
  4. Follow the links in the Getting Started with My Site web part
Once profile import is complete we can go back to setting up personalization services in the SSP Admin page. Now that we have profiles we can do things with them like create audiences.To create audiences:
  1. Go to the Shared Services Administration page for your SSP.
  2. Click on “Audiences” under the section Audiences
  3. On the Manage Audiences page click on “Create audience”Note: Audiences should not be created until after you’ve completed a profile import.
  4. Walk through the steps to create a new audiences based on user profile data
  5. After you’re done creating audiences click on “Start compilation” from the Manage Audiences pageNote: Audiences must be compiled before they can be used.
  6. After compilation is complete to view the results click on “View audiences” from the Manage Audiences page
Now that we have created new audiences we should put them to use on SharePoint sites by targeting content. To target content on SharePoint sites:
  1. Go to SharePoint site
  2. Go to the document library on the site
  3. Go to Document Library Settings
  4. Click on “Audience targeting settings” under General Settings
  5. Enable audience targetingNote: You can do this for any list type not just documents.
  6. Go back to the document library
  7. Edit or upload a new document
  8. Click the Browse button in the Target Audiences field
  9. Select an audience you created or search and use an existing distribution listNote: Distribution lists and security groups will only display after you’ve completed a profile import.
  10. Click OK to update the document’s properties
To display targeted content on SharePoint sites:
  1. Go to the site home page and add the Content Query Web Part
  2. Modify the Content Query Web Part
  3. Under Query change List Type to Document Library
  4. Under Query -> Audience Targeting check “Apply audience filtering”
  5. Click OK
  6. Verify the items you targeted in the document library only show for people in those audiences.  
Now that you’ve had a chance to see how audience targeting works let’s move on to People Search. To setup people search:
  1. Go to Shared Services Administration for your SSP
  2. Under Search section click on “Search settings”
  3. On Configure Search Settings page find the default content access account
    1. If this is not set then provide a default content access account
  4. Verify default content access account has Use personal features rightsNote: To verify click on “Personalization services permissions” under User Profiles and My Sites on the SSP Admin page. To keep things simple until you have a grasp of the services you should use the SharePoint Admin account.
  5. On Configure Search Settings page click on “Content sources and crawl schedules”
  6. On the Manage Content Sources page hover over “Local Office SharePoint Server sites” and click the arrow to drop the ECB menu
  7. In the drop menu click Start Full Crawl
  8. Verify that crawl started and wait until crawl has completed before moving on to search for people
Finding people:
  1. Once crawl is complete to main portal site and click on Search in the top navigation area to go to the Search Center
  2. In Search Center click on tab labeled “People”
  3. Type in a term you added to your profile while exploring your My Site such as a project, skill or responsibility
  4. Hit Enter or click the Go button
  5. Verify that you and others who match that search term was returned as search results  
One area of personalization we haven’t touched on at all yet is publishing links to the Office client. Links to SharePoint lists, libraries, and sites can be published to Office 2007 clients as places to easily retrieve or save documents. To publish links to Office 2007 clients:
  1. Go to Shared Services Administration for your SSP
  2. Under User Profiles and My Sites click on “Published links to Office client applications”
  3. Click New to add a link
  4. Provide a URL, name and type for the link
    1. If you want to the link to only show for a specific set of people then specify and audience
  5. Click OK
To view links in the Office 2007 client:
  1. Open Word 2007
  2. Open the File Open or Save As dialog box
  3. Click on My SharePoint Sites on the leftNote: In order for the service to find the SSP you must set the My Site you created earlier as your default My Site.
  4. Verify link are presented

Configure SharePoint 2007 search to display results based on Custom profile properties.

SharePoint search is very powerful feature which is not used to its full extent often. Many of SharePoint farms use custom user profile properties, but doesn't get configured to return search result based on this meta data.

Below are the step by step description how to configure custom user profile properties in search.

  1.  Create a custom user profile property. Go to Central admin-SSP-User profiles and properties.
  2.  View user profile profiles-click add a new user profile property.
  3. Give a name to it and type of value, check the 'Indexed' box.
  4. Privacy setting can be anything(everyone or only me). Many articles suggest this to be configured as everyone to display in the search. But it really doesn't matter. Whatever the privacy setting once you check the 'Indexed' checkbox the property will be crawled by the search service.


Now lets configure this property in the SSP so that based on this property search can be performed.

  1.  Go to SSP-Search Administration
  2. Click Managed Properties.
  3. Newly created user profile property has to be included here so as to make indexing service crawl this property.
  4. Click add a new property.
  5. Give any name for the propery(not to make complex name the same as your profile property).
  6. Select 'Include values from all crawled properties mapped'.
  7. Click Add Mapping. Under Crawled properties you should see your new user profile properties.
  8. Most commonly you would not see you newly added user profile property here. To do so start a incremental crawl for the content source.
  9. Now go back to your Crawled properties, you will see your custom property. Select it and map it to the new meta data propery.
  10. Click ok.
  11. Do a full crawl.
  12. Now you can perform search based on the custom user profile property added. To verify easily. Go to your mysite. Click Edit profile. You will see the new added property. Click on its value. It should redirect to the search page with the results.


Note: The newly added user profile properties should contain value to be crawled by Search service.

Tuesday, April 12, 2011

SharePoint Page layout error: Only Content controls are allowed directly in a content page that contains Content controls

I was working on a Publishing pages for a customer today. I created a new custom page layout using Visual studio and created a new page based on the page layout. Everything worked fine until today morning. Suddenly my publishing page was throwing a error  " Only Content controls are allowed directly in a content page that contains Content controls". and showed some html elements in the error message which is placed outside of the content place holder.

I double checked my page layout. There was no html elements inside it. Everything is placed under the ContentPlaceHolder. Then whats the problem...very strange..

I opened the page in designer. To my surprise, I could see some html markups added to the page. I don't know what has happened after I deployed my page layout.

I went back to my page layout design and after much analysis i could figure out the culprit. Its the case sensitive of contentplaceholder tag.
My code was like this which is actually fine and should work.

<asp:contentplaceholderId="PlaceHolderPageTitle" runat="server"></asp:content)

I changed the 'c' in the contentplaceholder tag to upper case like this

<asp:ContentPlaceholderID="PlaceHolderPageTitle" runat="server"></asp:Content).

Redeployed the solution and it did the trick. It was working fine. So the lower case of the content place holder tag has actually inserted some html markups to my page which in turn has caused me the error.

Hope this helps someone.




How to delete a Page layout in Master page and layouts library in SharePoint

Today I was working on solution based on Publishing pages. On activating a feature, a new page layout will be deployed to the Master page and layouts document library. On the other way, when I deactivate the feature the solution should delete the deployed page layout and associated content types etc so that I can ensure that no turds are left in the farm.

But to my surprise I was not able to delete the page layouts I created either through code or manually in the document library. It was throwing a very misguiding error "Server error: This item cannot be deleted because it is still referenced by other pages".. After spending a hour or so I figured that there is no page in my site referencing this Page Layout.  Microsoft has confirmed that its a bug in MOSS 2007 thats sometimes the page layout cannot be deleted.

But how do I delete it then?. There is a trick to do it.
1. Open the Master page gallery in windows explorer mode.
2. Create a subfolder and name it 'Delete' (you can give any name to it).
3. Cut and paste your layout.aspx page to the folder.
4. Delete the folder now.

So we confirmed that manually we were able to delete the page layouts. Lets try it programmatically.

SPWeb web=properties.Feature.Parent as SPWeb;
SPSite sitecollection= web.site;
PublishingWeb web=PublishingWeb.GetPublishingWeb(web);
SPFolderCollection folders=web.Lists["Master Page Gallery"].RootFolder.SubFolders;
SPFolder folder =folder.add("Delete");
PublishingSite psite=new PublishingSite(sitecollection);
SPContentType ctype=psite.ContentTypes["SampleCType"];
PageLayoutCollection pagelayouts=psite.GetPageLayouts(ctype,true);
PageLayout layout=pagelayouts["/_catalogs/masterpage/SampleLayout.aspx"];
layout.ListItem.File.MoveTo(folder.url+"/SampleLayout.aspx");
folder.Delete();



Sunday, April 10, 2011

Jquery News Sliders

News broadcasting is becoming a no optional feature in most of the intranet as well as internet corporate portals.  

We can create different form of News slider in JQuery with very few lines of code.

Horizontal News feed:
1.Create a UI list with many items.

<ul  id='listslider'>
<li>Indian Presidents congratulates Indian Cricket team on winning world cup</li>
<li>Shoot out in Libya</li>
<li>Weather gets worst in New york</li></ul>

2. Add a script as below(only 3 lines of code).

$(document).ready(function(){
var interval=setInterval(newslider, 2000);
});

function newsslider()
{
var last=$('ul#listslider li:last').hide().remove();
$('ul#listslider li:last').prepend(last);
$('ul#listslider li:last').slidedown.show();
}

if you want to stop the slider, just call the below script
clearInterval(interval);

In my next article I will post how to create a  vertical news slider.