gRPC c#文件下载/上传+Web客户端端

4

主要问题:

我正在寻找一种解决方案,以提高大文件的上传/下载速度。我听说过相对较新的技术gRPC。我了解它非常适合服务器之间的通信,例如微服务架构。

客户端

然而,我需要前端(浏览器)的文件上传/下载组件(类似于Fine uploader、jQuery file upload plugin、Resumable.js),并且支持gRPC。 我可以自己提供支持。但我不知道如何做,是否可能等等。 所以我需要一个示例或建议或指向正确方向的指针。 无论是JS方面:vanilla、react、angular

服务器端

  • c# 优先
  • node.js 可能
  • java 可行

已对该主题进行的研究

请帮忙或者至少说这是不可能的。
2个回答

3

我明白这有点过时了。但我想发布这个东西。 我使用C# grpc传输了一个文件。请参见下面的基本grpc文件请求和响应

  1. 协议文件
    syntax = "proto3";
    
    option csharp_namespace = "GrpcGreeter";
    
    package greet;
    
    // The greeting service definition. 
    
    service Greeter {
      // Sends a greeting

      rpc SayHello (HelloRequest) returns (HelloReply);
    }
    
    // The request message containing the user's name.

    message HelloRequest {
      string FileName = 1;
    }
    
    // The response message containing the greetings.

    message HelloReply {
      string FileName = 1;
      bytes data=2; 
    }

    using Google.Protobuf;
    
    using Grpc.Core;
    

    using GrpcGreeter;

    using static System.Net.Mime.MediaTypeNames;
    
    namespace GrpcGreeter.Services
    {
        

    public class GreeterService : Greeter.GreeterBase
        

    {

            private readonly ILogger<GreeterService> _logger;


            public GreeterService(ILogger<GreeterService> logger)
            {
                _logger = logger;
            }
    
            public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
            {
                return Task.FromResult(new HelloReply
                {
                    FileName =  request.FileName,
                    Data = ByteString.CopyFromUtf8(File.ReadAllText(@"D:\files\"+ request.FileName))
                });
            }
        }
    }
  1. gRPC文件下载
    using System.Threading.Tasks;
    
    
    using Grpc.Net.Client;
    
    
    using GrpcGreeterClient;
    
    
    
    
    // The port number must match the port of the gRPC server.
    using var channel = GrpcChannel.ForAddress("https://localhost:7092");
    
    
    var client = new Greeter.GreeterClient(channel);
    
    
    var reply = await client.SayHelloAsync(new HelloRequest { FileName = "test.txt" });
    
        
    File.WriteAllText(@"D:\files\"+"received"+reply.FileName, reply.Data.ToStringUtf8());
    
    
    Console.WriteLine("File written successfully. Press any key to exit...");
    
    
    Console.ReadKey();

你能否尝试改善一下代码格式呢?提示:选择文本后,使用“{}”工具栏按钮可将其格式化为代码。 - Klaus Gütter
对不起,我非常新手,我想@MichaelMao已经编辑过了。下载部分是一个控制台应用程序,使用C#的顶级语句。 - Kedar
如果你想的话,我为你添加了代码块,你可以再次更改它。 - MichaelMao

2

是的,可以使用gRPC在浏览器和服务器之间进行通信。我建议您在实施解决方案之前进行概念验证。

gRPC使用protobuf进行通信,并且需要通信的数据封装在protobuf message中。

gRPC Java File Download Example中的第一个答案是正确的。要能够通过网络传输文件,必须将其转换为bytes

使用他的示例:

message DataChunk {
   bytes data = 1;
}

service imageService {
   rpc DownloadProductImage(DownloadProductImageRequest) returns(stream DataChunk);
}

所有的代码都应该在protofile中,实现应该使用protobuf生成器生成(通常是Java的maven插件)。

在提供的示例中需要注意的重点是stream这个词,它将使您能够将字节发送到服务器或反之。在示例中,他正在从服务调用DownloadProductImage下载一系列字节流。

这里有一个很好的起点gRPC Java基础知识, gRPC概念, 使用Java构建gRPC服务


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接