Posts Tagged ‘Featured’
SP 2010: Developing for SharePoint 2010 and Windows Azure – Part 1
June 14th, 2011 by Tobias Zimmergren
Author: Tobias Zimmergren
http://www.zimmergren.net | http://www.tozit.com | @zimmergren
Introduction
After many-a-requests I’ve decided to do an article on how you can work with an Azure-hosted SQL Server and consume that data in SharePoint 2010.
Related articles for working with external data in SharePoint 2010:
A few introductory details about this article…
In this article I will discuss and guide you through how you can utilize the power, scalability, flexibility and awesomeness that comes with the cloud. By following this article you will get an introduction to how you can work with SharePoint together with Windows Azure to store business data.
This article will be an introduction to developing SharePoint solutions to work with Windows Azure, and in later articles I will discuss other approaches where Windows Azure may be a good solution to incorporate in the plans for your organization together with Office 365 and SharePoint Online.
Please note that this article is NOT intended to be an introduction to setting up Windows Azure. Its an introduction to setting up the connection from SharePoint to SQL Azure. More in-depth articles are coming up later.
Prerequisites
In order to follow along with this article and repro these steps yourself, you will need to have the following things in place already:
- A Windows Azure developer account
- An SQL Azure database and a table in that database
- Visual Studio 2010
- SharePoint Designer 2010
- A few sprinkles of awesomeness in your pocket would be nice, just for fun
Please note that in SQL Azure you’d need to hook up the IP-address of the machine running this code or service in order to enable it for connectivity with the SQL Azure database. You’ll see more about that in your SQL Azure portal.
Connect to SQL Azure using Business Connectivity Services in SharePoint 2010
In this section I will talk about how we can create a connection to our SQL Azure database from SharePoint by utilizing BCS. I will for the ease of demo use SharePoint Designer to set it up – and to prove that it works!
1. Make sure you’ve got existing data in one of your SQL Azure databases
In my setup, I’ve got a database called ZimmergrenDemo and a table called ProductSales. I can access the database either from the Windows Azure Platform portal or directly from the SQL Server Management Studio:
I’ve got some sample data that I’ve popped into the SQL Azure Database:
2. Setting up a Secure Store Service configuration for your SQL Azure connection
In order for the BCS runtime to easily be able to authenticate to the SQL Azure database (which is using different credentials than your Windows Server/Domain), you can create a Secure Store application and use that for authentication.
1. Create a new Secure Store Application
Go to Central Admin > Mange Service Applications > Secure Store Service > New
Create a new Secure Store application, looking something like this:
![]()
2. Configure the Secure Store application fields
I add one field for User Name and one for Password, something like this:
3. Add the administrator account(s) needed
Voila! Your Secure Store application is setup, now let’s move on to working with the data in our SQL Azure database.
3. Working with the data though Business Connectivity Services
Now that the SQL Azure database is available and your Secure Store application is configured, it’s time to get the BCS up and running with SharePoint Designer.
The first and foremost option to get up and running quickly is of course to hook up an External List and be able to see your data straight through the standard SharePoint UI.
For a detailed step-by-step instruction for the whole routine to set up a new BCS connection, please refer to my previous articles.
1. Configure the BCS connection using SharePoint Designer
Launch SharePoint Designer and create a new External Content Type and select the SQL option for the data source. Enter the information to your SQL Azure database and the application ID for your Secure Store application.
Connecting to your SQL Azure database through BCS via SPD:
![]()
Since you need to enter the credentials for your impersonated custom identity (the SQL Azure database credentials) – you’ll get this dialog:
Enter the credentials to your SQL Azure database:
![]()
Once that is taken care of, you will be able to follow the normal routines for configuring your BCS connection.
My SQL Azure database, right inside of SPD:
![]()
2. Create an external list and navigate to it in your browser
In whatever way you prefer, create an external list for this External Content Type and navigate to it. You will probably see a link saying “Click here to authenticate“.
Click the link, and you will be provided with this interface:
I probably don’t have to explain that this is where you’ll enter your SQL Azure User Name and Password to make sure your BCS connection authenticates to your SQL Azure database properly.
Okay, when the external list is created and you’ve configured the authentication – you’ll see your data flying in directly from SQL Azure into your SharePoint external list for consumption!
And as always, the coolest thing here is that it’s read and write enabled straight away – you can work with the items in the list much like normal items in any list. Sweet.
Consume the data programmatically from SQL Azure instead
If you don’t want to go with the BCS-approach and just do code directly instead then all you need to do is make sure that you wear the developer-hat and start hacking away a few simple lines of code.
Working with SQL Azure is like working with any other data source, so there’s really no hunky dory magic going on behind the scenes – it’s all just pretty basic.
Here’s a sample Web Part I created to collect the data from SQL Azure and display in SharePoint 2010.
Here’s most of what the code could look like:
public partial class VisualProductSalesUserControl : UserControl
{
private const string connectionString = "Server=tcp:YOURSERVER.database.windows.net;Database=ZimmergrenDemo;User ID=Username@YOURSERVER;Password=myAwesomePassword++;Trusted_Connection=False;Encrypt=True;" ;
private string selectCommand = "select * from ZimmergrenDemo.dbo.ProductSales;" ;
private DataTable productSalesData = new DataTable ("ProductSales" );
protected void FetchAndFill(string connectionString, string selectCommand)
{
using (var connection = new SqlConnection (connectionString))
{
var adaptor = new SqlDataAdapter
{
SelectCommand = new SqlCommand (selectCommand, connection),
};
adaptor.Fill(productSalesData);
salesGrid.DataSource = productSalesData;
salesGrid.DataBind();
}
}
protected void Button1_Click(object sender, System.EventArgs e)
{
FetchAndFill(connectionString, selectCommand);
}
}
Summary
In this article I talked briefly about how you can connect to your SQL Azure database using BCS and then utilize that information from SharePoint – or create a custom solution to access the data.
The reason for this article is to show you that working with Azure isn’t a big and scary task to take upon you – it’s actually all very straight forward!
Enjoy.
- Posted in Technical
- 4 Comments
- Tags: Featured, SharePoint, SharePoint 2010, Windows Azure
SP 2010: Developing for performance Part 5 – Disposal patterns and tools
January 31st, 2011 by Tobias Zimmergren
Author: Tobias Zimmergren
http://www.zimmergren.net | http://www.tozit.com | @zimmergren
Introduction
SharePoint 2010 developing for performance article series:
In this series of articles I will briefly introduce you to some key concepts when it comes to developing for performance in our SharePoint 2010 applications.
Related articles in this article series
Part 1 – SP 2010: Developing for performance Part 1 – Developer Dashboard
Part 2 – SP 2010: Developing for performance Part 2 – SPMonitoredScope
Part 3 – SP 2010: Developing for performance Part 3 – Caching in SharePoint 2010
Part 4 – SP 2010: Developing for performance Part 4 – Logging
Part 5 – SP 2010: Developing for performance Part 5 – Disposal patterns and tools
Part 6 – SP 2010: Developing for performance Part 6 – CSS Sprites
Part 7 – SP 2010: Developing for performance Part 7 – Crunching those scripts
Part 8 – SP 2010: Developing for performance Part 8 – Control that ViewState
Part 5 (this article):
In SharePoint 2010 (and 2007 for that matter) there’s a few objects in the API’s that requires your special attention in order to behave properly. If you do not consider the disposal patterns and rules set forth, your application may very well suffer performance issues. In this article I will briefly touch upon the subject of disposing your SharePoint objects and foremost enlighten how important it is to dispose the objects!
What does Disposing mean and why is it important?
When I deliver training, there’s always the question about why disposing is important. In SharePoint there’s valid grounds for saying it’s important to dispose, more than just saying "It’s best practice". If you don’t properly dispose some of your objects in SharePoint you’ll quickly face performance issues since those objects don’t get caught and disposed by the Garbage Collector in a timely fashion as most other objects do in .NET.
What is a "dispose pattern"?
The Dispose Pattern is the approach used to properly dispose and clean up the resources you’re using in your projects when programming in .NET (or other runtimes). Normally there’s an automatic garbage collector doing the cleanup for you – but in certain scenarios (like the ones described later in this article), you’ll need to manually dispose your objects.
IDisposable
In Microsoft .NET when an object inherits from the IDisposable interface it means that the Garbage Collector will call the .Dispose() method of that object when it’s no longer used. The Dispose() method in turn calls the Close() method which generally means you should call the .Dispose() method instead of the .Close() method to make sure the objects are properly disposed. Keep reading to see why this is so important!
Why is manual disposal really, really important in SharePoint?
Some of the objects you’re working with heavily in the SharePoint object model (for example the SPWeb and SPSite) are mostly using unmanaged code – and since the managed part of the code is quite small it doesn’t leave a large memory footprint and hence the Garbage Collector don’t necessarily dispose of that object – which means that it’ll be occupying server resources for a longer time if you don’t manually dispose of those objects.
What happens if I forget to dispose?
There’s several things that you may notice in your applications if you’ve implemented a solution that are not properly disposing their objects.
- Memory consumption.
- The consumption of your server memory may peak and the worker process (w3wp.exe) may consume a lot more memory than it would normally have to consume.
- Application Pool recycling.
- If the worker process consumes too much memory, it’ll recycle the application pool.
- If you’ve got an underperforming application causing overwhelming memory consumption the Application Pool will recycle more often.
- Performance issues!
- Slow response times
- Timeouts
- Unexpected errors
- Headache
- User headache
- Support headache
- Admin headache
- Developer headache (ultimately)
In other words: Make sure you’re properly disposing your objects at all times!
Sandboxed Solutions and Resource Usage – Think about dispose patterns!
If you’re developing applications for the Sandbox in SharePoint 2010 (User Code Solutions / Sandboxed Solutions) you may be aware of the resource point system that will limit your application’s usage of resources on the server. This is a great way to keep the admins calm and developers keen on producing quality code.
A thing to note is that if you don’t correctly dispose your objects they will consume more server resources which in turn would lead to the resource points increasing. If the resource usage reaches the limits set forth by SharePoint for a sandboxed solution – it’ll deactivate it.
In other words: Make sure you’re properly disposing your objects at all times!
Let’s visualize the performance problem!
Okay, so now that I’ve got your attention – let’s do a quick performance test to see how the process handles the memory if we create the same application with and without disposal patterns in SharePoint.
I created a simple application that will work heavily with the SPSite and SPWeb objects on one of my servers. After hooking up a performance counter and monitoring the memory consumption repeatedly during a few hours of repeated execution it was easy to line down a conclusion which you can see in the chart below.
Performance summary
The following chart displays the same application with and without implementing the dispose patterns in a SharePoint 2010 execution environment.
You can see by the results of the two applications above that when we’re properly disposing our objects there’s a notable difference in the performance in our application – and hence the overall server resource usage.
In other words: Make sure you’re properly disposing your objects at all times!
How to: Implement dispose patterns in your SharePoint code
At this point we know it’s very important to dispose our objects in SharePoint – let’s take a look at how we can do that properly and what tooling and guidelines we can use to help us in this important quest!
Approach 1 – Manually calling Dispose()
The absolutely most general and simple approach to dispose your objects is to simply call the .Dispose() method of your objects:
SPSite site = new SPSite ("http://zimmergren/");
// Do stuff
site.Dispose();
Approach 2 – Encapsulating the statement in a using() block
A more common approach is to encapsulate the code in a using-block where the object will be automatically disposed when we’re reaching the end of our block.
using (SPSite site = new SPSite ("http://zimmergren"));
{
// Do stuff
}
Approach 3 – Utilize a try/finally block
Whenever you’re expecting to catch an exception or somehow might stumble onto exceptions and need to handle them – a better approach for disposing is to create a try-finally block and dispose the object in the finally-block.
Sample 1: Without exception handling
SPSite site = null ;
try
{
site = new SPSite ("http://zimmergren");
// do stuff
}
finally
{
if (site!=null ) site.Dispose();
}
Sample 2: With exception handling
SPSite site = null ;
try
{
site = new SPSite ("http://zimmergren");
// do stuff
}
catch (Exception ex)
{
// Handle the exception
// Possibly send it to the logs
}
finally
{
if (site!=null ) site.Dispose();
}
SharePoint 2010 Logging information: http://zimmergren.net/archive/2011/01/17/sp-2010-developing-for-performance-part-4-logging.aspx
Approach 4 – A mix of the aforementioned approaches
In some scenarios it might be a necessity to mix the aforementioned methods for disposing.
using (SPSite site = new SPSite ("http://zimmergren"))
{
foreach (SPSite oSite in site.WebApplication.Sites)
{
try
{
// Do stuff
}
catch (Exception ex)
{
// Log and handle exceptions
}
finally
{
if (oSite!=null ) oSite.Dispose();
}
}
}
Using SPDisposeCheck.exe to help us check for issues
It’s one thing to be pro-active and think about the dispose patterns when you’re developing your applications – but sometimes you can’t cope for every scenario in your complex code. Don’t worry though – you’ve got one of my best friends to help you out with that – the SPDisposeCheck.exe tool that Microsoft released to check for disposal problems.
Download and install it
There’s a new version of the popular dispose-check tool for SharePoint called SPDisposeCheck. You can find it here: http://code.msdn.microsoft.com/SPDisposeCheck
Grab your copy of the tool and hang on tight for the ride!
Configure it
When you’ve installed the tool, you can see a new menu option in the "Tools" menu:
Clicking the "SharePoint Dispose Check" menu item will bring up the SPDisposeCheck configuration menu like this:
In this dialog you can configure how the tool should behave, and if it should execute after each build. What’s even cooler is you can choose how to treat the problems.
When you’re building your Visual Studio project, the SPDisposeCheck will perform a post-build command (if you’ve ticked the Execute After Build checkbox) – and you’ll see the output directly in your Error-window:
Tip!
Always have this tool installed, and every now and then run the SPDisposeCheck to make sure your code is properly disposing your objects. Otherwise it’ll warn you like in the picture above![]()
False positives
When it comes to checking for dispose problems or leaks with this tool, it can sometimes give you something you’d refer to as "a false positive". What that generally means is that although the tool might report a problem, it really isn’t.
Ignoring reports
Sometimes with the SPDisposeCheck tool you’ll get quite a bunch of "false positives" reported, or for whatever other reason you’d like to ignore certain error messages from the SPDisposeCheck tool – you can do that by implementing the SPDisposeCheckIgnore attribute (available as source code in the SPDisposeCheck installation folder).
The following code snippet is taken from the "SPDisposeCheckIgnoreAttribute.cs" file in the SPDisposeCheck installation folder. Add this code to your project (you can change the namespace..):
using System;
namespace Zimmergren.SP2010.DisposePatterns
{
public enum SPDisposeCheckID
{
// SPDisposeCheckIDs.
SPDisposeCheckID_000 = 0,
SPDisposeCheckID_100 = 100,
SPDisposeCheckID_110 = 110,
SPDisposeCheckID_120 = 120,
SPDisposeCheckID_130 = 130,
SPDisposeCheckID_140 = 140,
SPDisposeCheckID_150 = 150,
SPDisposeCheckID_160 = 160,
SPDisposeCheckID_170 = 170,
SPDisposeCheckID_180 = 180,
SPDisposeCheckID_190 = 190,
SPDisposeCheckID_200 = 200,
SPDisposeCheckID_210 = 210,
SPDisposeCheckID_220 = 220,
SPDisposeCheckID_230 = 230,
SPDisposeCheckID_240 = 240,
SPDisposeCheckID_300 = 300,
SPDisposeCheckID_310 = 310,
SPDisposeCheckID_320 = 320,
SPDisposeCheckID_400 = 400,
SPDisposeCheckID_500 = 500,
SPDisposeCheckID_999 = 999
}
[AttributeUsage (AttributeTargets .Method | AttributeTargets .Assembly,
Inherited = false , AllowMultiple = true )]
public class SPDisposeCheckIgnore : Attribute
{
public SPDisposeCheckIgnore(SPDisposeCheckID Id, string Reason)
{
_id = Id;
_reason = Reason;
}
protected SPDisposeCheckID _id;
protected string _reason;
public SPDisposeCheckID Id
{
get { return _id; }
set { _id = Id; }
}
public string Reason
{
get { return _reason; }
set { _reason = Reason; }
}
}
}
Once you’ve done that, you can use the attribute on your methods and assemblies to tell them to ignore that specific item.
Example usage of the SPDisposeCheckIgnore attribute:
[SPDisposeCheckIgnore (SPDisposeCheckID .SPDisposeCheckID_110,
"False Positive, nothing to see here, move along!" )]
private static void MyAwesomeMethod()
{
// Your method code with false positives
}
What if I’m an awesome coder already?
Too many times have I encountered problems in projects due to not properly checking for memory leaks.
Better safe than sorry. That’s all I’m going to say about that
Summary & Links
What we’ve learned from this article is that you should always keep in mind how you handle your objects in your code – and especially when it comes to the SharePoint objects that are invoking unmanaged code like the SPWeb and SPSite objects (to name two common ones).
Make sure you’ve downloaded the latest version of the SPDisposeCheck tool to get the aforementioned fancy integration into Visual Studio 2010. It’s pretty awesome indeed!
Links / Resources
Enjoy!
- Posted in Technical
- 1 Comment
- Tags: Featured, How-To, Performance, SharePoint, SP2010
SP 2010: Developing for performance Part 4 – Logging
January 17th, 2011 by Tobias Zimmergren
Author: Tobias Zimmergren
http://www.zimmergren.net | http://www.tozit.com | @zimmergren
Introduction
SharePoint 2010 developing for performance article series:
In this series of articles I will briefly introduce you to some key concepts when it comes to developing for performance in our SharePoint 2010 applications.
Related articles in this article series
Part 1 – SP 2010: Developing for performance Part 1 – Developer Dashboard
Part 2 – SP 2010: Developing for performance Part 2 – SPMonitoredScope
Part 3 – SP 2010: Developing for performance Part 3 – Caching in SharePoint 2010
Part 4 – SP 2010: Developing for performance Part 4 – Logging
Part 5 – SP 2010: Developing for performance Part 5 – Disposal patterns and tools
Part 6 – SP 2010: Developing for performance Part 6 – CSS Sprites
Part 7 – SP 2010: Developing for performance Part 7 – Crunching those scripts
Part 8 – SP 2010: Developing for performance Part 8 – Control that ViewState
Part 4 (this article):
In SharePoint 2010 (well, 2007 too for that matter) you need to think about proper logging in your applications to ensure that any problems, issues or other events are lifted to the ULS Logs (Unified Logging System) – that way the administrators can easily view the logs and track down problems with your applications. In this article I will talk a bit about how you can utilize the logging capabilities in SharePoint 2010.
ULS Logs
The ULS Logs are the main place for SharePoint to output it’s diagnostics information. We will take a quick look at how we can read the logs and obviously how we can write custom logging messages to the logs.
Reading the ULS Logs in SharePoint 2010
In order to read the ULS Logs you’ll need access to the SharePointRoot (14LOGS) folder. But to make the life even easier for us Microsoft released a tool called the ULS Viewer which you can download here: http://code.msdn.microsoft.com/ULSViewer
With this tool you can quite easily read through the logs in SharePoint 2010 without any issues.
There’s plenty of resources on the web about how to use the ULS Viewer, so go take a look at any one of them for some usage-instructions.
Download (docx): ULS Viewer documentation
Writing to the ULS Logs from you SharePoint 2010 application
The other side of the logs are of course writing to the logs. This is not a very hard task to do in SharePoint 2010, and I’ll outline the basic steps to do so here.
Normally I create a new class or at least a method to take care of the logging, and it can look like this:
public static void WriteTrace(Exception ex)
{
SPDiagnosticsService diagSvc = SPDiagnosticsService.Local;
diagSvc.WriteTrace(0,
new SPDiagnosticsCategory("TOZIT Exception",
TraceSeverity.Monitorable,
EventSeverity.Error),
TraceSeverity.Monitorable,
"An exception occurred: {0}",
new object[] {ex});
}
You can use the aforementioned code by calling the method like so:
try
{
throw new Exception("Oh no, application malfunctioned! UnAwesomeness!!!");
}
catch(Exception ex)
{
WriteEvent(ex);
}
It’s not very hard at all – once you’ve done that, you’re all set to kick off your custom applications and just call your custom logging method. Obviously you should create a proper logging class to take care of all your logging in your applications.
Results
Using the ULS Viewer you can easily track down the error messages by filtering on your category (in my case it’s TOZIT Exception)
Event Logs
Even though the ULS Logs takes care of most of the diagnostics logging today, it might be reasonable to output information into the Event Logs sometime.
Writing to the Event Logs from you SharePoint 2010 application
Just as when you’re doing ULS Logging, you can do logging to the Event Logs. It’s just as simple, but you replace the method "WriteTrace" with "WriteEvent" like this:
public static void WriteEvent(Exception ex)
{
SPDiagnosticsService diagSvc = SPDiagnosticsService.Local;
diagSvc.WriteEvent(0,
new SPDiagnosticsCategory("TOZIT Exception",
TraceSeverity.Monitorable,
EventSeverity.Warning),
EventSeverity.Error,
"Exception occured {0}", new object[] {ex});
}
Results
You can view the logs in the Event Logs on your SharePoint server as you would read any other logs.
Can I do more?
There’s plenty of cool things to do with the logging mechanism in SharePoint 2010, so you should definitively get your hands dirty playing around with it.
If you for example want to tag the log entries with your company name, clients name or project name – you can easily change that behavior as well. Take a look at my friend Waldek’s post about it here: http://blog.mastykarz.nl/logging-uls-sharepoint-2010/
Related resources
Summary
As a part of the article series focusing on some general guidelines for performance in your applications, logging is a major player. If you master your logs in terms of monitoring and custom application logging you will quickly come to realize how valuable it is.
This is intended as a starting point for you to get familiar with the logging-capabilities in SharePoint 2010.
- Posted in Technical
- 1 Comment
- Tags: Debugging, Featured, Logging, Performance, SharePoint, SharePoint 2010, ULS
SP 2010: Developing for performance Part 2 – SPMonitoredScope
December 21st, 2010 by Tobias Zimmergren
Author: Tobias Zimmergren
http://www.zimmergren.net | http://www.tozit.com | @zimmergren
Introduction
SharePoint 2010 developing for performance article series:
In this series of articles I will briefly introduce you to some key concepts when it comes to developing for performance in our SharePoint 2010 applications.
Related articles in this article series
Part 1 – SP 2010: Developing for performance Part 1 – Developer Dashboard
Part 2 – SP 2010: Developing for performance Part 2 – SPMonitoredScope
Part 3 – SP 2010: Developing for performance Part 3 – Caching in SharePoint 2010
Part 4 – SP 2010: Developing for performance Part 4 – Logging
Part 5 – SP 2010: Developing for performance Part 5 – Disposal patterns and tools
Part 6 – SP 2010: Developing for performance Part 6 – CSS Sprites
Part 7 – SP 2010: Developing for performance Part 7 – Crunching those scripts
Part 8 – SP 2010: Developing for performance Part 8 – Control that ViewState
Part 2 (this article):
In this article I will talk briefly about what SPMonitoredScopes are and how you can utilize them in combination with your developer dashboard to get some stats and performance information about your custom applications.
SPMonitoredScope to track performance in your applications
The monitored scope (SPMonitoredScope) is a class you can use to monitor performance and resource usage in your applications by using it in a simple code block.
The pros about using the monitored scopes are of course that you can easily track down and find bottlenecks as well as do some initial performance monitoring while doing your development.
Using SPMonitoredScope
In order to use the SPMonitoredScope you’ll need to add a using statement for Microsoft.SharePoint.Utilities and then wrap your code in a statement like this:
using (new SPMonitoredScope("CallMethod1 Monitored Scope"))
{
Controls.Add(new Literal {Text = "Awesomeness<br/>"});
}
You don’t need to add any more code than this in order for it to be hooked up.
See the results
So what now, what if I’ve added some monitored scopes to some of my classes – where can I see the results?
Answer: Open up your developer dashboard on the page where your code is executing and pow, you’ll see it right there:
Note: I’ve added three monitored scopes in my code, as seen below named CallMethod1,2,3 ![]()
You can see that the CallMethod3 is the one dragging this page down in my particular case. Easy enough to keep track of the request time for your pages!
You can even nest your scopes
If you’ve got nested method calls and a bit more code (you’re likely to have that), you can of course nest your monitored scopes. There’s nothing to it really, you can instantiate new monitored scopes inside of a monitored scope:
using (new SPMonitoredScope("My Monitored Scope"))
{
Controls.Add(new Literal { Text = "When the awesomeness is flying… " });
using (new SPMonitoredScope("My Sub-Monitored Scope"))
{
Controls.Add(new Literal { Text = "there’s no stopping it! " });using (new SPMonitoredScope("My Sub-Sub-Monitored Scope"))
{
Controls.Add(new Literal { Text = "<br/>I’m three levels deep!" });
}using (new SPMonitoredScope("Another deep scope"))
{
Controls.Add(new Literal { Text = "Rock and rumble, rock and rumble" });
}
}
}
Results: Nested scopes (My Monitored Scope)! ![]()
Limitations
The SPMonitoredScope is NOT available for Sandboxed solutions unfortunately, so this neat trick will not work if you’re planning on deploying to the sandbox.
Summary
This was a short introduction to the SPMonitoredScope class that you can utilize in SharePoint 2010 when doing custom development. The pros with using these monitored scopes is that you can easily track performance of your custom applications using the Developer Dashboard without even hooking up any debugger or external performance monitor to your servers – this is all done and visualized in the web browser upon displaying the Developer Dashboard.
This is a very easy trick to keep an eye out for performance bottlenecks in your applications for SP 2010.
Enjoy!
- Posted in Technical
- No Comments
- Tags: Debugging, Featured, Logging, Performance, SharePoint, SharePoint 2010
SP 2010: Developing for performance Part 1 – Developer Dashboard
December 18th, 2010 by Tobias Zimmergren
Author: Tobias Zimmergren
http://www.zimmergren.net | http://www.tozit.com | @zimmergren
Introduction
SharePoint 2010 developing for performance article series:
In this series of articles I will briefly introduce you to some key concepts when it comes to developing for performance in our SharePoint 2010 applications.
Related articles in this article series
Part 1 – SP 2010: Developing for performance Part 1 – Developer Dashboard
Part 2 – SP 2010: Developing for performance Part 2 – SPMonitoredScope
Part 3 – SP 2010: Developing for performance Part 3 – Caching in SharePoint 2010
Part 4 – SP 2010: Developing for performance Part 4 – Logging
Part 5 – SP 2010: Developing for performance Part 5 – Disposal patterns and tools
Part 6 – SP 2010: Developing for performance Part 6 – CSS Sprites
Part 7 – SP 2010: Developing for performance Part 7 – Crunching those scripts
Part 8 – SP 2010: Developing for performance Part 8 – Control that ViewState
Part 1 (This article):
This is Part 1 of 5 where I will introduce you to the developer dashboard in SharePoint 2010. The reason for the developer dashboard being a key concept in your SharePoint development tasks is the quick and effective manner of which you can start looking for bottlenecks and problems in your installation without launching any additional tools.
SharePoint 2010 Developer Dashboard
The developer dashboard is a perfect tool for anyone who wants a quick way to access information about what goes on while rendering a page in SharePoint. It contains information about Web Parts, events, DB calls and a whole lot of nifty information.
Activating the Developer Dashboard
Developer Dashboard is a utility that is available in all SharePoint 2010 versions, and can be enabled in a few different ways:
- PowerShell
- STSADM.exe
- SharePoint Object Model (API’s)
Using these different approaches is very simple; All you will need to do is use one of the aforementioned methods to activate the dashboards, as described here:
Activate the Developer Dashboard using PowerShell:
$devdash =
Microsoft.SharePoint.Administration.SPWebService]::ContentService.DeveloperDashboardSettings;
$devdash.DisplayLevel = ‘OnDemand’;
$devdash.TraceEnabled = $true;
$devdash.Update()
Activate the Developer Dashboard using STSADM.EXE
STSADM.EXE -o setproperty -pn developer-dashboard -pv ondemand
Activate the Developer Dashboard using the SharePoint Object Model
using Microsoft.SharePoint.Administration;
SPWebService svc = SPContext.Current.Site.WebApplication.WebService;
svc.DeveloperDashboardSettings.DisplayLevel =
SPDeveloperDashboardLevel.Off;
svc.DeveloperDashboardSettings.Update();
Note that in the preceding samples I’ve used a property called "OnDemand". This can be set to the following values:
- Off (Disables the Developer Dashboard)
- On (Enables the Developer Dashboard)
- OnDemand (Enables the Developer Dashboard upon request by clicking the icon in the upper right corner)
If the Developer Dashboard is set to OnDemand, this button appears in the top right corner just next to your login name: ![]()
As a side note, you can also enable Tracing for your developer dashboard to enable your dashboard to display the asp.net page trace. I will cover this a bit further down.
Reading the Developer Dashboard information
When you click the small icon in the top right corner, the Developer Dashboard will be opened and displayed at the bottom of your page.
You can see that it has a Green border right now. That generally means it’s loading quick enough not to be a real problem. It can also render Yellow, which indicates that there’s a slight delay and then it could render a Red border which would mean you definitely need to look into it immediately!
So, what information can you read out of this?
Page Request to the left-hand side
You can read out the Page Request, and see what loads and how long it takes to load. This is perfect to use to track down heavy-loading apps or finding out what’s taking so long to render the page; ![]()
Web Server, Events, DB Queries, Service Calls, SPRequests, Web Part Events on the right-hand side
Dig deeper into the SQL DB queries by clicking on the link
If you’d like to get some more in-depth information about what query was shot away to the DB, click the hyperlink corresponding the query you want to find out about and you’ll see something like this;
Displaying ASP.NET Trace information
One thing that I absolutely love about this tool is the ability for the tool to enable Tracing (this should be enabled when you enable the Developer Dashboard using the SP Object Model or PowerShell by setting the following flag:
DeveloperDashboardSettings.TraceEnabled = true;
If you’ve done this, and you’ve got the Developer Dashboard enabled – you should see the following link in the bottom left area of the developer dashboard: ![]()
If you click it, you’ll see the full ASP.NET Page Trace like this (awesome, very very awesome): ![]()
The beauty about this is you don’t have to go and edit the web.config and enable tracing there – you just click this little button and it’s all done. I love it.
Developer Dashboard Visualizer – Extend your developer dashboard with diagrams
One of my friends Jaap Vossers wrote up a cool functionality to use in conjunction with the Developer Dashboard – Developer Dashboard Visualizer – which is a cool utility if you want to visualize what the rendering process looks like on your page.
If you’ve downloaded this awesome solution, you’ll see a new Site Collection feature that you’ll need to enable: ![]()
Once that’s done, next time you’ll visit the Developer Dashboard awesomeness it’ll look something like this: ![]()
Developer Dashboard activation as a Feature
My good friend Wictor Wilén wrote a quick and cool feature to ease the activation of the Developer Dashboard settings (find it here) which allows you to more easily change the settings of the developer dashboard without doing it by typing any scripts or code.
Once you’ve downloaded and installed the solution, you’ll find a new Farm feature that should be activated, which provides some functionality to Central Administration for administering the Dev Dashboard: ![]()
If you’ve deployed and got this feature activated, head on over to General Application Settings and you’ll see that you’ve got a new header called "Development Settings" containing a link to "Developer Dashboard Settings".
Click it and you’ll see this very awesome page that enables you to configure the Developer Dashboard without actually writing any code!
Summary
In this article you’ve read about the Developer Dashboard and how to enable it, and a few extra tips that you can download and install to make your experience with the Developer Dashboard even cooler.
This was part 1 in an article series talking about a few concepts we’ll need to understand in order to properly plan and design for performance in our SharePoint 2010 applications.
Stay tunes for parts 2-5.
Enjoy!
- Posted in Technical
- No Comments
- Tags: Debugging, Featured, How-To, Logging, Performance, SharePoint, SharePoint 2010
