You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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端点符合要求:

    1. 该端点需公网可访问(无防火墙/IP白名单限制)
    2. 用生成的access_token请求/wopi/files/{fileId}接口,验证是否能正常返回文件元数据(200状态码)
    3. 确保_fileGUID对应的docx文件存在于存储服务中,且权限配置正确
  • Office Online服务端点正确性
    确认使用的ffc-word-edit.officeapps.live.com是你的WOPI集成对应的正确端点,不同环境(商用、教育、私有部署)的Office Online域名可能不同,错误端点会直接导致404。

内容的提问来源于stack exchange,提问作者A. Gladkiy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 08:11:12