本文通过如果开发自定义的SharePoint web service, 以及如何使用自定义的Web Service, 让大家对 SharePoint web service的开发有个了解.
一. 如何开发SharePoint Web service
Microsoft MSDN 上有篇文章,详细的记录了如何开发SharePoint Web Service.
详细地址: http://msdn.microsoft.com/en-us/library/ms464040.aspx
如果按照Microsoft的向导,还不会做的可以给我留言.
二. 开发更新SPList的web Service.
1. 介绍需求,
我们有个显示IdeaList 信息的SharePoint webpart, 上面主要显示的信息如下, Idea标题, Idea 描述, Idea 评论条数, Idea 得票数, Idea的得分, 如下图
2. 我们要实现的功能就是如果用户投票或者取消投票,相应的更新NbrVotes和Points 的值.
3. 编写代码,
代码很简单, 查看MSDN就能知道如果写.
[WebMethod]
public string ColumnCountManagement(Guid discussionListItemGUID,string columnName,int updateCount,int pointsCount)
{
//check List
if (!OpenRequiredLists())
{
return systemMsg;
}
// compare update to -1 or 1
if (updateCount != 1 && updateCount != -1)
{
systemMsg = "updateCount only can be 1 or -1";
return systemMsg;
}
try
{
// Elevation of Privilege; using Administrator to run this code.
SPSecurity.RunWithElevatedPrivileges(delegate()
{
// get the specified List
//item = listItems[discussionListItemGUID];
item = listItems.List.GetItemByUniqueId(discussionListItemGUID);
if (item == null) return;
//find the target Column
feild = item.Fields[columnName];
if (feild == null) return;
//Get the current Value
int currentCount = int.Parse(item[feild.InternalName].ToString());
currentCount = currentCount + updateCount;
//all colunm should be less than 0
item[feild.InternalName] = currentCount < 0 ? 0 : currentCount;
//Update Points Value
pointsFeild = item.Fields["Points"];
if (pointsFeild == null) return;
int currentPoints = int.Parse(item[pointsFeild.InternalName].ToString());
//if column name equal "NbrVotes", Update its points with pointCount
currentPoints = columnName == "NbrVotes" ? currentPoints + pointsCount : currentPoints + (updateCount * 10);
//all colunm should be less than 0
item[pointsFeild.InternalName] = currentPoints < 0 ? 0 : currentPoints;
});
//update
item.Update();
web.AllowUnsafeUpdates = false;
4. 总结:
上述代码中有几个点要稍微介绍下
因为并不是每个人都是管理员或者是这个Item的Author, 所以如果想调用这个Service, 必须具有很高的权限, 所以我们使用了下面代码来提升权限
// Elevation of Privilege; using Administrator to run this code.
SPSecurity.RunWithElevatedPrivileges(delegate(){
//do something here
})
另外一个问题是Item.Update()方法的调用,如果把这个方法放在 SPSecurity.RunWithElevatedPrivileges(delegate(){}), 里,就会报"Operation is not valid due to the current state of the object ". 所以这个Update()方法一定要放在代码外面.