Programming SharePoint
Object Model, Web
Services, and Events
Michael Morton
4/15/03
Summary of .NET support
SharePoint will use ASP.NET instead of
ISAPI for base page execution
Web Part Framework
Server Object Model for programmatic
access to SharePoint data
We offer functionality as XML web
services for access from remote
machines
.NET Object Model
Managed code object model on the
server
Accessible via ASP.NET or any other
server process
Implemented in C#
Exposes almost of all of the data stored
in WSS
NET Object model
Examples of what can be done with the Object
Mode:
Add, edit, delete, and retrieve data from SharePoint
Lists
Create new lists and set list metadata (e.g. the fields in
a list)
Set web properties
Work with documents in document libraries.
Perform administrative tasks such as creating webs,
adding users, creating roles, etc.
Pretty much any functionality in the UI can be
automated through the OM!
Example Objects
List Data Security
SPField
SPGroup
SPFieldCollection
SPListCollection
SPGroupCollection
SPList SPSite
SPListItemCollection SPUser
SPListItem SPUserCollection
SPView
Documents
Administration
SPDocumentLibrary
SPGlobalAdmin
SPQuota
SPFile
SPVirtualServer SPFileCollection
SPFolder
ASP.Net Security
For content stored in WSS, only registered
set of web custom controls will run in pages
Inline script in the page will not execute
Code behind in pages can be made to work
All Executable code (e.g. web custom
controls, web parts, and code-behind
classes) needs to be installed on physical
web server
Getting Started with OM
Build a web part
This is the best option to write code that
functions are part of a WSS site or
solution
There will be lots of documentation with
the beta on how to build a web part.
Web Part is reusable and can be managed
using all of the web part tools and UI.
Getting Started with the OM
Build an ASPX page
Code cannot live inline in a page within the site.
Creating pages underneath the /_layouts
directory is often the best option for custom
ASPX apps on top of SharePoint
This lets your page be accessible from any web. For
example, if you build mypage.aspx in _Layouts, it is
accessible from the following URLs:
http://myweb/_layouts/myapp/mypage.aspx
http://myweb/subweb1/_layouts/myapp/mypage.aspx
ASPX page will run using the context of the web under
which it is running.
Getting Started with the OM
Windows Executable or any other
application
Object model can be called from pretty
much any code context. It is not limited
to just web parts or ASP.Net
For example, you could build a command-
line utility to perform certain actions
Demo
Hello World Web Part
Working with the OM
The object model has three top-level objects:
SPWeb (represents an individual site)
SPSite (represents a site collection, which is a
set of web sites)
SPGlobalAdmin (used for global administration
settings)
In order to perform actions on data within a
web, you must first get an SPWeb object.
Adding our namespace
You should add references to the
WSS namespaces to your source
files
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.Administration;
…
Key Object – SPWeb
Starting point to get at the Lists, Items,
Documents, Users, Alerts, etc. for a web site.
Example Properties:
Web.Lists (returns a collection of lists)
Web.Title (returns the title of the site)
Web.Users (returns the users on the site)
In a web part or ASPX page, you can use the
following line to get a SPWeb:
SPWeb myweb = SPControl.GetContextWeb(Context);
Demo
Showing Web and List Properties
Accessing data in a WSS
List
Get a SPList or SPDocumentLibrary object.
SPList mylist = web.Lists[“Events”];
You can then call the .Items property to get
all of the items:
SPListItemCollection items = mylist.Items;
If you only want a subset of the items, call
the GetItems method and pass a SPQuery
object
SPListItemCollection items =
mylist.GetItems(query);
Accessing data in a list
To get data for a field, specify the field
name in the indexer for an SPListItem
foreach(SPListItem item in items)
{
Response.Write(item["Due Date"].ToString());
Response.Write(item["Status"].ToString());
Response.WRite(item["Title"].ToString());
}
Full Example
SPWeb web = SPControl.GetContextWeb(Context);
SPList tasks = web.Lists["Tasks"];
SPListItemCollection items=tasks.Items;
foreach(SPListItem item in items)
{
output.Write(item["Title"].ToString() +
item["Status"].ToString() + "<br>");
}
Updating data
Most objects in WSS do not immediately
update data when you change a property
You need to first call the Update() method on
the object
This helps performance by minimizing SQL queries
underneath the covers
Example:
SPList mylist = web.Lists[“Tasks”];
mylist.Title=“Tasks!!!”;
mylist.Description=“Description!!”;
Mylist.Update();
Updating List Data
SPListItem is another example of an
object where you need to call update:
Example:
SPListItem item = items[0];
item["Status"]="Not Started";
item["Title"]="Task Title";
item.Update();
FormDigest Security
By default, the object model will not allow data
updates if the form submitting the data does not
contain the ‘FormDigest’ security key.
FormDigest is based on username and site. It will
time out after 30 minutes.
Best solution is to include <FormDigest
runat=“Server”/> web folder control in ASPX page.
If you do not need the security the FormDigest
provides, you can set to
SPWeb.AllowUnsafeUpdates to bypass this check.
Adding Users to a web
Get the appropriate SPRole object:
SPRole admins = web.Roles["Administrator"];
Call the AddUser method:
admins.AddUser("redmond\\gfoltz","
[email protected] m","Greg Foltz","");
Demo
Adding users to the site via the OM
Keep objects around
If you create and destroy objects frequently, you
may do extra SQL queries and have code that is
incorrect:
Bad Example:
SPWeb web = SPControl.GetContextWeb(Context);
web.Lists["Tasks"].Title="mytitle";
web.Lists["Tasks"].Description="mydescription";
web.Lists["Tasks"].Update();
Good Example:
SPWeb web = SPControl.GetContextWeb(Context);
SPList mylist = web.Lists["Tasks"];
mylist.Title="mytitle";
mylist.Description="mydescription";
mylist.Update();
Web Services in WSS
SharePoint will have web services APIs for
accessing content. The web services layer
will be built on top of the server OM.
Allows manipulation of Lists, Webs, Views,
List Items, etc.
Functionality will be similar to server object
model, but with fewer interfaces optimized to
minimize transactions.
Office11 (e.g. Excel, DataSheet, Work,
Outlook, FrontPage, etc) use web services to
access data from WSS.
Web Service Methods
GetListCollection
GetListItems
GetWebCollection
UpdateList
UpdateListItems
GetWebInfo
GetWebPart
GetSmartPageDocument
And more…
Getting Started With Web Services
Create a Windows Application
In Visual Studio, choose ‘Add Web
Reference’
Enter http://<server>/_vti_bin/lists.asmx to
access the lists web service
Other services include:
UserGroups.asmx – users and groups
Webs.asmx – Web information
Views.asmx – View information
Subscription.asmx – Subscriptions
Getting Started with Web Services
To send the logged on users’
credentials from the client, add the
following line in the web reference
object’s constructor:
public Lists() {
this.Url =
"http://mikmort3/_vti_bin/lists.asmx";
this.Credentials=System.Net.CredentialCache.De
faultCredentials;
}
Demo
Building a Web Service Client
Events
We support events on document
libraries.
Operations such as add, update, delete,
check-in, check-out, etc.
Events are asynchronous
Events call IListEventSink managed
interface.
Documentation and Sample in the SDK
Optimizing Performance of
OM
The biggest goal is to minimize the number
of SQL queries.
It may be helpful to use the SQL profiler to
monitor what the OM is doing underneath the
covers
Minimizing managed/unmanaged transitions
also a goal, though this is mostly taken care
within the OM.
What about CAML?
Page Execution will no longer be
driven by CAML (XML schema used in
SharePoint)
CAML is still used in several places
Field Type Definitions
Site and List Templates
View definitions
SDK Available
Documentation about V2 available at
http://msdn.microsoft.com/sharepoint/
Questions?
Code Example -- Enumerate Lists and
Webs
private void ShowSubWebs(HtmlTextWriter output)
{
SPWeb web = SPControl.GetContextWeb(Context);
SPWebCollection mywebs = web.Webs;
foreach (SPWeb myweb in mywebs)
{
output.Write(myweb.Title + "<br>");
}
}
private void ShowSubWebsWithLists(HtmlTextWriter output)
{
SPWeb web = SPControl.GetContextWeb(Context);
SPWebCollection mywebs = web.Webs;
foreach (SPWeb myweb in mywebs)
{
output.Write("<b>" + myweb.Title + "<br>" + "</b>");
SPListCollection lists = myweb.Lists;
foreach (SPList list in lists)
{
if (list.ItemCount>10)
{
output.Write(list.Title + ": " + list.ItemCount +
"<br>");
}
}
}
}
Code Snippet – Copy Files
private SPWeb web;
private void Page_Load(object sender, System.EventArgs e)
{
web = SPControl.GetContextWeb(Context);
}
private void Button1_Click(object sender, System.EventArgs e)
{
int maxsize = Convert.ToInt32(TextBox1.Text);
SPFolder myfolder=web.GetFolder("Shared Documents");
SPFileCollection myfiles = myfolder.Files;
foreach (SPFile file in myfiles)
{
if (file.Length>(maxsize*1024))
{
Response.Write(file.Name + ": " +
file.Length/1024 + "kb<br>");
file.CopyTo("Archive/"+file.Name,true);
}
}
}
Code Snippet – Add users
private void Button1_Click(object sender,
System.EventArgs e)
{
SPWeb web = SPControl.GetContextWeb(Context);
string username = TextBox1.Text;
string displayname = TextBox2.Text;
string email = TextBox3.Text;
SPRole admins = web.Roles["Administrator"];
try
{
admins.AddUser(username,email,displayname,"");
Label4.Text="Successfully added user";
}
catch(Exception ex)
{
Label4.Text=ex.ToString();
}
}