首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

gRPC服务器流可以返回一个流到Blazor Wasm而不是IAsyncEnumerable<T>吗?

基础概念

gRPC是一种高性能、开源和通用的RPC框架,支持多种编程语言。它基于HTTP/2协议,提供了双向流、流控制、头部压缩等特性。gRPC服务器流允许服务器向客户端发送多个消息。

Blazor Wasm是一种基于WebAssembly的客户端框架,允许在浏览器中运行.NET代码。它可以通过gRPC-Web与gRPC服务器进行通信。

相关优势

  • gRPC服务器流:允许服务器向客户端发送多个消息,适用于实时数据传输和大数据传输。
  • Blazor Wasm:在浏览器中运行.NET代码,提供丰富的交互性和性能。

类型

  • gRPC服务器流:返回一个流到客户端。
  • IAsyncEnumerable<T>:C#中的一个异步序列,用于处理异步数据流。

应用场景

  • 实时数据传输:如股票行情、实时聊天等。
  • 大数据传输:如文件上传、大数据分析等。

问题分析

gRPC服务器流可以返回一个流到Blazor Wasm,但Blazor Wasm本身并不直接支持gRPC流。通常,gRPC-Web代理会处理gRPC流并将其转换为浏览器可以理解的格式(如Fetch API)。

解决方案

  1. 使用gRPC-Web代理
    • 部署一个gRPC-Web代理服务器,将gRPC流转换为Fetch API可以处理的格式。
    • 在Blazor Wasm中通过Fetch API接收数据。
  • 自定义处理
    • 在服务器端实现自定义逻辑,将gRPC流转换为JSON或其他格式。
    • 在Blazor Wasm中通过HttpClient接收并处理这些数据。

示例代码

服务器端(C#)

代码语言:txt
复制
[ServiceContract]
public interface IMyService
{
    [OperationContract(Streaming = StreamingMode.Server)]
    Task<Response> GetStream(Request request);
}

public class MyService : IMyService
{
    public async Task<Response> GetStream(Request request)
    {
        var stream = new MemoryStream();
        for (int i = 0; i < 10; i++)
        {
            var message = new Message { Data = $"Message {i}" };
            await stream.WriteAsync(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message)));
        }
        stream.Position = 0;
        return new Response { Stream = stream };
    }
}

客户端(Blazor Wasm)

代码语言:txt
复制
@page "/stream"
@inject HttpClient Http

<h3>Stream Data</h3>
<ul>
    @foreach (var item in messages)
    {
        <li>@item.Data</li>
    }
</ul>

@code {
    private List<Message> messages = new List<Message>();

    protected override async Task OnInitializedAsync()
    {
        var response = await Http.GetFromJsonAsync<Response>("/api/MyService/GetStream");
        using (var stream = response.Stream)
        {
            using (var reader = new StreamReader(stream))
            {
                while (!reader.EndOfStream)
                {
                    var message = JsonConvert.DeserializeObject<Message>(await reader.ReadLineAsync());
                    messages.Add(message);
                }
            }
        }
    }
}

public class Message
{
    public string Data { get; set; }
}

public class Response
{
    public Stream Stream { get; set; }
}

参考链接

通过上述方法,你可以实现gRPC服务器流向Blazor Wasm的传输,并在浏览器中处理这些数据。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

.NET Core 3.0 中的新变化

我们正在参与 gRPC (grpc.io) 项目,以确保 gRPC 能够为 .NET 开发人员提供一支持。...图 1:使用 Blazor 进行客户端 Web 开发 也可以使用 .NET Core 在服务器上运行相同组件,其中所有 UI 交互和 DOM 更新都是通过 SignalR 连接进行处理,如图 2 所示。...我们计划在 EF Core 3.0 中添加的其他功能包括,属性包实体(将数据存储在索引属性(不是常规属性)中的实体);能够将数据库视图反向工程为查询类型;以及与新 C# 8.0 功能集成,如 IAsyncEnumerable...ValueTask 已有,可便于在操作同步完成时返回结果,而无需分配新 Task。...若要可以为 null,必须使用“string?”可以为 null 的引用类型。 异步对异步数据执行的操作,就是 async/await 对单个异步结果执行的操作。

4.9K10
  • Blazor资源大全,很棒的Blazor(2)

    带有gRPC代码优先客户端/服务器通信、本地化等的企业项目模板。交互式文档和演示。 Blazority - 基于Clarity UI设计的Blazor组件库。...对WASM服务器(页面、组件、dll)提供完整的延迟加载支持,如果需要,还可以实现模块化(自定义端点、自定义清单等)。 Fun.Blazor - 使F#开发人员更容易编写Blazor的项目。...这样,我们可以在我们的网站内直接向客户展示我们的自定义报告,不是将他们发送到单独的应用程序中。...使用bUnit对Blazor组件进行最佳实践单元测试 - 2022年3月1日 - 为什么要创建UI组件的测试?UI测试不是天生脆弱、运行缓慢且难以维护?...但是,当您将它们与 MAUI Blazor 模板结合使用时,您需要知道它应该感觉像一个移动应用程序,不是一个网页。本文解释了一些技巧和诀窍。

    78120

    【译】.NET 7 预览版 1 中的 ASP.NET Core 更新

    更好地控制 Blazor 服务器电路的生命周期。 改进了对微前端的支持。 MVC:对端点路由、链接生成和参数绑定的改进。...同样,您的集线器可以为其方法实现一个接口,并且客户端可以使用该相同接口来调用集线器方法。...您现在可以将验证配置为使用相应的 JSON 属性名称,不是使用新的 SystemTextJsonValidationMetadataProvider(或使用 Json.NET 时的 NewtonsoftJsonValidationMetadataProvider...将服务注入 Blazor 中的自定义验证属性 您现在可以将服务注入 Blazor 中的自定义验证属性。 Blazor 将设置 ValidationContext,以便它可以用作服务提供者。...配置完成后,gRPC JSON 转码允许您使用熟悉的 HTTP 概念调用 gRPC 方法: HTTP 动词 URL参数绑定 JSON 请求/响应 当然 gRPC可以继续使用。

    4K10

    C#8.0宝藏好物Async streams

    之前写《.NET gRPC 核心功能初体验》,利用gRPC双向做了一个打乒乓的Demo,存储消息的对象是IAsyncEnumerable,这个异步可枚举泛型接口支撑了gRPC的实时流式通信。...C#8.0 Asynchronous streams C#8.0中一个重要的特性是异步(async stream), 可以轻松创建和消费异步枚举。...返回异步的方法特征: 以async修饰符声明 返回IAsyncEnumerable对象 方法包含yield return语句,用来异步持续返回元素 static async Task Main(...附加思考:产生一个有意思的迭代器 ☺️ 但是我内心想,能不能按照完成异步任务的顺序,先完成先消费,这难道不是人之常情,交互体验应该更好。...以上总耗时取决于 耗时最长的那个枚举任务:5s ---- .NETCore 3.1 已经可以在webapi中使用异步,意味着我们可将流式数据返回到HTTP响应。

    97130

    在.NET 8 RC1 版本中 MAUI、ASP.NET Core 和 EF8 的新特性

    8 Preview 5发布,了解一下Webcil 是啥[6] .NET 8 Preview 6发布,支持新的了Blazor呈现方案 和 VS Code .NET MAUI 扩展[7] .NET 8 发布的最后一个预览版...具体细节包括: 适用于android和WASM的AOT模式:开发人员可以将他们的 .NET 代码直接编译为 WebAssembly 或 Android 的本机代码,从而加快启动和运行时性能,但应用尺寸更大...“你现在可以使用Xcode 15测试版作为构建应用程序和管理模拟器的安装,这将在Visual Studio的下一个版本中提供。...ASP.NET Core 在这里,Blazor 是ASP.NET Core的重心,Blazor 让 Web 开发人员使用 C# 不是 JavaScript 的又有了八个方面不同的改进(其中一些在 Microsoft...的主要 .NET 公告中进行了讨论): Blazor Web App应用模板更新 从其他程序集中发现用于静态服务器呈现的组件 路由改进 触发页面刷新 将任意属性传递到QuickGrid 确定表单域是否具有关联的验证消息

    67960

    最终选型 Blazor.Server:又快又稳!

    不过在最后一步——托管和部署的时候,出现了一个小问题,当然,也不是问题,是我没有考虑到的,下边说一下这个小问题。 1、为什么要选择Blazor.Server?...Blazor.Server可以认为是前者的服务端渲染版本,它使用SignalR实现了客户端的实时通讯,它的计算跟渲染都在服务端处理。...你可以看明白了吧,其实wasm就像是vue那种单页面程序,Blazor.Server更像是基于前者的一种服务端渲染(注意:和MVC不是一回事),第一次刷新是HTTP请求,平时点击是SignalR处理。..._Host.cshtml的页面,从后缀名可以看出来,其实也和html很像的一个cshtml页面,不是.razor。...那下边简单说下获取数据FetchData: 之前我们使用wasm的时候,因为是前后端分离,所以使用的是HttpClient来远程获取资源服务器的资源数据,但是现在我们使用了服务端以后,可以自己写业务逻辑了

    6.5K30

    集成Ids4,实现统一授权认证

    我们就这几在这里引用即可,如果你是用WASM的话,直接有一个index.html,和这个是同一个道理: (在Blazor.Server中引用js文件) 那现在我们都配置好了客户端和连接,也引用到了Blazor...3、C#调用js方法模块 是不是如果你看到这个逻辑都很怪异,我们都知道c#和js完全就不是一个逻辑,那是如何相互调用的呢,不仅c#可以使用js方法,我们也同样能在js里去调用c#代码,当然这是在Blazor...,这样就直接可以在c#中,调用js脚本方法了,但是这个js方法任意写function就行了么,并不是。...到了这里,我们已经配置了ids4模块、c#调用模块,那就剩下最后一个模块:调用资源服务器的service服务模块了。...PS:这里的资源服务用的Blog.Core的接口,你可以用自己的各种服务,无论是webservice,restful还是grpc

    2.1K20

    Blazor WASM 实现人民币大写转换器

    Blazor Blazor 是 .NET Core 时代微软推出的用于 Web 应用开发的新框架,它可以运行在服务器端,也可使用 WASM 运行在客户端,即浏览器中。...更重要的是,既然是原汁原味的 .NET,就可以很方便的重用以前的代码,以及现成的成千上万个 NuGet 包,不用像一个新发明的框架那样从0开始积累生态。...创建 Blazor WASM 工程 我们可以使用 Visual Studio 2019 创建 Blazor WASM 工程。 ? 选择 Blazor WebAssembly App 就可以了 ?...我这个应用只有一个页面,所以一切逻辑都在这里实现就可以了。 可重用的代码 人民币大写的转换类与框架和平台无关,因此完全可以直接复制到Blazor工程里用,即 RMBConverter.cs。...首先,框架本身的体积依然较大,由于众所周知不可描述的原因,如果服务器部署在海外,那么我国网络加载 Blazor 应用会比较慢。 另外,不是所有版本的浏览器都可以WASM,尤其是手机端。

    2.2K10

    Day 03:Blazor Server和Blazor WebAssembly的差异

    下载Visual Studio后首先建立一个Blazor解决方案,里面建立Blazor Server项目,方案位置可以自己选择(注:新版Visual Studio将Blazor Server跟Blazor...,其中blazor.server.js就是在服务器跟浏览器之间通过SingalR建立WebSocket通道的文件。...接着清空下载到浏览器的文件,再点击Counter和Fetch data页面,在以前的网站中这是刷新网页操作,会重新下载该网页所需文件,但是可以看到这两页都没有下载东西(有favicon.ico下载,聪明的你知道什么原因...清空文件下载记录 切换Counter和Fetch data菜单 接着在同一个解决方案建立一个Blazor WebAssembly项目,可以看到这里有 渐进式 Web 应用程序 选项,如果选了,这个网站就可以在电脑下载下来...两种模式项目结构对比 Blazor Server的Program.cs文件: Blazor Server Program.cs Blazor Wasm的Program.cs文件: Blazor Wasm

    3.1K30

    一文说通异步 LINQ

    延迟执行,这是异步 LINQ 的第一个优势。 2. 执行 执行,依托的也是异步迭代器。 所谓执行,其实就是根据调用的要求,一次返回一个对象。...通过使用异步迭代器,可以不用一次返回所有的对象,而是一个一个返回单个的对象,直到枚举完所有的对象。 执行需要做个技巧性的代码,需要用到一个 C# 8.0 的新特性:局部方法。...这个结构体没有实现 IAsyncEnumerable 接口,而是做了一个 GetAsyncEnumerator 方法,返回一个具有 MoveNextAsync、Current、DisposeAsync...这里的 ValueTask 倒不是必须,用 Task 也可以,只不过我更习惯用 ValueTask。两个的区别:Task 是类,有上下文, ValueTask 是结构。...总结 异步 LINQ,多数是在 LINQ 的扩展方法中使用,不是我们通常习惯的 LINQ 直写。

    84810

    Day 02 网页和Blazor介绍

    后来有人发现每次都要刷新页面实在太麻烦,发展出了可以异步执行的Ajax技术,假如一个事件A没做完的话,其他事件B, C不会等A做完,而是会自己往下做,如此一来当使用者发送表单请求时,网页不会一直跑小圈圈等待刷新...WebAssembly简称Wasm,是一种二进制表示语言,任何程序语言经过特定编译都可以转成WasmWasm的优点是将整个程序传到浏览器不需要服务器,由于是二进制且已经编译过的关系,渲染网页的速度会比...Blazor WebAssembly 优点: 因为文件都在浏览器上,速度相较于Blazor Server更快 不需要服务器 不需要随时跟服务器连接 Client端的浏览器被充分利用,减轻服务器负担 可以架在任何服务器上...不容易提升运算能力,因为一个服务器能承受的Client端有限,微软给出的数据为一个单核配有3.5G内存的Blazor Server可以处理5000个连接;一个四核配有14G内存的Blazor Server...虽然以网站模式开发却能让使用者像下载软件一样下载到桌面或是手机,知名网站如Twitter, Pinterest, Starbucks都是知名例子,如果用电脑开启Twitter网站,就能在网址列最右方看到下载的按钮;如果需要从无到有生出一个需要频繁连接服务器

    2.2K20

    Blazor WebAssembly 修仙之途 - 初尝

    Blazor Server 将组件呈现逻辑从 UI 更新的应用方式中分离出来。 Blazor Server 在 ASP.NET Core 应用中添加了对在服务器上托管 Razor 组件的支持。...运行时处理从浏览器向服务器发送 UI 事件,并在运行组件后,将服务器发送的 UI 更新并重新应用到浏览器。...Blazor Server 与 Blazor WebAssembly 对比 1.PWA的支持 Server 不支持,Wasm 支持 2.更新UI流程不同 (1)Blazor Server 在页面加载时,...Blazor Server 执行业务代码逻辑是通过 SignalR 发送事件到服务端,服务端执行代码,再返回结果,根据返回的数据渲染UI,应用更新,通过下图可以看到。 ?...2.实现简单逻辑 简单的改了 Counter 的代码,成了一个 Guid 生成器,这点体验还是很好的,直接用C#代码编写逻辑不是JavaScript,而且是本地运行直接运行C#代码,不需要 Blazor

    3.5K10

    Blazor VS 传统Web应用程序

    / Blazor是Microsoft团队开发的单页面应用程序(SPA)框架,它是与React,Angular和Vue.js有相同之处,但是它使用的是C#不是JavaScript。...这种方式允许 html代码 和后端代码写在一起, 这样的优势是可以快速进行页面开发,传统的Web应用程序工作流通常向用户提供一个表单,一个提交按钮,并且在用户单击按钮后会从服务器收到响应,这样的用户体验通常不好...浏览器修改HTML DOM,不是服务器请求获取完整的HTML内容。 Ajax是迈向SPA框架的第一步,这种方法在2000年代初开始流行。...Blazor一个SPA框架,它使用编译的C#来操纵HTML DOM来替代JavaScript,Blazor允许使用服务器端或客户端托管模型,但是无论哪种情况,浏览器都可以操作HTML DOM客户端,该应用程序仍然是...两种模型都可提供与React,Vue.js或Angular等SPA框架同样的用户体验,但是有一些差异,服务器端模式不需要浏览器中的WASM支持,这意味着某些较旧的浏览器可以使用服务器端托管模型。

    4.2K10
    领券