You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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. 服务端实现

  1. 新建空ASP.NET Core项目,安装Grpc.AspNetCore包
  2. 将上面的.proto文件加入项目,文件属性设置「生成操作」为Protobuf编译器,gRPC桩代码生成选项选「服务器」
  3. 编写服务逻辑:
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
        });
    }
}
  1. 配置服务启动入口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. 客户端实现

  1. 新建客户端项目(控制台/WinForm/WPF均可),安装Grpc.Net.Client、Grpc.Tools、Google.Protobuf三个包
  2. 把相同的.proto文件加入客户端项目,文件属性设置「生成操作」为Protobuf编译器,gRPC桩代码生成选项选「客户端」
  3. 编写调用逻辑:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:51:42