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

ASP.NET API GET接口返回字节数组异常问题求助

问题分析与解决方法

你的核心问题有两个:

  1. 用BinaryFormatter序列化.NET对象得到的是对象的二进制序列化数据,不是XML格式的字节数组,这和原API的输出完全不符。
  2. 直接返回byte[]时,ASP.NET Core会默认按Base64编码返回,同时application/octet-stream的设置和客户端Accept头不匹配导致406错误。

正确实现步骤

1. 替换对象序列化方式:将对象转为XML字节数组

不要用BinaryFormatter,改用XmlSerializer把GetResponse对象序列化为XML格式的字节流,这才是原API返回的内容。

新增XML序列化方法:

public static byte[] SerializeToXmlBytes<T>(T obj)
{
    using (var memoryStream = new MemoryStream())
    {
        var xmlSerializer = new XmlSerializer(typeof(T));
        // 如果需要指定命名空间,可在XmlSerializer构造函数中添加
        xmlSerializer.Serialize(memoryStream, obj);
        return memoryStream.ToArray();
    }
}

2. 修改Action返回方式,避免Base64编码并正确设置响应头

不要直接返回byte[],改用FileResult来明确输出字节流并设置正确的Content-Type,这样能避免ASP.NET自动把字节数组转成Base64,同时解决406错误。

修改后的Get方法:

[ApiController]
[Route("[controller]")]
public class UserController : ControllerBase
{
    [Route("{employeeID?}")]
    [HttpGet]
    public IActionResult Get(int? employeeID = null)
    {
        IEnumerable<Employee> employees;
        using (SqlConnection con = new SqlConnection(_connectionString))
        {
            con.Open();
            employees = con.Query<Employee, EmploymentData, Employee>(query, (emp, empData) => {
                emp.EmploymentData = empData;
                return emp;
            }, splitOn: "CompanyID");
        }

        GetResponse response = new GetResponse()
        {
            Employees = employees.ToList(),
            ErrorCode = null,
            ErrorMessage = null,
            InputParameterErrors = null,
            ResultInfo = new ResultInfo()
            {
                ResultDateTime = DateTime.Now,
                EmployeeCount = employees.Count()
            }
        };

        byte[] xmlBytes = SerializeToXmlBytes(response);
        // 明确返回XML字节流,Content-Type设为application/xml
        return File(xmlBytes, "application/xml");
    }

    public static byte[] SerializeToXmlBytes<T>(T obj)
    {
        using (var memoryStream = new MemoryStream())
        {
            var xmlSerializer = new XmlSerializer(typeof(T));
            xmlSerializer.Serialize(memoryStream, obj);
            return memoryStream.ToArray();
        }
    }
}

3. Postman测试注意事项

  • 确保请求的Accept头包含application/xml(Postman默认会自动添加,或者手动设置)
  • 发送请求后,Postman会直接显示XML内容,而不是Base64字符串

额外说明

  • BinaryFormatter是.NET专属的对象序列化方式,序列化后的字节数组无法被其他系统解析为XML,完全不符合原API的输出要求,必须替换为XML序列化。
  • 使用FileResult是ASP.NET Core中返回字节流最稳妥的方式,它会直接将字节写入响应体,不会进行Base64编码,同时正确设置Content-Type,避免406错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:55:14