jjzjj

Blazor WebAssembly + Grpc Web = 未来?

chester.chen 2023-03-28 原文

Blazor WebAssembly是什么

首先来说说WebAssembly是什么,WebAssembly是一个可以使C#,Java,Golang等静态强类型编程语言,运行在浏览器中的标准,浏览器厂商基于此标准实现执行引擎。

 

在实现了WebAssembly标准引擎之后,浏览器中可以执行由其他语言编译成的wasm模块。使用强类型编程语言的好处显而易见:

  • 可以选择更多的语言,编写前端逻辑
  • 静态编程语言编译成的字节码,相对于JS这种脚本语言执行效率更高
  • 可以使用静态编程语言生态中的强大类库

Blazor WebAssembly是dotnet版本的WebAssembly实现,微软将dotnet运行时编译成dotnet.wasm模块,我们的程序编译出来的dll文件运行在此模块上。

需要注意的是,Blazor WebAssembly是一个完完全全的前端框架,只是逻辑代码不再使用JS编写,而是使用C#编写。

Grpc Web是什么

Grpc是一种与语言无关的的高性能远程过程调用(RPC)框架。Grpc有以下优点

  • 现代高性能轻量级 RPC 框架。
  • 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。
  • 可用于多种语言的工具,以生成强类型服务器和客户端。
  • 支持客户端、服务器和双向流式处理调用。
  • 使用 Protobuf 二进制序列化减少对网络的使用。

而Grpc Web是Grpc的前端实现版本,可以使浏览器应用直接与Grpc交互。

有了Grpc Web,我们可以直接在Blazor WebAssembly中调用Grpc Server,而不用再通过传统的Http请求方法调用。

代码演示

GrpcServer

首先需要新建一个Grpc Server

 然后为其引入 Grpc.AspNetCore.Web Nuget包,并开启grpc web

app.UseGrpcWeb(); // Must be added between UseRouting and UseEndpoints
// Configure the HTTP request pipeline.
app.MapGrpcService<GreeterService>().EnableGrpcWeb();

之后我们需要为Grpc Server开启跨域设置,允许跨域访问

app.Use(async (context, next) =>
{
    context.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
    context.Response.Headers.Add("Access-Control-Allow-Headers", "*");
    context.Response.Headers.Add("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS,HEAD,PATCH");
    context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
    context.Response.Headers.Add("Access-Control-Max-Age", "100000");
    context.Response.Headers.Add("Access-Control-Expose-Headers", "Grpc-Status,Grpc-Message,Grpc-Encoding,Grpc-Accept-Encoding");
    if (context.Request.Method.ToUpper() == "OPTIONS")
    {
        return;
    }
    // Do work that can write to the Response.
    await next.Invoke();
    // Do logging or other work that doesn't write to the Response.
});

最终Program.cs的代码如下

using GrpcService2.Services;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddGrpc();

var app = builder.Build();
app.Use(async (context, next) =>
{
    context.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
    context.Response.Headers.Add("Access-Control-Allow-Headers", "*");
    context.Response.Headers.Add("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS,HEAD,PATCH");
    context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
    context.Response.Headers.Add("Access-Control-Max-Age", "100000");
    context.Response.Headers.Add("Access-Control-Expose-Headers", "Grpc-Status,Grpc-Message,Grpc-Encoding,Grpc-Accept-Encoding");
    if (context.Request.Method.ToUpper() == "OPTIONS")
    {
        return;
    }
    await next.Invoke();
});

app.UseGrpcWeb();
app.MapGrpcService<GreeterService>().EnableGrpcWeb();

app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");

app.Run();

Blazor WebAssembly

现在新建一个WebAssembly项目

 为其引入以下nuget包

  <ItemGroup>
    <PackageReference Include="Google.Protobuf" Version="3.20.1" />
    <PackageReference Include="Grpc.Net.Client" Version="2.46.0" />
    <PackageReference Include="Grpc.Net.Client.Web" Version="2.46.0" />
    <PackageReference Include="Grpc.Tools" Version="2.46.1">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
  </ItemGroup>

在其项目文件中包含进proto文件

  <ItemGroup>
    <Protobuf Include="..\GrpcService2\Protos\*.proto" GrpcServices="Client" />
  </ItemGroup>

然后将GrpcClient注入容器

builder.Services.AddScoped(p =>
{
    var channel = GrpcChannel.ForAddress("https://localhost:7033/", new GrpcChannelOptions
    {
        HttpHandler = new GrpcWebHandler(new HttpClientHandler())
    });
    var client = new GrpcService2.Greeter.GreeterClient(channel);
    return client;
});

修改Index.razor,让其访问grpc server

@page "/"
@inject GrpcService2.Greeter.GreeterClient GreeterClient

<div>grpc web response @Message</div>

@code {
    public string Message { get; set; }
    protected override async Task OnInitializedAsync()
    {
        var reply = await GreeterClient.SayHelloAsync(new GrpcService2.HelloRequest { Name = "test" });
        Message = reply.Message;
    }
}

最终效果如下

可以看到整个请求/渲染过程,使用的是C#代码编写的逻辑,没用到js,原理是因为,blazor webassembly将我们的dotnet运行时,与我们的代码编译后的程序集,运行在了基于webassembly标准实现的浏览器引擎中。

并且可以看到请求响应体都使用的压缩过的二进制形式。效率相对更高

 

webassembly难道是未来?难道未来的某一天要和js say goodbye了吗?

有关Blazor WebAssembly + Grpc Web = 未来?的更多相关文章

  1. 科创人·数智未来私董会第4期:转型的实证-幸存者偏差与盲人摸象 - 2

    所有技术终将演变为基础设施。2022年6月11日,科创人·数智未来私董会第4期活动在线举办,本次活动由科创人、北航投资、方云智能联合举行;微软(中国)首席技术官韦青担任本期活动主讲嘉宾,携手14位企业高级决策者围绕数智未来课题进行深度探讨。科创人·数智未来私董会第3期活动回顾|《狗尾巴的故事-数智时代的第一性原理》与会嘉宾依次是:微软(中国)CTO韦青、领鹊科技创始人&CEO张志祥、食方科技创始人&CEO黄龚、中科云创创始人&CEO周北川、北航投资总经理王剑飞、中煤信息技术首席专家黄韶杰、天云数据创始人&CEO雷涛、中国农业银行科技与产品管理局信息安全与风险管理处处长何启翱、索迩科技创始人&C

  2. 未来的趋势————以ChatGPT为标杆的AI对生活的影响是巨大的 - 2

    文章目录前言1.AI的发展历程2.我是如何接触到人工智能的概念和产品的3.对于ChatGPT的一点看法4.AI对大学毕业生的职业发展的利与弊5.对于AI的思考和问题前言随着ChatGPT的爆火,生成式AI,大模型的人工智能被越来越多的人注意到,同时他也带来了许多问题。本文将对几方面进行探讨。1.AI的发展历程远古时期在公元前第一个千禧年,中国,印度和希腊哲学家都提出了一些推理的研究理论,比如亚里士多德(Aristotle)进行了演绎推理三段论的完整分析,欧几里得(Euclid)所著Elements是一种形式推理的模型,MuḥammadibnMūsāal-Khwārizmī,发明了代数学,即我们

  3. javascript - String 和 Array 泛型方法将在未来被弃用 - 2

    在下面的链接(MDN站点)上它说“字符串泛型是非标准的,已弃用并且将来可能会被删除。请注意,如果不使用下面提供的填充程序,您不能跨浏览器依赖它们。“他们所指的方法是否是他们在该声明下方提供的垫片中列出的方法?这是我见过的唯一提到短语“字符串泛型”的地方,所以让我很困惑。对于数组泛型也有同样的问题,因为该站点也提到了类似的情况。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#String_generic_methodshttps://developer.mozi

  4. 探索自助报表BI的现状和未来(文末送福利) - 2

    前言虚竹哥有个朋友小五,他在数据产品提供商的公司上班。小五的妹夫自己开了家软件工作室,会承接一些软件研发项目。妹夫问小五:有没有成熟的报表插件,可以集成到程序中,最好是开源的,方便根据业务进行适配调整。主要是有这么几个痛点:简单的报表很多工具可以实现,但复杂的报表就做不到报表需求很常见,之前做复杂的报表,很多要自行开发,而且工作量也大,开发上也有难度报表开发的难题,并不全在制表上,有些是在数据准备上应用中的报表,有80%的数据来源和计算都比较简单,很多一个简单的SQL语句就搞定了,但还有20%的情况中,数据准备工作就没有那么好做了,一些过程式的多步骤复杂计算,常常要写很长的多层嵌套的SQL或者

  5. 大势所趋之下的nft拍卖,未来艺术品的新赋能 - 2

    拍卖,顾名思义就是在规定的时间和场所,按照一定的章程和规则,将要拍卖的货物向买主进行展示,公开叫价竞购,最后由拍卖人把货物卖给出价最高的买主的一种交易方式。传统的拍卖一般都是实体物品,随着nft的发展,拍卖从传统的实物衍生到了nft数字艺术,也给疫情之下的拍卖行业寻求了一条转型之路。对于nft大家更多的是尝试创建和购买,拍卖接触的相对较少,区块链上有公链和测试链,公链是需要费用,测试链就不用,为了演示,今天就用一款开源的工具FIngerNFT来给大家演示一下nft拍卖怎么进行出价购买。源码在github上:GitHub-fingerchar/fingernft:FingerNFT是一款开源NF

  6. 中核科技:科技匠心 智启未来 - 2

    ​  2023 年4月 13—15 日,2023年易派客工业品展览会、石油石化工业展览会、第七届中国石油和化工行业采购年会,在苏州国际博览中心胜利召开。本次展会展览面积53000平方米,参展企业500余家,汇集了中国工业制造领域的大型国企央企、中国石油和化工行业供应链服务商,是一次高端工业、制造业专业展览会,集中展示了我国工业品行业大国制造的最高水平和最新成果。  中核苏阀科技实业股份有限公司(简称中核科技)是一家集工业阀门研发、设计、制造及销售为一体的科技型制造企业,为石油、天然气、炼油、核电、电力、公用、冶金、化工、造船、造纸、医药、科研等行业提供阀门系统解决方案。于1997年在深交所挂牌

  7. 云上未来,数智导航:阿里云研究院报告合集 - 2

    简介:阿里云研究院,甄选了2021-2022年度的10份重磅报告,分别从数字经济、行业转型、数字县域等领域,尝试解读、并推动各行各业的转型升级,展望中国数字经济的未来,迎接数字经济发展的春天。导语我们正处在复杂的历史节点中,气候变化加剧、地缘政治动荡、局部战争冲突持续不断,尤其无情的新冠疫情长时间席卷全球,在很多国家尚未得到有效控制,全球感染人数超过5亿,几乎所有的国家和地区都受到深度影响。在全球经济一片萧条之中,数字经济展现出独特的魅力,数字化转型也成为各行各业的共识。疫情在某种程度上加速了全球产业数字化转型的步伐,数据成为了主要生产要素,也是数字时代的核心基础资源。基于数据资源,传统产业的

  8. xml - XML 在未来还有一席之地吗? - 2

    现在许多人似乎正在转向使用JSON进行网络通信,我想知道为什么要继续使用XML。我很欣赏XML在JSON上存在多年,在此期间它被广泛采用。然而,它被广泛采用这一事实似乎是它应该继续使用的一个决定性原因。为什么不应该逐步淘汰XML以支持JSON是否有充分的理由? 最佳答案 请注意,JSON(JavaScript对象表示法)是一种轻量级数据交换格式,而XML(可扩展标记语言)是一组规则用于对文档进行电子编码。因此,XML不是一种格式,而是一种对不同格式进行编码的“协议(protocol)”:XSLT、RSS、SOAP、RDF/XML和X

  9. 区块链前世今生及未来(颠覆互联网?) - 2

    互联网(信息去中心化)已颠覆世界,区块链(信用去中心化)却要颠覆互联网。一、概述区块链的本质是一个可共享的、可信的、每个人都可以检查的公开账本,但是没有任何一个单一的用户能够控制它。整个区块链系统的参与者一起来不断更新,让这本总账本为最新,它能够且只能按照严格的规则和公开的协议来进行修订。 互联网上的贸易,几乎都需要借助可以信赖的第三方信用机构来处理电子支付信息。这类系统仍然内生性地受制于“基于信用的模式”。区块链技术是构建比特币区块链网络与交易信息加密传输的基础技术,基于密码学原理而不基于信用,使得任何达成一致的双方直接支付,从而不需要第三方中介的参与。二、区块链起源(从比特币到区块链)20

  10. ChatGPT-4 如何改变 AI 市场及其对未来的影响?GPT版本及其差异 - 2

    GPT-1对比GPT-2对比GPT-3。ChatGPT(GenerativePre-trainedTransformer)是一种高级自然语言处理模型,它使用机器学习算法来生成看起来像人类所写的文本。GPT模型的发展彻底改变了人工智能领域,特别是在语言处理领域。多年来,已经发布了多个版本的GPT模型,每个版本都具有独特的特性和功能。在本文中,我们将探讨不同版本的ChatGPT及其差异。我们还将研究GPT模型的演变如何影响人工智能市场以及这项技术的未来。GPT-1GPT的第一个版本GPT-1于2018年由OpenAI发布。该模型拥有1.17亿个参数,是当时最大的语言模型之一。然而,尽管GPT-1的

随机推荐