Add gRPC server example with file download

This commit is contained in:
2024-09-25 19:27:20 +02:00
commit 179d4a8dc4
14 changed files with 480 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
using Google.Protobuf;
using Grpc.Core;
using TestGrpc;
namespace TestGrpc.Services;
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger)
{
_logger = logger;
}
public override async Task DownloadFile(FileRequest request, IServerStreamWriter<ChunkMsg> responseStream, ServerCallContext context)
{
string filePath = request.FilePath;
if (!File.Exists(filePath))
{
return;
}
var fileInfo = new FileInfo(filePath);
var chunk = new ChunkMsg
{
FileName = Path.GetFileName(filePath),
FileSize = fileInfo.Length
};
int fileChunkSize = 64 * 1024;
byte[] fileByteArray = File.ReadAllBytes(filePath);
byte[] fileChunk = new byte[fileChunkSize];
int fileOffset = 0;
while (fileOffset < fileByteArray.Length && !context.CancellationToken.IsCancellationRequested)
{
int length = Math.Min(fileChunkSize, fileByteArray.Length - fileOffset);
Buffer.BlockCopy(fileByteArray, fileOffset, fileChunk, 0, length);
fileOffset += length;
ByteString byteString = ByteString.CopyFrom(fileChunk);
chunk.Chunk = byteString;
await responseStream.WriteAsync(chunk).ConfigureAwait(false);
}
}
}