博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

使用Sharepoint 2007中的webservice操作列表

Posted on 2011-01-14 17:16  生鱼片  阅读(2817)  评论(0编辑  收藏  举报

Sharepoint中提供了很多开箱即用的Web Service,使用这些web service我们可以进行远程调用, "web server extensions\12\ISAPI"(其通常位于C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\ISAPI")之下的"Microsoft Shared"目录中有大部分Web Services的物理文件。用于管理中心工具的管理Web Service位于ADMISAPI文件夹中,其在管理中心控制台里是一个名为"_vti_adm"的虚拟目录。当你创建了一个SharePoint站点时,它将包含一个名为"_vti_bin"的虚拟目录,以指向这个位置。IIS不为子站点包含任何应用程序或虚拟目录,它们只是包含通过 SharePoint元数据和HttpModules实现的对_vti_bin虚拟目录的映射。当然web service支持的功能没有sharepoint的对象模型丰富,不过基本都有了,本文主要说下Lists.asmx中的一些常用功能。

clip_image002[4]

 

下面是一些常用的功能,关于其中一些CAML的使用请参考这篇文章http://www.cnblogs.com/carysun/archive/2011/01/12/moss-caml.html

1.得到Lists对象

 

static SPListsWS.Lists GetSPListWS()

        {

            SPListsWS.Lists spListsWS = new SPListsWS.Lists();

            if (UrlListSite != null && UrlListSite.Length > 0)

            {

                spListsWS.Url = UrlListSite;

            }

            if (SPWSUsername != null && SPWSUsername.Length > 0)

            {

                spListsWS.Credentials = new System.Net.NetworkCredential(SPWSUsername, SPWSUserPassword, SPWSDomain);

            }

            else

                spListsWS.Credentials = System.Net.CredentialCache.DefaultCredentials;

 

            return spListsWS;

        }

2.得到列表ID

static string GetSPListID(SPListsWS.Lists spListsWS, string listName,

            ref bool sourceFieldFound, ref bool targetFieldFound)

        {

            string listID;

            XmlNode aNode;

            XmlNode GetListResult;

            IEnumerator ienum;

 

            GetListResult = spListsWS.GetList(listName);

 

            listID = GetListResult.Attributes["ID"].Value;

 

            return listID;

        }

 

3.得到列表的item,可以通过CAML进行条件筛选

       static XmlNode GetListItems(SPListsWS.Lists spListsWS)

        {

            string rowLimit = "1000000", xDocQueryString, xDocFieldsString;

            //string getAllRecordsQuery = "<Query><Where><Gt><FieldRef Name=\"ID\" /><Value Type=\"Counter\">-1</Value></Gt></Where></Query>";

            string getAllRecordsQuery = "<Query><Where><Eq><FieldRef Name=\"a\" /><Value Type=\"String\">Approved</Value></Eq></Where></Query>";

            XmlNode result = null;

            XmlDocument xDocQuery = null, xDocFields;

 

            xDocQueryString = ConfigurationManager.AppSettings["SPListItemQueryString"];

            if (xDocQueryString != null && xDocQueryString.Length > 0)

            {

                xDocQuery = new XmlDocument();

                xDocQuery.LoadXml(xDocQueryString);

            }

            else

            {

                xDocQuery = new XmlDocument();

                xDocQuery.LoadXml(getAllRecordsQuery);

            }

 

            xDocFieldsString = "<ViewFields><FieldRef Name=\"ID\"></FieldRef>" +

                "<FieldRef Name=\"" + SourceField + "\"></FieldRef>" +

                "<FieldRef Name=\"" + TargetField + "\"></FieldRef>" +

                "</ViewFields>";

            xDocFields = new XmlDocument();

            xDocFields.LoadXml(xDocFieldsString);

 

           // result = spListsWS.GetListItems(ListName, null, xDocQuery, xDocFields, rowLimit, null, null);

            result = spListsWS.GetListItems(ListName, null, null, null, rowLimit, null, null);

 

            return result;

        }

4.更新列表中的item,使用CAML的方式

  static bool UpdateListItem(SPListsWS.Lists spListsWS, string strlistItemID, string newHistoryValue)

        {

            bool sucess = false;

            string strErrorCode = null;

            long lngErrorCode = -1;

            XmlDocument xDocSyncCmd = new XmlDocument();

            XmlNode xNodeResult;

            string updateCommand;

 

            updateCommand = "<Batch OnError=\"Continue\">" +

                "<Method ID=\"1\" Cmd=\"Update\">" +

                "<Field Name=\"ID\">" + strlistItemID + "</Field>" +

                "<Field Name=\"" + TargetField + "\">" + EscapeIllegalChars(newHistoryValue) + "</Field>" +

                "</Method>" +

                "</Batch>";

 

            xDocSyncCmd.LoadXml(updateCommand);

            xNodeResult = spListsWS.UpdateListItems(ListName, xDocSyncCmd);

            xNodeResult = xNodeResult.FirstChild;

            xNodeResult = xNodeResult.FirstChild;

            if (xNodeResult.Name == "ErrorCode")

            {

                strErrorCode = xNodeResult.InnerXml;

                if (long.TryParse(strErrorCode.Replace("0x",""), out lngErrorCode))

                {

                    if (lngErrorCode == 0)

                    {

                        sucess = true;

                    }

                }

            }

 

            return sucess;

        }

 

 

 

static void UpdateListItemsHistory(SPListsWS.Lists spListsWS, XmlNode listItems)

        {

            IEnumerator ienum;

            XmlNode current, xNodeCommentHistory, xNodeEditorHistory, xDataNode = null;

            XmlAttribute xAttribCommentHistory, xAttribRecordCount;

            string strlistItemID, currHistoryValue, newHistoryValue;

 

            ienum = listItems.GetEnumerator();

            while (ienum.MoveNext())

            {

                current = (XmlNode)ienum.Current;

                if (current.Name == "rs:data")

                {

                    xDataNode = current;

                    xAttribRecordCount = xDataNode.Attributes["ItemCount"];

                    if (xAttribRecordCount != null)

                        long.TryParse(xAttribRecordCount.Value, out TotalRecords);

 

                    break;

                }

            }

 

            ienum = xDataNode.GetEnumerator();

            while (ienum.MoveNext())

            {

                current = (XmlNode)ienum.Current;

                if (current.Name == "z:row")

                {

                    strlistItemID = current.Attributes["ows_ID"].Value;

                    xAttribCommentHistory = current.Attributes["ows_" + TargetField];

                    if (xAttribCommentHistory != null)

                        currHistoryValue = current.Attributes["ows_" + TargetField].Value;

                    else

                        currHistoryValue = "";

                    xNodeCommentHistory = spListsWS.GetVersionCollection(ListName, strlistItemID, SourceField);

                    xNodeEditorHistory = spListsWS.GetVersionCollection(ListName, strlistItemID, "Editor");

                    newHistoryValue = ConcatenateHistory(xNodeCommentHistory, xNodeEditorHistory);

                    if (currHistoryValue != newHistoryValue)

                    {

                        UpdateListItem(spListsWS, strlistItemID, newHistoryValue);

                    }

                }

            }

        }

 

基本这些是最常用的功能了