In this post, I am going to demonstrate how to rename an existing file using RPC. The code is along the same line as this one, https://realmpksharepoint.wordpress.com/2014/04/29/upload-large-files-to-the-sharepoint-documentlibrary-using-rpc-from-a-desktop-application-c/
public void RenamePage(string oldUrl, string newUrl) { string requestUrl = this.ctx.Url + "/_vti_bin/_vti_aut/author.dll"; string method = GetEncodedString("move document:15.0.0.4420"); string serviceName = GetEncodedString(this.ctx.Web.ServerRelativeUrl); oldUrl = GetEncodedString(oldUrl); newUrl = GetEncodedString(newUrl); string urlList = GetEncodedString("[]"); rpcCallString = "method={0}&service_name={1}&oldUrl={2}&newUrl={3}&url_list={4}&rename_option=findbacklinks&put_option=edit\n"; rpcCallString = String.Format(rpcCallString, method, serviceName, oldUrl, newUrl, urlList).Replace("_", "%5f"); HttpWebRequest wReq = WebRequest.Create(requestUrl) as HttpWebRequest; wReq.Method = "POST"; wReq.Headers["Content"] = "application/x-vermeer-rpc"; wReq.Headers["X-Vermeer-Content-Type"] = "application/x-vermeer-rpc"; wReq.UserAgent = "FrontPage"; wReq.UseDefaultCredentials = false; Uri targetSite = new Uri(this.ctx.Web.Url); SharePointOnlineCredentials spCredentials = (SharePointOnlineCredentials)this.ctx.Credentials; string authCookieValue = spCredentials.GetAuthenticationCookie(targetSite); wReq.CookieContainer = new CookieContainer(); wReq.CookieContainer.Add( new Cookie("FedAuth", authCookieValue.TrimStart("SPOIDCRL=".ToCharArray()), String.Empty, targetSite.Authority)); wReq.BeginGetRequestStream(new AsyncCallback(gotRequestStream), wReq); } private void gotRequestStream(IAsyncResult asynchronousResult) { HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState; Stream requestStream = webRequest.EndGetRequestStream(asynchronousResult); List<byte> uploadData = new List<byte>(); uploadData.AddRange(Encoding.UTF8.GetBytes(rpcCallString)); byte[] fileData = uploadData.ToArray(); requestStream.Write(fileData, 0, fileData.Length); requestStream.Close(); webRequest.BeginGetResponse(new AsyncCallback(gotResponse), webRequest); } private void gotResponse(IAsyncResult asynchronousResult) { HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState; HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult); Stream responseStream = webResponse.GetResponseStream(); StreamReader reader = new StreamReader(webResponse.GetResponseStream()); string responseString = String.Empty; responseString = reader.ReadToEnd(); byte[] fileBuffer = Encoding.UTF8.GetBytes(responseString); responseStream.Close(); reader.Close(); webResponse.Close(); if (responseString.IndexOf("\n message=successfully" ) < 0) { throw new Exception(responseString); } }
Now, let’s evaluate this.
- Here we are using method “move document” and, “15.0.0.4420” is server extension version.
- Service name is server relative URL of your site.
- oldUrl is the current url of the page and newUrl is the new url to be set.
- For authentication, we’re using the CookieContainer of HTTPWebRequest.
Here is the example of how will you call this upload method.
RenamePage("default.aspx", "defaultNew.aspx");
Here a utility method, GetEncodedString has been used here for encoding of string. Here it is for your reference.
public string GetEncodedString(string sourceString) { if (!String.IsNullOrEmpty(sourceString)) { return HttpUtility.UrlEncode(sourceString).Replace(".", "%2e").Replace("_", "%5f"); } else { return sourceString; } }
Check out here to get some additional info about move document, http://msdn.microsoft.com/en-us/library/ms440627%28v=office.14%29.aspx.