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中的一些常用功能。
下面是一些常用的功能,关于其中一些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);
}
}
}
}
基本这些是最常用的功能了