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");
        
    

FileControllerBase 类中定义的辅助方法。

默认情况下,ASP.NET 将内容序列化为 JSON,二进制数据使用 base64 编码。这就是为什么您会得到比预期更大的响应。我的示例在编码和序列化后的结果如下所示:"AQIDBAUGBw=="

【讨论】:

【参考方案2】:

ReadAsByteAsync 实际上存在于 HttpContent 中。 我建议你有一个处理转换的自定义响应类

【讨论】:

以上是关于net5.0 - 在微服务之间接收不同大小的字节数组时出错的主要内容,如果未能解决你的问题,请参考以下文章

命名管道,如何知道在读取端读取的确切字节数。 C++, 视窗

(14)C#的网络接收和发送的各种大小端字节转换

C++基本数据类型的字节数范围大小溢出处理

C++基本数据类型的字节数与范围大小

在微服务之间共享文件

javascript 文件大小函数故障,字节在 1000 到 1024 之间