创建自定义的 web Service 更新SharePoint List
创建自定义的 web Service 更新SharePoint List本文通过如果开发自定义的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就能知道如果写.
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif public string ColumnCountManagement(Guid discussionListItemGUID,string columnName,int updateCount,int pointsCount)
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif {
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif //check List
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif if (!OpenRequiredLists())
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif {
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif return systemMsg;
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif }
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif // compare update to -1 or 1
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif if (updateCount != 1 && updateCount != -1)
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif {
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif systemMsg = "updateCount only can be 1 or -1";
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif return systemMsg;
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif }
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif try
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif {
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif // Elevation of Privilege; using Administrator to run this code.
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif SPSecurity.RunWithElevatedPrivileges(delegate()
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif {
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif // get the specified List
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif //item = listItems;
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif item = listItems.List.GetItemByUniqueId(discussionListItemGUID);
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif if (item == null) return;
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif //find the target Column
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif feild = item.Fields;
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif if (feild == null) return;
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif //Get the current Value
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif int currentCount = int.Parse(item.ToString());
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif currentCount = currentCount + updateCount;
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif //all colunm should be less than 0
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif item = currentCount < 0 ? 0 : currentCount;
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif //Update Points Value
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif pointsFeild = item.Fields["Points"];
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif if (pointsFeild == null) return;
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif int currentPoints = int.Parse(item.ToString());
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif //if column name equal "NbrVotes", Update its points with pointCount
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif currentPoints = columnName == "NbrVotes" ? currentPoints + pointsCount : currentPoints + (updateCount * 10);
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif //all colunm should be less than 0
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif item = currentPoints < 0 ? 0 : currentPoints;
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif });
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif //update
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif item.Update();
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif web.AllowUnsafeUpdates = false;
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif //return "Success" Message"
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif systemMsg = "Success";
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif }
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif catch (Exception ex)
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif {
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif return ex.Message + "(ColumnCountManagement)";
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif }
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif return systemMsg;
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif }
4. 总结:
上述代码中有几个点要稍微介绍下
因为并不是每个人都是管理员或者是这个Item的Author, 所以如果想调用这个Service, 必须具有很高的权限, 所以我们使用了下面代码来提升权限
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif// Elevation of Privilege; using Administrator to run this code.
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif SPSecurity.RunWithElevatedPrivileges(delegate(){
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif //do something here
http://sharepoint.blog.运维网.com/images/editer/InBlock.gif })
另外一个问题是Item.Update()方法的调用,如果把这个方法放在 SPSecurity.RunWithElevatedPrivileges(delegate(){}), 里,就会报"Operation is not valid due to the current state of the object ". 所以这个Update()方法一定要放在代码外面.
5. 关于调用:
调用Web Service的时候,要使用默认权限
WebService.UseDefaultCredentials = true;
三: 有代码下载:
SourceCode
附件:http://down.运维网.com/data/2354069
页:
[1]