RSS

Category Archives: Uncategorized

Downloading InfoPath XML file as XML File through C# Program

If you have ever tried downloading XML form from the Forms library through code you might have realized that the downloaded file is no longer XML. 

Here is the code -

using (WebClient client = new WebClient())
{
client.Credentials = CredentialCache.DefaultCredentials;
string strXMLFile = “<siteURL>” + item.Url;
string strPath = @”D:\\” + listName + “\\” + item.Title;
client.DownloadFile(strXMLFile, strPath);
}

If you try the above code then you will be presented a HTML document but not the actual XML. In order to get around this issue you just need to add the parameter ?NoRedirect=true. What this actually tells the server is not to send the information to the forms server to be formatted. This just downloads the XML as it is. If you try the NoRedirect Parameter on IE then it will ask you where to download the file.

So, my final code looks like -

using (WebClient client = new WebClient())
{
client.Credentials = CredentialCache.DefaultCredentials;
string strXMLFile = “<siteURL>” + item.Url?NoRedirect=false;
string strPath = @”D:\\” + listName + “\\” + item.Title;
client.DownloadFile(strXMLFile, strPath);
}

I hope this helps someone :)

 
Leave a comment

Posted by on January 16, 2014 in Uncategorized

 

The maximum message size quota for incoming messages (65536) has been exceeded

Recently I was developing a SharePoint timer Job that references a WCF Service to retrieve some information. I was getting the following message -

The maximum message size quota for incoming messages (65536) has been exceeded. To increase the quota, use the MaxReceivedMessageSize property on the appropriate binding element.

The increase the MaxReceivedMessageSize you normally change the configuration file as follows -

<binding name=”BasicHttpBinding_MyService” maxBufferSize=”2147483647″ maxReceivedMessageSize=”2147483647″ />

But I was writing SharePoint timer Job and the timer job normally uses the owstimer.exe.config file. The file is located at C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN

I was not in favor of changing the config file so I wrote the following code to set the maxReceivedMessageSize -

BasicHttpBinding binding = new BasicHttpBinding();
binding.MaxBufferSize = 2147483647;
binding.MaxReceivedMessageSize = 2147483647;
EndpointAddress remoteAddress = new EndpointAddress(“<your service URL>”);
MyService.ServiceClient service = new MyService.ServiceClient(binding, remoteAddress);
MyService.fieldResponse fieldResponse = service.<Method>;

Happy coding….

 
Leave a comment

Posted by on January 8, 2014 in Uncategorized

 

BCS External List shows wrong Date Time

Issue:

Had a issue raised by one of our clients that while adding holidays to an external list the list was changing the values. For example, New Year day – Even after entering the date as 1/1/2013 12:00 am. It was changing it to 12/31/2013 6 pm.

Cause:

This was caused due to the Normalization Settings. When external content type is created using SharePoint Designer, DateTime fields are set to UTC using the NormalDateTime setting associated to TypeDescriptor for that particular field.

In my scenario, it was displaying as -

<TypeDescriptor TypeName=”System.DateTime” CreatorField=”true” Name=”HolidayDate”>
<Interpretation>
<NormalizeDateTime LobDateTimeMode=”UTC” />
</Interpretation>
</TypeDescriptor>

To fix the issue this needs to read as

<TypeDescriptor TypeName=”System.DateTime” CreatorField=”true” Name=”HolidayDate”>
<Interpretation>
<NormalizeDateTime LobDateTimeMode=”Local” />
</Interpretation>
</TypeDescriptor>

Resolution:

Follow these steps to fix this issue -

1. Open SharePoint Designer.

2. Open the Site.

3. Select External Content types under Site Objects.

4. Select the External Content Type. In my scenario Holidays. Do not click on the name. Just select the row.

5. On the Ribbon click on Export BDC Model.

6. Save the BDC Model to your local machine.

7. The extension would be – BDCM. Change this extension to xml.

8. Open the file in notepad.

9. Locate all the TypeDescriptor for your datetime fields. This is important step. We have to replace all the instances of the TypeDescriptor datetime field. Make sure the Typedescriptor’s interpration element matches the following format -

<TypeDescriptor TypeName=”System.DateTime” CreatorField=”true” Name=”HolidayDate”>
<Interpretation>
<NormalizeDateTime LobDateTimeMode=”Local” />
</Interpretation>
</TypeDescriptor>

10. Save the file.

11. Delete the External Content Type from SharePoint Designer.

12. Close SharePoint Designer.

13. Go to Central Administration

14. Click on Manage Service Applications under Application Management

15. Click on your Business Data Connectivity service.

16. On the ribbon click Import BDC Models.

17. On Import BDC Model browse and select the file.

18. Keep the remaining options as is.

19. Click Import.

20. If everything worked then it will give you import successful message.

21. Make sure you set the object permissions on the newly created External Content Type.

22. Go to your site and delete the external list created for the content type.

23. Recreate this list.

That is it !!!! Your date time should be displaying the correct format.

 
Leave a comment

Posted by on June 26, 2013 in Uncategorized

 

NAPA Office 365 Development Tools

After experimenting with Office 365 I ran into this really useful tool availabe called NAPA Office Development Tools. This tool allows you to create Apps for SharePoint and Office. Please refer to the following NAPA tutorials for more information.

Outlook Mail app - http://msdn.microsoft.com/en-us/library/jj220072.aspx

Excel App - http://msdn.microsoft.com/en-us/library/jj220065.aspx

SharePoint App - http://msdn.microsoft.com/en-us/library/jj220041.aspx

Please be aware that when you create an app for SharePoint it creates a sub web. If you are interested in accessing any lists on the top site level you need to provide permissions through the properties window in NAPA Application. I will blog about this soon.

 
Leave a comment

Posted by on January 4, 2013 in Uncategorized

 

Set-SPAppSiteSubscriptionName : There are no addresses available for this application

After a long time I am blogging about something new. I have started playing around with developing Apps for SharePoint in SharePoint 2013 and already ran into few issues. As developers or IT professionals we hate to read. We just get Visual Studio, SharePoint and just start with creating new app. But did not read the basic document before setting up my environment. So I got some weird errors while trying to deploy the app.

In short, before you even setup anything please read this article - http://msdn.microsoft.com/en-us/library/fp179923.aspx 

But I was receiving error on the final step for Set-SPAppSiteSubscriptionName -Name “apps”.

The error was Set-SPAppSiteSubscriptionName : There are no addresses available for this application.

This error was due to to their was no app domain URL entry for apps.ameettest.local was missing.

I opened the host file and added 127.0.0.1 apps.ameettest.local and then I was able to run the above command.

Ok now to the next problem :)

 
Leave a comment

Posted by on December 6, 2012 in Uncategorized

 

How do I add Custom User Profile Properties with PowerShell

If you have used the Central Administration to add the User Profile Properties you are aware that it can be frustrating with the wait time on adding a single property. That led me to a research on how can we add User Profile Properties through PowerShell. That landed me to this blog – http://gallery.technet.microsoft.com/scriptcenter/SP2010-PowerShell-to-0fda04f7

It worked for me for single property but most of our clients do have multiple properties and that does come from separate connections including External Content Types. So, I did modify the above script and created a csv file of all the available properties that I needed to track. The CSV file has the following properties -

  1. PropertyName – This field is used for the Internal Name of the User Profile.
  2. DisplayName – This field is used for the Display Name property of the User Profile Property.
  3. Privacy – The allowed values are – Public, Contacts, Organization, Manager, Private and NotSet
  4. Privacy Policy – The allowed values are – Mandatory, OptIn, OptOut and Disabled
  5. Type – The data type of the property.
  6. Length – In case of string, enter this value or enter 0
  7. ConnectionName – The Synchronization connection name.
  8. AttributeName – The attribute from the synchronization that you would like to map to.
  9. IsMultivalued – Whether this property will hold multiple values.

My CSV file example looks as -

PropertyName,DisplayName,Privacy,PrivacyPolicy,Type,Length,ConnectionName,AttributeName,IsMultivalued
testskills,Test Skills,Public,Disabled,string,200,EmployeeSkills,Skill,true
testskills1,Test Skills1,Public,Disabled,string,200,EmployeeSkills,Skill,true

EmployeeSkills is the BCS connection that pulls in skills from our database.

The PowerShell script mentioned in the above blog was not working for me. So, I made a few changes. This script accepts two parameters -

Parameter 1 – The csv file path and name

Parameter 2 – The Site URL.

The main thing I added was the IsMultivalued property and also the check to see if the type is string then assign the length. The entire selection is within a foreach loop that goes through each line to pull the property information.

param($Parm1, $Parm2)
#Load SharePoint User Profile assemblies
[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.Office.Server”)
[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.Office.Server.UserProfiles”)
$userProps = Import-Csv $Parm1
 

 
#Get UserProfileManager
$mySiteUrl = $Parm2
$site = Get-SPSite $mySiteUrl
$context = Get-SPServiceContext $site
$upConfigManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileConfigManager($context)
$profilePropertyManager = $upConfigManager.ProfilePropertyManager
$coreprofilePropertyManager = $profilePropertyManager.GetCoreProperties()
$userProfileTypeProperties = $profilePropertyManager.GetProfileTypeProperties([Microsoft.Office.Server.UserProfiles.ProfileType]::User)
$userProfileSubTypeManager = [Microsoft.Office.Server.UserProfiles.ProfileSubTypeManager]::Get($context)
$userProfile = $userProfileSubTypeManager.GetProfileSubtype([Microsoft.Office.Server.UserProfiles.ProfileSubtypeManager]::GetDefaultProfileName([Microsoft.Office.Server.UserProfiles.ProfileType]::User))
$userProfileProperties = $userProfile.Properties 

Foreach ($userProp in $userProps)
{
#Set Custom Property values
$PropertyName = $userProp.PropertyName
$PropertyDisplayName = $userProp.DisplayName
$Privacy= $userProp.Privacy
$PrivacyPolicy = $userProp.PrivacyPolicy
$coreProperty = $coreprofilePropertyManager.Create($false)
$coreProperty.Name = $PropertyName
$coreProperty.DisplayName = $PropertyDisplayName
$coreProperty.Type = $userProp.Type

#Check if the Type is string then assign the length.
if ($userProp.Type -eq ‘string’)
{
$coreProperty.Length = $userProp.Length
}

if ($userProp.IsMultivalued -eq ‘true’)
{
$coreProperty.IsMultivalued = $true
}
$foundProperty = $coreprofilePropertyManager.GetPropertyByName($userProp.PropertyName)

#if the property is found then we delete that property.
if ($foundProperty -ne $null)
{

#Uncomment the code to delete the property.
#$coreprofilePropertyManager.RemovePropertyByName($userProp.PropertyName)
}
$coreprofilePropertyManager.Add($coreProperty)
$profileTypeProperty = $userProfileTypeProperties.Create($coreProperty)
#Show on the Edit Details page
$profileTypeProperty.IsVisibleOnEditor = $true
 
#Show in the profile properties section of the user’s profile page
$profileTypeProperty.IsVisibleOnViewer = $true
 
#Show updates to the property in newsfeed
$profileTypeProperty.IsEventLog = $true
 
$userProfileTypeProperties.Add($profileTypeProperty)
$profileSubTypeProperty = $userProfileProperties.Create($profileTypeProperty)
$profileSubTypeProperty.DefaultPrivacy =[Microsoft.Office.Server.UserProfiles.Privacy]::$Privacy
$profileSubTypeProperty.PrivacyPolicy = [Microsoft.Office.Server.UserProfiles.PrivacyPolicy]::$PrivacyPolicy
$userProfileProperties.Add($profileSubTypeProperty)
 
#Add New Mapping for synchronization user profile data
#SharePoint Synchronization connection
$connectionName =$userProp.ConnectionName
 
#Attribute name in Connection Source

$attributeName =$userProp.AttributeName
 
$synchConnection = $upConfigManager.ConnectionManager[$connectionName]
$synchConnection.PropertyMapping.AddNewMapping([Microsoft.Office.Server.UserProfiles.ProfileType]::User,$PropertyName,$attributeName)

}

 

You can use this code at your own risk :)

Good luck with PowerShell Scripting.

 
Leave a comment

Posted by on March 13, 2012 in Uncategorized

 

How do I point SharePoint User Profile photos to a network share or a web site that contains employee photos?

I have been asked this often – “Our company takes employee photos and we store it on a network folder. We would like to use the company photos instead of users uploading their own photos?”

Background:

The way SharePoint user profiles image work is -

  • All the images are stored on http://<MySiteURL>/User%20Photos/Forms
  • For each user profile there are three sizes for the images. When you upload an image SharePoint converts those to three different sizes and stores it in the above image library.

After googling I found lot of code that would upload the images to the above mentioned library but there was lot of code that would also convert the images into the different sizes and store it. Initially I was inclined towards trying the above route but soon I realized that the client for whom I was working was storing the images with employeeID.jpg format. Most of the code I found online was talking about network name. So, I would have to first compare the employee ID get the image convert it to SharePoint understandable size and then upload it to the library. I had to get this done in 2 hours. So, I started looking for how can I just point the pictureURL property for the User Profile to point to the network drive and just be done with it.

So, there were two options -

  1. Write C# code to populate the pictureURL property. But this would mean I would have to create a setup application and then install it on the server. Didn’t like the option…
  2. Somehow work with PowerShell Script. Did more googling and found the various pieces of the puzzle and brought it together. Following is the solution whch works great for our client.

Solution:

The solution assumes you have already created the User Profile connection with AD. If you are using the EmployeeID as your identifier for your user profile images then make sure you create User Profile property for employeeID and map it to the AD employeeID field. You also need to setup the MySites web application and the url stuff.

Once your user profile is setup and the import is performed. You have to make sure that you have given full control of User Profile Service Application to the user that would be running the PowerShell Script. In order to do that follow these steps -

  • Go to Central Administration.
  • Click on Application Management.
  • Click on Manage Service Applications.
  • Select the User PRofile Service Application. Do not click on the Service Application link.
  • Click on Permissions on the Service Applications Ribbon.
  • If the user you are using to run the PowerShell Script is not in this list then add it and give it full control.

Once the above steps are done now you can use the following PowerShell Script to point the PictureURL to the appropriate location -

#Get the My Site URL Replace the <MySites URL with your url
$siteUrl = “”

#Get the Site Context
$site = Get-SPSite $siteUrl
$servcontext = Get-SPServiceContext $site

#Initiate the Profile Manager and get the user profiles
$profileManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($servcontext)
$profiles = $profileManager.GetEnumerator()

#The property names for picture url and employeeid.
$pictureURLAttribute = “PictureURL”
$employeeIDAttribute = “EmployeeId”

# Loop through all user profiles.
foreach ($uProfile in $profiles)
{
# Make sure there is some value in the employee ID property
if ($uProfile[$employeeIDAttribute] -ne ”)
{
 #Get the EmployeeID for the employee.
 $EmployeeID = $uProfile[$employeeIDAttribute].toString()
 #Format the Picture url. Since this example is for network folders the format starts with \\ Replace the
 $netPictureURL = “\\<network folder>\$EmployeeID.jpg”
 
 #Change the Picture URL information and then commit the record.
 $uProfile[$pictureURLAttribute].Value = $netPictureURL
 $uProfile.Commit()

 }

}

Run the above PowerShell script and all your user profiles will point to the network drive for employee photo.

But if you try to search the results you will still not see the photos on the Search results. Even after running the incremental crawl does not help on the Search Results. Here is the reason why it does not work. If you look at the Search results XSLT code, it actually blocks files that start with \\ or file: or //. You need to modify the XSLT to allow the image files that start with \\ or file:. In order to do that follow these steps -

  • Go to peopleresults.aspx page and edit it.
  • Edit the People core search results web part.
  • Expand Display properties.
  • Uncheck the Use Location Visualization checkbox.
  • Click on XSL Editor button.
  • Search for GetPicUrl. The code should be as follows -

<xsl:template name=”GetPicUrl”>
  <xsl:param name=”PicUrl”/>
  <xsl:param name=”PlaceHolderUrl”/> 
  <xsl:choose>
    <xsl:when test=”string-length($PicUrl) < 1 or starts-with($PicUrl, ‘file:’) or starts-with($PicUrl, ‘\\’) or starts-with($PicUrl, ‘//’)”>
      <xsl:value-of select=”$PlaceHolderUrl”/>
    xsl:when>
    <xsl:otherwise>
      <xsl:value-of select=”$PicUrl”/>
    xsl:otherwise>
  xsl:choose>
xsl:template>

  • Note that the PicUrl is being checked for blank or if it starts with file: or \\ or //. If any of these conditions are true then it displays the default picture if it is false then it actually displays the pictureURL. . Remove all the starts-with code and now the images are visible in the search results page. Your code should now look like -

<xsl:template name=”GetPicUrl”>
  <xsl:param name=”PicUrl”/>
  <xsl:param name=”PlaceHolderUrl”/> 
  <xsl:choose>
    <xsl:when test=”string-length($PicUrl) < 1″>
      <xsl:value-of select=”$PlaceHolderUrl”/>
    xsl:when>
    <xsl:otherwise>
      <xsl:value-of select=”$PicUrl”/>
    xsl:otherwise>
  xsl:choose>
xsl:template>

  • Just in case anyone is wondering how does this template get call. Search for pictureURL. You will get the code which calls this template and passes the pictureURL managed property as parameter.

The above step should assist you with your company policies of using the company photos for user profiles and not the employee uploaded photos.

Happy SharePoint Searching. Use the above code at your own risk :)

 

 
Leave a comment

Posted by on March 12, 2012 in Uncategorized

 

What format are the SharePoint files with extension .stp, .xsn and .wsp?

The answer is simple it is CAB format.

Recently, I was faced with a situation where I had a old SharePoint list template from WSS 3 and that would not import in SharePoint 2010. The solution was simple. Here is what I did -

  • Renamed the .stp file to .cab.
  • Extracted the manifest.xml
  • Changed the element ProductVersion from 3 to 4.
  • Repackaged the file to CAB file. You can create .ddf file and then use the makecab command. Check this link on how to package a web part. Same concept can be used for packaging the .stp file.
  • Rename the .cab to .stp file and import it. AND now you can create a list based on this template.

Similarly, if you are on a computer without InfoPath installed and would like to look at the schema used. Just rename the file to .cab and extract the files. You will notice that .xsn file is made up of multiple files. You can open the template.xml file to find out how your xml could be stored. It also has all the xsd and image files that are included in your InfoPath form.

Good luck with your development on SharePoint.

 
Leave a comment

Posted by on March 2, 2012 in Uncategorized

 

SharePoint Search Sort By dropdown gives a Javascript error

Problem: On the Search results page you have the Search Action Links to display the sort options. Whenever you click on the field to sort on it gives you a Javascript.

Resolution: Make sure your Search box is on the Search Results page.

If you have customized Master Page make sure that you are displaying the Search box. Even if it is hidden you will get the Javascript error. If it is deleted please insert the web part back on the page.

Not sure how the sort by is tied with Search Box web part. :)

 
2 Comments

Posted by on February 22, 2012 in Uncategorized

 

Having issues with adding SharePoint 2010 WebControls to your custom web part

Issue:
You try to add SharePoint WebControl to your custom web part. You don’t seem to see the web part under the Microsoft.SharePoint.WebControls Namespace.
The issue is that the WebControls do not work on Sandbox Solutions.

Resolution:
Follow these steps the change your existing project to turn the project off as Sandbox solution -
1. Click on the project and check the properties window or press F4.
2. On Properties you will change the value of Sandboxed Solution property to False.

Once the above changes are done now you can use the SharePoint Web Controls on your web part.

Happy Coding….

 
Leave a comment

Posted by on February 1, 2012 in Uncategorized

 
 
Follow

Get every new post delivered to your Inbox.