.NET Core中替代WCF的方案是什么?如何暴露Add方法给控制台应用?
在.NET Core中暴露类库函数的几种方案(替代WCF)
嘿,我太懂你从WCF转.NET Core时的迷茫了!其实完全没必要非得做RESTful服务,根据你的需求(把类库的Add函数暴露给控制台应用),有几个更合适的方案,我给你详细说说:
1. 直接引用类库(进程内调用,最简单)
如果你的控制台应用和类库在同一个解决方案里,这是最直接的方式——根本不需要任何服务端/客户端的复杂配置,直接引用类库后实例化调用就行。
类库代码示例
namespace MathLibrary { public class Calculator { public int Add(int x, int y) { return x + y; } } }
控制台应用调用代码
using MathLibrary; // 直接实例化类库中的类调用方法 var calculator = new Calculator(); int result = calculator.Add(3, 5); Console.WriteLine($"Add结果:{result}");
这种方式适合同一进程内的调用,完全没有额外开销,是最省心的选择。
2. 使用gRPC(跨进程/跨平台的WCF替代方案)
如果你需要跨进程或者跨机器调用类库的方法,gRPC是.NET Core官方推荐的替代WCF的方案——它是轻量级、高性能的RPC框架,支持跨平台,强类型的调用体验和WCF很像。
步骤:
- 给类库和控制台应用都安装NuGet包:
Grpc.AspNetCore、Google.Protobuf、Grpc.Tools - 定义
.proto文件(用来描述服务和数据结构):
syntax = "proto3"; option csharp_namespace = "MathGrpc"; // 定义服务接口 service CalculatorService { rpc Add (AddRequest) returns (AddResponse); } // 请求参数 message AddRequest { int32 x = 1; int32 y = 2; } // 响应结果 message AddResponse { int32 result = 1; }
- 在控制台应用中实现gRPC服务端,调用类库的
Add方法:
using Grpc.Core; using MathGrpc; using MathLibrary; // 实现gRPC服务 public class CalculatorServiceImpl : CalculatorService.CalculatorServiceBase { private readonly Calculator _calculator = new Calculator(); public override Task<AddResponse> Add(AddRequest request, ServerCallContext context) { // 调用类库的Add方法 var result = _calculator.Add(request.X, request.Y); return Task.FromResult(new AddResponse { Result = result }); } } // 启动gRPC服务 var server = new Server { Services = { CalculatorService.BindService(new CalculatorServiceImpl()) }, Ports = { new ServerPort("localhost", 50051, ServerCredentials.Insecure) } }; server.Start(); Console.WriteLine("gRPC服务已启动,端口:50051"); Console.WriteLine("按任意键停止服务..."); Console.ReadKey(); await server.ShutdownAsync();
- 客户端调用(可以是同一个控制台的不同部分,或者另一个进程的应用):
using Grpc.Core; using MathGrpc; // 创建gRPC通道 var channel = new Channel("localhost:50051", ChannelCredentials.Insecure); var client = new CalculatorService.CalculatorServiceClient(channel); // 调用Add方法 var response = await client.AddAsync(new AddRequest { X = 3, Y = 5 }); Console.WriteLine($"Add结果:{response.Result}"); // 关闭通道 await channel.ShutdownAsync();
3. RESTful Web API(可选,非必须)
如果你的场景需要跨语言调用,或者依赖HTTP生态,那RESTful服务是可行的,但绝对不是必须的。你可以用ASP.NET Core Web API快速实现:
步骤:
- 创建一个ASP.NET Core Web API项目,引用你的类库
- 编写控制器:
using Microsoft.AspNetCore.Mvc; using MathLibrary; [ApiController] [Route("api/calculator")] public class CalculatorController : ControllerBase { private readonly Calculator _calculator = new Calculator(); [HttpGet("add")] public IActionResult Add(int x, int y) { var result = _calculator.Add(x, y); return Ok(result); } }
- 控制台应用用
HttpClient调用:
using System.Net.Http.Json; var client = new HttpClient(); var result = await client.GetFromJsonAsync<int>("http://localhost:5000/api/calculator/add?x=3&y=5"); Console.WriteLine($"Add结果:{result}");
总结
- 同一进程内调用:直接引用类库,最省事
- 跨进程/跨机器调用:优先选gRPC,性能好、强类型,是WCF的完美替代
- REST只是可选方案,不是.NET Core下暴露方法的必须选择
内容的提问来源于stack exchange,提问作者Sigex
相关产品推荐
相关产品推荐

