zhltom 发表于 2019-2-4 06:57:20

创建自定义的 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]
查看完整版本: 创建自定义的 web Service 更新SharePoint List