Office Web Apps–WOPI Host and url paths
If you’re following along with the post on creating a WOPI host, it’s never fully apparent that you MUST adhere to the path shown in the article here:
http://blogs.msdn.com/b/officedevdocs/archive/2013/03/20/introducing-wopi.aspx
That is, the path to your host must contain ‘/wopi/files’. It wasn’t clear to me in that article, nor could I find it in the WOPI spec. http://msdn.microsoft.com/en-us/library/hh622722(v=office.12).aspx
So, for example, here are some Routes I used in MVC
config.Routes.MapHttpRoute( name: "Contents", routeTemplate: "api/wopi/files/{name}/contents", defaults: new { controller = "files", action = "GetFile" } );config.Routes.MapHttpRoute( name: "FileInfo", routeTemplate: "api/wopi/files/{name}", defaults: new { controller = "Files", action = "Get" } );
Here are the Actions
public class FilesController : ApiController {IFileHelper _fileHelper; public FilesController() : this(new FileHelper()) { } public FilesController(IFileHelper fileHelper) { _fileHelper = fileHelper; } /// <summary> /// Required for WOPI interface - on initial view /// </summary> /// <param name="name"></param> /// <param name="access_token"></param> /// <returns></returns> public CheckFileInfo Get(string name, string access_token) { var fileInfo = _fileHelper.GetFileInfo(name); return fileInfo; } /// <summary> /// Required for View WOPI interface - returns stream of document. /// </summary> /// <param name="name"></param> /// <param name="access_token"></param> /// <returns></returns> public HttpResponseMessage GetFile(string name, string access_token) { try { var file = HostingEnvironment.MapPath("~/App_Data/" + name); var rv = new HttpResponseMessage(HttpStatusCode.OK); var stream = new FileStream(file, FileMode.Open, FileAccess.Read); rv.Content = new StreamContent(stream); rv.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); return rv; } catch (Exception ex) { var rv = new HttpResponseMessage(HttpStatusCode.InternalServerError); var stream = new MemoryStream(UTF8Encoding.Default.GetBytes(ex.Message ?? "")); rv.Content = new StreamContent(stream); return rv; } } }</pre></div>
And here is the helper
public interface IFileHelper { CheckFileInfo GetFileInfo(string name); }public class FileHelper : IFileHelper { public CheckFileInfo GetFileInfo(string name) { var fileName = GetFileName(name); FileInfo info = new FileInfo(fileName); string sha256 = ""; using (FileStream stream = File.OpenRead(fileName)) using (var sha = SHA256.Create()) { byte[] checksum = sha.ComputeHash(stream); sha256 = Convert.ToBase64String(checksum); } var rv = new CheckFileInfo { BaseFileName = info.Name, OwnerId = "admin", Size = (int)info.Length, SHA256 = sha256, Version = DateTime.Now.ToString("s") }; return rv; } internal string GetFileName(string name) { var file = HostingEnvironment.MapPath("~/App_Data/" + name); return file; } }</pre></div>