.NET 8 Blazor全栈中如何从客户端项目调用服务?
.NET 8 Blazor全栈模式下InteractiveWebAssembly组件的服务访问方案
核心结论
不需要额外编写传统WebAPI控制器,.NET 8提供了更高效的**远程过程调用(RPC)**方案,能让InteractiveWebAssembly组件直接调用服务器端服务方法,替代手动编写HTTP API的繁琐流程。
具体实现方式
1. 服务器端暴露服务端点
- 先在主项目(服务器端)注册业务服务:
// 服务器端Program.cs builder.Services.AddScoped<IMyBusinessService, MyBusinessService>(); - 映射RPC端点,将服务方法暴露给客户端:
// 服务器端Program.cs app.MapRazorComponents<App>() .AddInteractiveWebAssemblyRenderMode() .AddAdditionalAssemblies(typeof(Client._Imports).Assembly); // 映射RPC接口,直接绑定服务方法 app.MapPost("/business/get-data", async (IMyBusinessService service, [AsParameters] MyRequestParams request) => { var result = await service.GetDataAsync(request); return Results.Ok(result); });
2. 客户端调用服务器端服务
客户端无法直接注入服务器端服务实例(运行环境完全隔离),需通过HttpClient调用RPC端点:
// 客户端组件代码 @inject HttpClient Http private async Task FetchData() { var request = new MyRequestParams { ItemId = 456 }; var response = await Http.PostAsJsonAsync("/business/get-data", request); var data = await response.Content.ReadFromJsonAsync<MyDataResult>(); // 处理返回数据 }
如果追求强类型体验,可使用Typed Client:
// 客户端Program.cs builder.Services.AddHttpClient<IMyBusinessClient>(client => { client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress); }).AddTypedClient<IMyBusinessClient, MyBusinessClient>();
之后在组件中注入IMyBusinessClient,直接调用方法即可,内部自动处理HTTP通信。
3. 类型一致性优化
创建共享类库项目,存放请求/响应DTO、服务接口定义,服务器端实现接口,客户端引用类库,确保两端类型统一,避免重复编码:
// 共享项目中的接口与DTO public interface IMyBusinessService { Task<MyDataResult> GetDataAsync(MyRequestParams request); } public class MyRequestParams { public int ItemId { get; set; } } public class MyDataResult { public string Content { get; set; } }
关键说明
InteractiveWebAssembly组件运行在浏览器的Wasm环境,服务器端服务运行在后端,两者属于不同进程,无法直接跨进程注入服务实例,必须通过HTTP/RPC这类跨进程通信方式实现交互。
内容的提问来源于stack exchange,提问作者Ron
相关产品推荐
相关产品推荐

