WSSObjectModelT302 - Capita

acceptableseashoreSecurity

Nov 5, 2013 (3 years and 11 months ago)

141 views

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


SPField


SPFieldCollection


SPListCollection


SPList


SPListItemCollection


SPListItem


SPView



Administration


SPGlobalAdmin


SPQuota


SPVirtualServer



Security



SPGroup



SPGroupCollection



SPSite



SPUser



SPUserCollection



Documents


SPDocumentLibrary


SPFile


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","Greg@hotmail.com
","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();


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 Services in 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.Def
aultCredentials;


}


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();




}



}