1. 程式人生 > 實用技巧 >Asp.net MVC 開發對接 Office Online Server

Asp.net MVC 開發對接 Office Online Server

本文章對接介面開發參考: https://github.com/marx-yu/WopiHost
 routes.MapRoute(
               name: "filesGet",
               url: "wopi/files/{id}",
               defaults: new { controller = "openapi", action = "filesGet", id = UrlParameter.Optional }
           );
            routes.MapRoute(
               name: "filesPost
", url: "wopi/files/{id}/contents", defaults: new { controller = "openapi", action = "files", id = UrlParameter.Optional } );
新增路由

public class openapiController : Controller
    { 
        /// <summary>
        /// officeserver 獲取檔案內容Get、回傳修改後的檔案內容Post
        
/// </summary> /// <param name="id"></param> /// <returns></returns> public ActionResult files(string id) { if (Request.RequestType.ToUpper() == "GET") { string FilePath = Server.MapPath("~/App_Data/"+ id);
byte[] data = System.IO.File.ReadAllBytes(FilePath); return File(data, @"application/octet-stream", id); } else { byte[] b = new byte[Request.InputStream.Length]; Request.InputStream.Read(b, 0, b.Length); // 設定當前流的位置為流的開始 Request.InputStream.Seek(0, SeekOrigin.Begin); string FilePath = Server.MapPath("~/App_Data/" + id); using (FileStream fs = System.IO.File.Create(FilePath)) { fs.Write(b,0,b.Length); } return Content("OK"); } } /// <summary> /// 校驗檔案資訊獲取合法性 /// </summary> /// <param name="id"></param> /// <returns></returns> public ActionResult filesGet(string id) { WopiCheckFileInfo cfi = new WopiCheckFileInfo(); string FilePath = Server.MapPath("~/App_Data/"+id); byte[] data = System.IO.File.ReadAllBytes(FilePath); FileInfo f = new FileInfo(FilePath); cfi.BaseFileName = id; cfi.OwnerId = "Anonymous"; cfi.UserFriendlyName = "Anonymous"; cfi.Size = data.Length; cfi.Version = DateTime.Now.ToString("s"); cfi.SupportsCoauth = false; cfi.SupportsCobalt = false; cfi.SupportsFolders = true; cfi.SupportsLocks = true; cfi.SupportsScenarioLinks = false; cfi.SupportsSecureStore = false; cfi.SupportsUpdate = true; cfi.UserCanWrite = true; return this.Json(cfi, JsonRequestBehavior.AllowGet); } } [DataContract] public class WopiCheckFileInfo { [DataMember] public bool AllowExternalMarketplace { get; set; } [DataMember] public string BaseFileName { get; set; } [DataMember] public string BreadcrumbBrandName { get; set; } [DataMember] public string BreadcrumbBrandUrl { get; set; } [DataMember] public string BreadcrumbDocName { get; set; } [DataMember] public string BreadcrumbDocUrl { get; set; } [DataMember] public string BreadcrumbFolderName { get; set; } [DataMember] public string BreadcrumbFolderUrl { get; set; } [DataMember] public string ClientUrl { get; set; } [DataMember] public bool CloseButtonClosesWindow { get; set; } [DataMember] public string CloseUrl { get; set; } [DataMember] public bool DisableBrowserCachingOfUserContent { get; set; } [DataMember] public bool DisablePrint { get; set; } [DataMember] public bool DisableTranslation { get; set; } [DataMember] public string DownloadUrl { get; set; } [DataMember] public string FileSharingUrl { get; set; } [DataMember] public string FileUrl { get; set; } [DataMember] public string HostAuthenticationId { get; set; } [DataMember] public string HostEditUrl { get; set; } [DataMember] public string HostEmbeddedEditUrl { get; set; } [DataMember] public string HostEmbeddedViewUrl { get; set; } [DataMember] public string HostName { get; set; } [DataMember] public string HostNotes { get; set; } [DataMember] public string HostRestUrl { get; set; } [DataMember] public string HostViewUrl { get; set; } [DataMember] public string IrmPolicyDescription { get; set; } [DataMember] public string IrmPolicyTitle { get; set; } [DataMember] public string OwnerId { get; set; } [DataMember] public string PresenceProvider { get; set; } [DataMember] public string PresenceUserId { get; set; } [DataMember] public string PrivacyUrl { get; set; } [DataMember] public bool ProtectInClient { get; set; } [DataMember] public bool ReadOnly { get; set; } [DataMember] public bool RestrictedWebViewOnly { get; set; } [DataMember] public string SHA256 { get; set; } [DataMember] public string SignoutUrl { get; set; } [DataMember] public long Size { get; set; } [DataMember] public bool SupportsCoauth { get; set; } [DataMember] public bool SupportsCobalt { get; set; } [DataMember] public bool SupportsFolders { get; set; } [DataMember] public bool SupportsLocks { get; set; } [DataMember] public bool SupportsScenarioLinks { get; set; } [DataMember] public bool SupportsSecureStore { get; set; } [DataMember] public bool SupportsUpdate { get; set; } [DataMember] public string TenantId { get; set; } [DataMember] public string TermsOfUseUrl { get; set; } [DataMember] public string TimeZone { get; set; } [DataMember] public bool UserCanAttend { get; set; } [DataMember] public bool UserCanNotWriteRelative { get; set; } [DataMember] public bool UserCanPresent { get; set; } [DataMember] public bool UserCanWrite { get; set; } [DataMember] public string UserFriendlyName { get; set; } [DataMember] public string UserId { get; set; } [DataMember] public string Version { get; set; } [DataMember] public bool WebEditingDisabled { get; set; } }
Controller Action 以及呼叫的Model

http://officeserver.dev.website.com/op/view.aspx?src=http%3A%2F%2Fsp.dev.website.com%2Fopenapi%2Ffiles%2FMEF100a.xlsx

以上鍊接為請求office onlineserver開啟一個線上文件。

http%3A%2F%2Fsp.dev.website.com%2Fwopi%2Ffiles%2FMEF100a.xlsx 此引數為對應的連線地址;

office onlineserver在開啟時會發起兩次Get請求:(請注意此時的請求都是GET)

第一次請求:http://sp.dev.website.com/wopi/files/MEF100a.xlsx , 對應的路由就是 url: "wopi/files/{id}" 對應的openapiController.filesGet .用於驗證檔案是否可取,伺服器端需要返回相關的檔案資訊

第二次請求:http://sp.dev.website.com/wopi/files/MEF100a.xlsx/contents ,對應的路由就是url: "wopi/files/{id}/contents"對應的openapiController.files ,獲取檔案流。

office onlineserver在存檔時,會發起POST請求,把檔案內容傳回原來的伺服器。

POST請求:http://sp.dev.website.com/wopi/files/MEF100a.xlsx/contents ,,對應的路由就是url: "wopi/files/{id}/contents"對應的openapiController.files ,上傳檔案流。

本文程式碼只是簡單的檔案獲取 ,沒有對檔案的訪問做許可權驗證、存檔許可權驗證等,若有需要可在Action的訪問新增相關引數。