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

当REST API返回值为Byte数组时,如何返回错误信息?

解决方案:调整返回类型为IActionResult

你当前的问题根源在于返回类型被固定为byte[],导致无法灵活返回错误状态码和信息。最直接且规范的做法是将返回类型改为Task<IActionResult>,这样既能正常返回PDF文件,也能在错误时返回带状态码的错误信息。

修改后的代码示例:

public async Task<IActionResult> GetPolicyPDF(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req,
    ILogger log, ExecutionContext context)
{
    try
    {
        _log.LogInformation("C# HTTP trigger GetPolicyPDF processed a request.");

        string effectiveDate = req.Query["EffectiveDate"].ToString();
        string policyNumber = req.Query["PolicyNumber"].ToString();
        string type = req.Query["Type"].ToString();
        string contactId = req.Query["ContactID"].ToString();

        // 验证联系人是否拥有保单的逻辑
        var contactOwnPolicy = await DataverseHelper.DoesContactOwnPolicy(context, contactId, policyNumber, _log);
        if (!contactOwnPolicy)
        {
            return new ObjectResult("联系人不拥有该保单") { StatusCode = StatusCodes.Status403Forbidden };
        }

        // 生成PDF字节数组
        byte[] pdfBytes = await PolicyRequest.GetPolicyPDF(policyNumber, effectiveDate, type);

        // 返回PDF文件,设置正确的Content-Type
        return new FileContentResult(pdfBytes, "application/pdf")
        {
            FileDownloadName = $"Policy_{policyNumber}.pdf" // 可选:设置下载文件名
        };
    }
    catch (Exception ex)
    {
        _log.LogError(ex, "生成PDF时发生错误");
        return new ObjectResult($"错误信息:{ex.Message}") { StatusCode = StatusCodes.Status500InternalServerError };
    }
}

关键修改点说明:

  • 返回类型变更:从Task<byte[]>改为Task<IActionResult>,这是Azure Functions处理HTTP响应的标准方式,支持多种响应类型。
  • 正常响应:用FileContentResult返回PDF字节数组,同时指定application/pdf的Content-Type,确保客户端能正确识别文件类型。
  • 错误场景:
    • 权限验证失败时返回403状态码(更符合HTTP语义,比500合适)。
    • 异常捕获时返回500状态码和具体错误信息,同时记录日志便于排查。

若坚持保留byte[]返回类型(不推荐)

如果因某些限制无法修改返回类型,只能将错误信息放到HTTP响应的自定义标头中,同时返回空或无效的字节数组:

catch (Exception ex)
{
    _log.LogError(ex, "生成PDF时发生错误");
    req.HttpContext.Response.Headers.Add("X-Error-Message", ex.Message);
    req.HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError;
    return Array.Empty<byte[]>(); // 返回空数组
}

这种方式的弊端是客户端需要额外解析响应头才能获取错误信息,不符合REST API的规范,可读性和易用性差,因此优先推荐第一种方案。

内容的提问来源于stack exchange,提问作者Darin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:10:24