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了嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/490191.html
標籤:.NET技术
