ASP.NET API GET接口返回字节数组异常问题求助
问题分析与解决方法
你的核心问题有两个:
- 用
BinaryFormatter序列化.NET对象得到的是对象的二进制序列化数据,不是XML格式的字节数组,这和原API的输出完全不符。 - 直接返回
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
相关产品推荐
相关产品推荐

