本文通过如果开发自定义的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; //return "Success" Message" systemMsg = "Success"; } catch (Exception ex) { return ex.Message + "(ColumnCountManagement)"; } return systemMsg; }
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()方法一定要放在代码外面.