Monday, 4 February 2013

SQL Server Reporting Service Deliver Extension with User Control

Introduction

Creation of a reporting service custom delivery extension is straight forward and there are many examples available over the Internet for reference (Print Delivery, FTP Delivery on CodePlex). But all of them has created custom server control if you want to take user inputs (like Rendering Format, Location etc) during subscription creation. Since creating a server control is both time consuming and tedious process, I will explain in this article, how to add user control (.ascx) instead. User control is relatively easy to create, debug, test and format.

Background

While I was trying my hand on creating custom delivery extension of the reporting service, all the examples I have seen was using custom server control. I personally do not like server control if the control is not re-usable and can not be attached with visual studio tool box. So I tried creating a simple user control and added to my extension. It worked like a charm and help me save lots of time. Only drawback is that we also have to deploy User control (.ascx )on the report server.

Details

The detailed article with source code is published at www.codeproject.com. Please click here

Monday, 28 January 2013

Open XML 2.0 and Word Processing

I am sure those who have tried his hands on Open XML SDK, must have used Word Content Control Toolkit available at codeplex.

The exe is prepared by Microsoft itself and pretty old but can be used to create word document quickly through code. It makes template creation for Mail Merge like solution very easy.

Use the tool to map your content controls with custom xml and use the below code to replace your content with xml data.

Below code has ContentXML variable that has required data.

using (MemoryStream ms = new MemoryStream())
            {
                ms.Write(_templateDocument, 0, _templateDocument.Length);
                using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(ms, true))
                {

                    MainDocumentPart main = wordDocument.MainDocumentPart;
                    Document document = main.Document;
                    main.DeleteParts<CustomXmlPart>(main.CustomXmlParts);

                    //add and write new XML part
                    CustomXmlPart customXmlPart =   main.AddCustomXmlPart(CustomXmlPartType.CustomXml);
                    using (StreamWriter ts = new StreamWriter(customXmlPart.GetStream()))
                    {
                        ts.Write(ContentXML);
                    }

                    document.Save();
                }
              

References
 http://blogs.msdn.com/b/acoat/archive/2007/03/01/linking-word-2007-content-controls-to-custom-xml.aspx
http://msdn.microsoft.com/en-us/library/office/bb510135%28v=office.12%29.aspx


Thursday, 23 August 2012

SharePoint 2010 Customize XSLT Changes

I wanted to perform as small task. When user clicks on my Purchase Order document library, instead of showing "Add document" link, I wanted to rename it to "Add Purchase Order" link.

There are multiple ways to achieve it
  1. Write JavaScript to get the element by anchor tag id and modify the inner text
  2. Customize the Xslt of the XSLTListViewWebPart by clicking on Customize XSLT -> Entire View in SharePoint designer. And change the AddNewText variable value for Template Type 115. 
Search for below text and change the value of "Add document" to "Whatever you like"
<xsl:with-param name="AddNewText">

But no matter whatever I modify, the changes are never reflected in browser. After trying 10-15 times and searching around. I found the solution.

Remove all the ddwrt:ghost="hide" attributes from the XSLT.

Wohoooooo... What a time waste.

Tuesday, 12 June 2012

WCF REST 4.0 Authorization & Form Authentication (SetAuthCookie)

Windows Communication Foundation provides tons of methods to authenticate users' check for authorization based on service type and it is quite confusing to implement simple form based authentication and role based authorization for WCF REST 4.0.
Note: This article assumes that WCF REST service is hosted with ASP.NET application and shares the same web.config. Make sure that Form Authentication is enabled in web.config file.

Something like this
WebGet(UriTemplate = "")]
[PrincipalPermission(SecurityAction.Demand, Role="Admin")]
public List<SampleItem> GetCollection(){}

But even though after user is authenticated using Membership provider and HTTPContext.Current.User.Identity and the context is available at service level, the principal permission attribute always throws a security exception.

The reason for that is because principal permission attribute checks for System.Threading.Thread.CurrentPrincipal.Identity and not for HTTPContext Identity.
To solve this problem, we have to create a Custom Principal and Authorization Policy for WCF Service. Then this Policy will be hooked with WCF REST Service using ServiceBehaviour.

For detailed code follow my post codeproject.com written sometime back.
 

Monday, 4 June 2012

Migrating FBA' User from MOSS 2007 to SP 2010


I remembered writing a power shell script to migrate forma based authentication user to claim based while working in one of the MOSS 2007 to SP 2010 migration project. I also shared the power shell script in one of the blog. But next time when I required it, I could not find it easily. So now it's time I realize to start my blog. Here I am documenting and sharing some code.

Here is the original post. (Yes my name is Anu too)
Jasper's Blog

The easy way is a simple Powershell script:

$w = Get-SPWebApplication(“url”)
$w.MigrateUsers(true)

But this script seems to have a hard coded limit to the number of users it handles or sometimes does not work. I had more then 5k users in my database, which resulted in not all users being converted. When you need to convert more, I has provided a Powershell script which will do this:

[System.Reflection.Assembly]::LoadWithPartialName(“System.Web”) | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.SharePoint”) | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.SharePoint.Administration”) | Out-Null
$spFarm = [Microsoft.SharePoint.Administration.SPfarm]::Local
$site = New-Object Microsoft.SharePoint.SPSite(“yoursitename”);
$site.RootWeb.SiteUsers | ForEach-Object {
$name = $_.LoginName
#Write-Host $name
if($name.StartsWith(“providername:”))
{ 
Write-Host $name
$newName = $name.Replace(“providername:”, “i:0#.f|providername|”)
Write-Host $newName
$spFarm.MigrateUserAccount($name, $newName, $False)
Write-Host “Migrated User:”
}
}
$site.Dispose()

This script uses the MigrateUserAccount command to convert a single user, and loops through all users which have not yet been converted. You can tell by the format of the username; old 2007 users will be in the format ´providername:username´, new ones will look like ´i:0#.f|providername|username´.