gpt4 book ai didi

blazor wasm --hosted + gRCP 网络(流)

转载 作者:行者123 更新时间:2023-12-05 07:07:34 24 4
gpt4 key购买 nike

是否可以通过 gRCP 网络 (http/1.1) 进行 cleint-server 流式响应?

我有一个有效的客户端/服务器 + 数据库解决方案,但似乎我必须等待完整的服务器响应(请参阅服务器中的 //await Task.Delay(2000); )

我希望发生的是客户端应该在它发送回客户端的每个“服务器滴答”上呈现,而不是等待流关闭并呈现完整的响应。

有什么想法吗?

原型(prototype)

syntax = "proto3";
option csharp_namespace = "GrpcReports";
package reports;

service Reports {
rpc AllReports (ReportRequest) returns (stream ReportReply);
}

message ReportRequest {}
message ReportReply {
string name = 1;
}

服务器

// server
public class ReportsService : Reports.ReportsBase
{
private readonly IReportRepository _repository;
private readonly IMapper _mapper;

public ReportsService(IReportRepository repository, IMapper mapper)
{
_repository = repository ?? throw new ArgumentNullException(nameof(IReportRepository));
_mapper = mapper ?? throw new ArgumentNullException(nameof(IMapper));
}

public override async Task AllReports(ReportRequest request, IServerStreamWriter<ReportReply> responseStream, ServerCallContext context)
{
foreach (var item in _mapper.Map<List<ReportReply>>(await _repository.GetAllReportsAsync()))
{
Log.Information("{@ReportReply}", item);
await responseStream.WriteAsync(item);
//await Task.Delay(2000);
}
}
}

客户端

@page "/"
@using Grpc.Core
@using GrpcReports
@using AutoMapper
@inject Reports.ReportsClient _reportsClient
@inject IMapper _mapper

<h1>Invoke gRPC service</h1>

<button @onclick="AllReports" class="btn btn-primary">Call gRPC service</button>
<p>Server report response from database:</p>

<ul>
@foreach (var item in reportReplys)
{
<li>@item.Name</li>
}
</ul>

@code {
List<ReportReply> reportReplys = new List<ReportReply>();

async Task AllReports()
{
using (var call = _reportsClient.AllReports(new ReportRequest()))
{
while (await call.ResponseStream.MoveNext())
{
reportReplys.Add(call?.ResponseStream?.Current);
}
}
}
}

enter image description here

最佳答案

所以 gRPC 网络流确实有效,我唯一需要添加的是在每个服务器 tick 上重新呈现 UI。

您唯一需要添加到代码中的是 StateHasChanged();

客户端更新:

while (await call?.ResponseStream?.MoveNext())
{
reportReplys.Add(call?.ResponseStream?.Current);
StateHasChanged();
}

引用:https://learn.microsoft.com/en-us/aspnet/core/blazor/components/lifecycle?view=aspnetcore-3.1#state-changes

关于blazor wasm --hosted + gRCP 网络(流),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62086689/

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