net5.0 - 在微服务之间接收不同大小的字节数组时出错
Posted
技术标签:
【中文标题】net5.0 - 在微服务之间接收不同大小的字节数组时出错【英文标题】:net5.0 - Error receiving diferent size of byte array between Microservices 【发布时间】:2022-01-02 06:04:52 【问题描述】:我有 2 个微服务(以简单的方式分享),这是来自“源”微服务的代码
[HttpGet]
[Route("resource")]
public async Task<byte[]> LocateResource(Guid Id)
if (Id== Guid.Empty)
throw new Exception("Invalid Id");
var (content, message) = await _repo.LocateResource(Id);
if (!message.Equals("Success"))
throw new Exception(message);
// content.lenght equivalent to 56129
return content;
然后这里是“客户端”的代码
public async Task<byte[]> ReadFile(Guid Id)
var response = await _httpClient.GetAsync($"_urlOptions.Value.ReadFileEndpoint?Id=Id");
response.EnsureSuccessStatusCode();
var file = await response.Content.ReadAsByteAsync();
// file.lenght equivalent to 74000
return file;
问题是我在“客户端”中发送了 56129 个字节,而我收到了 74000 个字节,而且似乎没有对此行为的解释。谁能给我更多的细节,好吗?
【问题讨论】:
我假设服务器代码中的content
实际上是 byte[]
而不是一些自定义类,它有一个转换运算符到 byte[]
可能是罪魁祸首?
ReadAsByteAsync
是谁?我没有看到HttpContent
类的这种方法。是不是某种扩展方法?
在您的 ReadFile2 中,$"_urlOptions.Value.ReadFileEndpoint?Id=Id" 中的 Id 是错字,因为它没有传递到函数中?
【参考方案1】:
您应该返回FileContentResult
类型的响应。例如:
using Microsoft.AspNetCore.Mvc;
namespace WebApplication2.Controllers
[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
[HttpGet("file")]
public IActionResult GetFile()
var result = new byte[] 1, 2, 3, 4, 5, 6, 7 ;
return this.File(result, "application/octet-stream");
File
是ControllerBase
类中定义的辅助方法。
默认情况下,ASP.NET 将内容序列化为 JSON,二进制数据使用 base64 编码。这就是为什么您会得到比预期更大的响应。我的示例在编码和序列化后的结果如下所示:"AQIDBAUGBw=="
。
【讨论】:
【参考方案2】:ReadAsByteAsync 实际上存在于 HttpContent 中。 我建议你有一个处理转换的自定义响应类
【讨论】:
以上是关于net5.0 - 在微服务之间接收不同大小的字节数组时出错的主要内容,如果未能解决你的问题,请参考以下文章