Как отображать в HTML разметки ответы gRPC стрима в asp net core?
Обычно я пользуюсь rest api, я просо через js получаю ответ от api и в js уже изменяю разметку вставляя это ответ.
Но как быть с gRPC?
В следующем клоде в цикли foreach я получаю этот стрим, и как мне всавлять эти item в HTML
Код контролера
public HomeController() { ChatRun(); } private async Task ChatRun() { var _messeages = new List<string>(); var channel = GrpcChannel.ForAddress("https://localhost:7151"); var client = new Messager.MessagerClient(channel); var stream = Task.Run(() => client.Send(new Request() { Message = "1" })); await foreach (var item in (await stream).ResponseStream.ReadAllAsync()) { //как передовать item в HTML } } |
public HomeController() { ChatRun(); } private async Task ChatRun() { var _messeages = new List<string>(); var channel = GrpcChannel.ForAddress("https://localhost:7151"); var client = new Messager.MessagerClient(channel); var stream = Task.Run(() => client.Send(new Request() { Message = "1" })); await foreach (var item in (await stream).ResponseStream.ReadAllAsync()) { //как передовать item в HTML } }
Дополнительно:
В реальном времени ты в html так их не вставишь.
У тебя два варианта:
1. Если стрим конечный, то ты можешь собрать все айтемы в лист и вернуть его как обычно.
2. Использовать websocket - тут надо будет подумать, как лучше это подружить со сложившейся у тебя архитектурой.
Как минимум нужно будет добавить js на фронт и создавать долгоживущую задачу на бэке
- SignalR можно использовать для такого класса задач, на бекенде сделать Hub SignalR, на фронте использовать скрипт на JS для работы с серверным Hub, а также кастомный скрипт, который будет изменять текущие значения на странице в HTML, без активных действий пользователя.
- Andrei SunnyPh, ага. На signalr это проще всего будет реализовывать, но проблемы в архитектуре это не решит
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для отображения ответов gRPC стрима в ASP.NET Core можно воспользоваться методами предоставляемыми самим фреймворком.
Один из способов - использовать `ServerStreamWriter` для отправки ответов в поток. Вот пример:
```csharp
public async Task GetStreamData(IAsyncStreamReader requestStream, IServerStreamWriter responseStream, ServerCallContext context)
{
while (await requestStream.MoveNext())
{
var requestData = requestStream.Current;
// Обработка запроса и формирование ответа
var responseData = new StreamResponse
{
Message = "Response message",
Timestamp = DateTime.UtcNow.ToLongDateString()
};
await responseStream.WriteAsync(responseData);
}
}
```
Для вызова этого метода из контроллера можно использовать следующий код:
```csharp
public async Task StreamData()
{
var requestStream = Request.Body;
var responseStream = Response.Body;
var callOptions = new CallOptions(cancellationToken: CancellationToken.None);
var response = _client.GetStreamData(requestStream, responseStream, callOptions);
return Ok();
}
```
Также можно использовать `Grpc.AspNetCore.Server` для обработки стримов более удобным способом. В этом случае необходимо создать класс-наследник `ServiceBase`, где `T` - это ваш сервис, и переопределить методы для обработки стримов.
```csharp
public class MyService : MyProtoService.MyProtoServiceBase
{
public override async Task GetStreamData(IAsyncStreamReader requestStream, IServerStreamWriter responseStream, ServerCallContext context)
{
while (await requestStream.MoveNext())
{
var requestData = requestStream.Current;
// Обработка запроса и формирование ответа
var responseData = new StreamResponse
{
Message = "Response message",
Timestamp = DateTime.UtcNow.ToLongDateString()
};
await responseStream.WriteAsync(responseData);
}
}
}
```
И в Startup.cs зарегистрировать этот сервис:
```csharp
services.AddGrpc(options =>
{
options.EnableDetailedErrors = true;
}).AddService();
```
Это лишь некоторые из способов обработки стримов gRPC в ASP.NET Core. В зависимости от вашей конкретной задачи и требований, может потребоваться использовать другие методы и подходы.