.NET(非.NET Framework)客户端-服务端应用搭建方法及示例
.NET(Core/.NET 5+)客户端-服务端RPC实现说明
和.NET Framework内置WCF的实现逻辑不同,新版.NET没有内置移植原WCF的服务端组件(ServiceHost相关能力),仅保留了WCF客户端组件用于调用旧框架下的WCF服务。官方原生推荐的跨网络/跨进程RPC交互方案为gRPC,旧WCF项目迁移也可以选择社区维护的CoreWCF库兼容原有写法。
核心实现差异
- 服务端不再手动构造
ServiceHost、指定绑定/契约/地址三要素,所有RPC能力直接集成到ASP.NET Core通用宿主管道,走统一的路由、中间件、监听配置 - 原生gRPC方案通过
.proto文件定义标准化服务契约,编译时自动生成服务端基类和客户端调用代码,默认用Protobuf序列化、HTTP/2传输,性能远高于原WCF默认的XML序列化+HTTP/1.1方案 - 客户端不再需要手动构造
ChannelFactory指定绑定,直接通过gRPC通道传入服务地址即可生成可直接调用的客户端实例
最简可运行示例(gRPC,官方推荐)
示例实现和给出的WCF示例逻辑完全对应:包含SaySomething(服务端接收字符串弹窗)、Sum(两数求和返回结果)两个接口,基于.NET 6+编写。
1. 契约定义
gRPC用.proto文件作为跨端共享的标准契约,新建文件RpcContract.proto:
syntax = "proto3"; option csharp_namespace = "RpcContracts"; // 对应原WCF的[ServiceContract]接口 service DemoService { // 对应原WCF的[OperationContract]标记方法 rpc SaySomething (SaySomethingReq) returns (EmptyResp); rpc Sum (SumReq) returns (SumResp); } // 以下是接口用到的参数/返回值结构定义 message SaySomethingReq { string content = 1; } message EmptyResp {} message SumReq { int32 a = 1; int32 b = 2; } message SumResp { int32 result = 1; }
2. 服务端实现
- 新建空ASP.NET Core项目,安装
Grpc.AspNetCore包 - 将上面的.proto文件加入项目,文件属性设置「生成操作」为Protobuf编译器,gRPC桩代码生成选项选「服务器」
- 编写服务逻辑:
using Grpc.Core; using RpcContracts; using System.Windows.Forms; public class DemoServiceImpl : DemoService.DemoServiceBase { // 对应原WCF服务的SaySomething实现 public override Task<EmptyResp> SaySomething(SaySomethingReq request, ServerCallContext context) { MessageBox.Show(request.Content); return Task.FromResult(new EmptyResp()); } // 对应原WCF服务的Sum实现 public override Task<SumResp> Sum(SumReq request, ServerCallContext context) { return Task.FromResult(new SumResp { Result = request.A + request.B }); } }
- 配置服务启动入口
Program.cs:
var builder = WebApplication.CreateBuilder(args); // 注册gRPC服务 builder.Services.AddGrpc(); var app = builder.Build(); // 挂载RPC服务端点,监听4000端口,对应原WCF的服务地址 app.MapGrpcService<DemoServiceImpl>(); app.Run("http://localhost:4000");
3. 客户端实现
- 新建客户端项目(控制台/WinForm/WPF均可),安装
Grpc.Net.Client、Grpc.Tools、Google.Protobuf三个包 - 把相同的.proto文件加入客户端项目,文件属性设置「生成操作」为Protobuf编译器,gRPC桩代码生成选项选「客户端」
- 编写调用逻辑:
using Grpc.Net.Client; using RpcContracts; using System.Windows.Forms; class RpcClient { private readonly DemoService.DemoServiceClient _client; public RpcClient() { // 对应原WCF的通道创建逻辑,直接指定服务地址即可 var channel = GrpcChannel.ForAddress("http://localhost:4000"); _client = new DemoService.DemoServiceClient(channel); } public void SendMessageToServer(string text) { _client.SaySomething(new SaySomethingReq { Content = text }); } public void CalcSumOf2And3() { var resp = _client.Sum(new SumReq { A = 2, B = 3 }); MessageBox.Show(resp.Result.ToString()); } }
旧WCF项目快速迁移方案
如果不想重写原有WCF的[ServiceContract]/[OperationContract]标记的接口和实现,可以使用社区维护的CoreWCF库,服务端写法和原.NET Framework WCF几乎一致,直接集成到ASP.NET Core宿主即可,客户端可以继续沿用原ChannelFactory<T>的调用逻辑,适合存量项目快速迁移到新版.NET。
内容的提问来源于stack exchange,提问作者Edward
相关产品推荐
相关产品推荐

