Threaded Discussion using SharePoint 2007 Web Services
There have been a few comments lately on this post I made a while back on how the threaded discussion works. Their question revolves around working with the SharePoint threaded discussion via web services, and more specifically how to post a response to thread or a response to a response. I was going to work through that this week in my spare time, but as luck would have it someone internally posted how to do this. I can’t take credit for it, but was given permission by the author, Srinivas Rao Choudam, to post it to share with the greater community.
As I suspected before getting into this it requires calling two methods in the Lists.asmx web service, AddDiscussionBoardItem and UpdateListItems. The code for making this happen is shown below.
1: ListsSoapClient client = new ListsSoapClient("ListsSoap");
2: client.ClientCredentials.Windows.ClientCredential = (System.Net.NetworkCredential)System.Net.CredentialCache.DefaultCredentials;
3: client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Delegation;
4:
5:
6: XmlNamespaceManager manager = null;
7: XmlElement discussionItem = null;
8:
9: manager = new XmlNamespaceManager(new NameTable());
10: manager.AddNamespace("rs", "urn:schemas-microsoft-com:rowset");
11: manager.AddNamespace("z", "#RowsetSchema");
12:
13: StringBuilder mesBody = new StringBuilder(1024);
14:
15: mesBody.AppendFormat("Message-ID: {0}\n", Guid.NewGuid().ToString());
16:
17: mesBody.AppendFormat("Subject: {0}\n", "Discussion112");
18:
19: mesBody.Append("Mime-Version: 1.0\n");
20:
21: mesBody.Append("Content-type: text/plain; charset=UTF-8\n\n");
22:
23: discussionItem = client.AddDiscussionBoardItem("TeamDiscussion", Encoding.UTF8.GetBytes(mesBody.ToString()));
24:
25: XmlNode discussionNode = discussionItem.SelectSingleNode("rs:data/z:row", manager);
26:
27: string serverUrl = discussionNode.Attributes["ows_ServerUrl"].InnerText;
28: string fileLeafRef = discussionNode.Attributes["ows_FileLeafRef"].InnerText;
29:
30:
31: XmlDocument xmlDocument = new XmlDocument();
32: XmlElement updatesNode = xmlDocument.CreateElement("Batch");
33: updatesNode.SetAttribute("RootFolder", serverUrl);
34: updatesNode.SetAttribute("OnError", "Continue");
35:
36: XmlElement methodNode = xmlDocument.CreateElement("Method");
37: methodNode.SetAttribute("ID", "0");
38: methodNode.SetAttribute("Cmd", "New");
39: updatesNode.AppendChild(methodNode);
40:
41:
42: XmlElement bodyNode = xmlDocument.CreateElement("Field");
43: bodyNode.SetAttribute("Name", "Body");
44: bodyNode.InnerText = "Body-New";
45: methodNode.AppendChild(bodyNode);
46:
47: XmlElement contentTypeNode = xmlDocument.CreateElement("Field");
48: contentTypeNode.SetAttribute("Name", "ContentType");
49: contentTypeNode.InnerText = "Message";
50: methodNode.AppendChild(contentTypeNode);
51:
52:
53: XmlElement fileLeafRefNode = xmlDocument.CreateElement("Field");
54: fileLeafRefNode.SetAttribute("Name", "DiscussionTitleLookup");
55: fileLeafRefNode.InnerText = fileLeafRef;
56: methodNode.AppendChild(fileLeafRefNode);
57:
58: discussionItem = client.UpdateListItems("TeamDiscussion", updatesNode);