通过C# HttpClient调用WOPI接口转Docx为PDF遇404错误求助
我有Web应用和WOPI应用,现有一份.docx文档,修改内容后需要将最终的.docx转成PDF并存到我的存储空间。调研得知可以用/wv/WordViewer/request.pdf?WOPISrc={WopiUrl}&type=downloadpdf接口下载PDF,于是用C#的HttpClient发起请求,但返回404 - File or directory not found错误。以下是我的代码:
WopiSecurity wopiSecurity = new WopiSecurity(); var token = wopiSecurity.GenerateToken(command.CurrentUser.Id, userName, tempDocxFileId, false, true, 1, this._wopiOptions.Value); var accessToken = wopiSecurity.WriteToken(token); var accessTokenTtl = (long)token.ValidTo.Subtract(new DateTime(1970, 1, 1)).TotalMilliseconds; var wopiSrc = this._wopiOptions.Value.WopiUrl .Replace(":tenantguid", tenant.LongGuid.ToString()) .Replace(":guid", _fileGUID); var pairs = new List<KeyValuePair<string, string>> { new("access_token", accessToken), new("access_token_ttl", accessTokenTtl.ToString()), new("user_id", command.CurrentUser.Id.ToString()), new("owner_id", command.CurrentUser.Id.ToString()), }; var content = new FormUrlEncodedContent(pairs); var httpClient = new HttpClient(); var url = $"https://ffc-word-edit.officeapps.live.com/wv/WordViewer/request.pdf" + $"?wopisrc={wopiSrc}" + $"&type=downloadpdf"; var httpResponseMessage = await httpClient.PostAsync(url, content); if (!httpResponseMessage.IsSuccessStatusCode) { throw new ContainerValidationException(new List<string> { "error in request to download pdf" }); } else { var resultStr = await httpResponseMessage.Content.ReadAsStringAsync(); var pdfFileStream = await httpResponseMessage.Content.ReadAsStreamAsync(); }
想请教:这种请求方式是否可行?代码哪里有问题?
通过WOPI接口将docx转PDF的方式是可行的,但你的请求存在几个可能导致404的问题,逐一排查修正:
WopiSrc参数未URL编码
WopiSrc是指向存储服务中文件的WOPI端点URL,必须经过URL编码后再拼接到请求地址中。直接拼接原始URL若包含特殊字符(如斜杠、&、=),会导致服务端解析错误,无法定位文件。
修正代码:var url = $"https://ffc-word-edit.officeapps.live.com/wv/WordViewer/request.pdf" + $"?wopisrc={Uri.EscapeDataString(wopiSrc)}" + $"&type=downloadpdf";请求方法与参数传递错误
根据WOPI规范,获取PDF的请求应使用GET而非POST,且access_token、access_token_ttl等参数需作为URL查询参数传递,而非POST表单内容。
修正后的请求代码:var urlBuilder = new UriBuilder("https://ffc-word-edit.officeapps.live.com/wv/WordViewer/request.pdf"); var queryParams = HttpUtility.ParseQueryString(urlBuilder.Query); queryParams["wopisrc"] = Uri.EscapeDataString(wopiSrc); queryParams["type"] = "downloadpdf"; queryParams["access_token"] = accessToken; queryParams["access_token_ttl"] = accessTokenTtl.ToString(); queryParams["user_id"] = command.CurrentUser.Id.ToString(); queryParams["owner_id"] = command.CurrentUser.Id.ToString(); urlBuilder.Query = queryParams.ToString(); var httpClient = new HttpClient(); var httpResponseMessage = await httpClient.GetAsync(urlBuilder.Uri);WopiSrc端点有效性验证
确认wopiSrc指向的WOPI端点符合要求:- 该端点需公网可访问(无防火墙/IP白名单限制)
- 用生成的access_token请求
/wopi/files/{fileId}接口,验证是否能正常返回文件元数据(200状态码) - 确保
_fileGUID对应的docx文件存在于存储服务中,且权限配置正确
Office Online服务端点正确性
确认使用的ffc-word-edit.officeapps.live.com是你的WOPI集成对应的正确端点,不同环境(商用、教育、私有部署)的Office Online域名可能不同,错误端点会直接导致404。
内容的提问来源于stack exchange,提问作者A. Gladkiy

