Since I've wasted a couple of hours on this I'll share my findings. I'm creating a web service that will do a mail merge for me using Aspose Words. The document template is stored in a SharePoint document library as a content type and the merged document I want to store back into the document library.
I tackled the upload first. Since my web service and SharePoint will be installed on separate servers, I call the SharePoint Copy.asmx web service to upload the document. That works fine. My next task was to use the document template from SharePoint which I need to retrieve as a memory stream.
The preferred method is to use the GetItem method of the Copy.asmx service. No problem I thought as I already has a reference to it.
But try as I might I could not manage to download the template. When you install a content type as a template the path to the document is something like this
I suspect it was something to do with this location that it would not work. If I tried the same code on a document in the library itself it worked fine. I gave up in frustration and started Googling for alternatives.
I came up with this incredibly simple approach which I share below. It simply uses the DownloadData method of the WebClient. Since I know the absolute path of the template, it works a treat.
public MemoryStream DownloadSharePointDocument(string sourceUrl)
string sharePointSiteUrl = ConfigurationManager.AppSettings["sharepointsiteurl"];
sharePointSiteUrl = sharePointSiteUrl + "/";
sourceUrl = sharePointSiteUrl + sourceUrl;
WebClient wc = new WebClient();
wc.UseDefaultCredentials = true;
byte response = wc.DownloadData(sourceUrl);
MemoryStream ms = HelperMethods.MemoryStreamFromBytes(response);