关于 webassebmly Blazor RPC 调用

离开了园子好久好久了前端

疫情期间,没有办法出差,正好当前时间是本身规划的查漏补缺时间,把缺乏的Web模块的统计分析图表加进去web

Webassembly 老早是据说了,但因为项目的缘由,也一直没有精力去关注,却是 netcore3.1期待了好久,虽然最后测试了一下,本身须要的核心接口尚未添加进去,可是Webassembly 与 Blazor 仍是给我带来了惊喜。json

一、Webassembly 实现了 netstandard 的接口。个人业务逻辑层的实体类dll,能够不做任何修改,直接应用于Browser的Webassembly。去年基于tekerik的KendoUI差很少整了个前端的应用框架,可是须要定义传输实体类,虽然能够经过工具生成js,绑定、查询、提交之类,可是毕竟要从新生成,修改了一个地方,js也要跟着修改,工做量仍是很是大的,js与C#毕竟仍是有很大的差别,人的培训又是个很大的问题。有了webassembly 后,dll能够直接使用,不须要生成一大堆的js,代码量与工做量直线降低,后端人员能够写前端了。可能从效果上来讲,还达不到js的展示之类,因为咱们的软件是应用于企业内部,优势是大大超越不足。后端

二、RPC!!!实现了webassembly的RPC,这个大概花了不到2周的时间进行移植与测试,与我当前用的后台能够无缝对接。我后台的服务也能够不做任何的修改,browser webassembly客户端能够直接以RPC方式调用,这更是惊喜中的惊喜呀。这样,个人服务层经过asp.netcore公开出去后,xamarin app、browser、desktop能够采用统一的服务接口。因为原来主要的工做是在app和desktop程序上面,并且app与desktop使用了很是类似的代码风格与样式,统一的集中权限管理。webassembly blzaor 带给咱们彻底一致的风格,统一了app、browser、desktop。咱们的RPC调用传输部分,用的是自行改版后的protobuf,已经用了不少年了,效率、稳定性都通过了N多项目的检验。曾经尝试用protobuf.js,最终失败,后来就一直放下了。若是不可以实现从browser直接调用服务,就要架个服务的中转,把protobuf的调用再转换成json。项目里面,那么多的接品,这个转换,也是个非庞大的工做量,并且是专门用于web的,app与desktop 的RPC调用,仍是基于原来的protobuf。app

@page "/"
@using Demo.Shared
@using EES.Common

<h1>Hello, world!</h1>

Welcome to your new app.

<p>Current: @value</p>

@code {
    string value;

    protected override async Task OnInitializedAsync()
    {
        try
        {
            User user = await Factory.getProxy<HelloService>().getUserAsync("Say");
            value = user.UserCode;
        }
        catch (Exception ex)
        {
            value = ex.Message;
        }
    }
}
View Code

你们看看这个调用方式,与写普通的远程调用有什么差别吗?彻底没有。这也是RPC给我带来的惊喜中的惊喜,在browser能够直接调用后台服务。框架

再看看后台的服务代码。asp.net

        public User getUser(string name)
        {
            User u = Factory.Create<User>();
            u.Age = new Random().Next(0, 120);
            u.UserCode = string.Format("{0}-{1:yyyy-MM-dd HH:mm:ss.fff}", name, DateTime.Now);
            return u;
        }
View Code

三、Blazor 应该说是为了实现webassembly而打造了,有了webassembly和RPC,加了Blazor的双向绑定,app与desktop 的作法,在web上面,能够差很少用同样的风格实现了,至少对于业务系统能够是这样。dom

因为在测试的时候CORS出现了一些问题,须要等上一些时间再把Demo传上来async

相关文章
相关标签/搜索