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.