gpt4 book ai didi

c# - 如何使用 ServiceStack Grpc 获取简单的字符串流?

转载 作者:行者123 更新时间:2023-12-04 00:56:13 24 4
gpt4 key购买 nike

与 ServiceStack 库进行了一段时间的斗争,以获得在 C# 中工作的基本字符串“流”。

简而言之,我正在尝试从“原生”gRPC 复制基本示例。

原型(prototype)缓冲区

service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (stream HelloReply);
}

// The request message containing the user's name.
message HelloRequest {
string name = 1;
}

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

服务器

public override async Task SayHello(HelloRequest request, IServerStreamWriter<HelloReply> responseStream,                                            ServerCallContext context)
{
foreach (var x in Enumerable.Range(1, 10))
{
await responseStream.WriteAsync(new HelloReply
{
Message = $"Hello {request.Name} {x}"
});

await Task.Delay(200);
}
}

客户端

var replies = client.SayHello(new HelloRequest { Name = "Laurent" });

await foreach (var reply in replies.ResponseStream.ReadAllAsync())
{
Console.WriteLine(reply.Message);
}

然后使用 ServiceStack 库,我无法正确完成服务器部分。我总是收到一条消息,告诉我我的函数“SayHello”未定义。

让我知道,谢谢!

最佳答案

ServiceStack gRPC实现采用 code-first implementation where your existing ServiceStack Services可以从 gRPC 端点调用。

因此,与其手动编写 .proto 文件,不如使用 standard Request / Response DTOs 创建服务和普通请求/回复 gRPC 服务的 Service 实现。

对于 Server Stream gRPC Services你需要实现 IStreamService接口(interface)除了继承自ServiceStack的Service基类。

Implementing Server Stream Services 中介绍了这方面的示例在文档中:

public class StreamFileService : Service, IStreamService<StreamFiles,FileContent>
{
public async IAsyncEnumerable<FileContent> Stream(StreamFiles request,
CancellationToken cancel = default)
{
var i = 0;
var paths = request.Paths ?? TypeConstants.EmptyStringList;
while (!cancel.IsCancellationRequested)
{
var file = VirtualFileSources.GetFile(paths[i]);
var bytes = file?.GetBytesContentsAsBytes();
var to = file != null
? new FileContent {
Name = file.Name,
Type = MimeTypes.GetMimeType(file.Extension),
Body = bytes,
Length = bytes.Length,
}
: new FileContent {
Name = paths[i],
ResponseStatus = new ResponseStatus {
ErrorCode = nameof(HttpStatusCode.NotFound),
Message = "File does not exist",
}
};

yield return to;

if (++i >= paths.Count)
yield break;
}
}
}

您还需要在 RegisterServices 中注册您的 Stream Service 实现:

Plugins.Add(new GrpcFeature(App) {
RegisterServices = {
typeof(StreamFileService)
}
});

如果您使用的是 smart C# generic gRPC Service Client您可以完全避免使用 .proto 描述符和协议(protocol)生成的类,因为您可以在 ServiceModel project 中重用服务器 DTO。在没有代码生成的情况下启用端到端 API:

var request = new StreamFiles {
Paths = new List<string> {
"/js/ss-utils.js",
"/js/hot-loader.js",
"/js/not-exists.js",
"/js/hot-fileloader.js",
}
};

var files = new List<FileContent>();
await foreach (var file in client.StreamAsync(request))
{
files.Add(file);
}

共享您的 ServiceModel.dll 的替代方法是使用 C# Add ServiceStack Reference在客户端生成您的 C# DTO。

对于 protoc generated clients你可以使用x dotnet toolGenerate protoc Dart gRPC Client

$ x proto-dart https://todoworld.servicestack.net -out lib

您可以在何处使用 serverStreamFiles API stub 来调用服务器流服务:

var stream = client.serverStreamFiles(StreamFiles()..paths.addAll([
'/js/ss-utils.js',
'/js/hot-loader.js',
'/js/hot-fileloader.js',
]));

await for (var file in stream) {
var text = utf8.decode(file.body);
print('FILE ${file.name} (${file.length}): ${text.substring(0, text.length < 50 ? text.length : 50)} ...');
}

todo-world/clients repo 包含许多不同语言的 gRPC 测试示例。

关于c# - 如何使用 ServiceStack Grpc 获取简单的字符串流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62392848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com