NetCore使用WCF简单方式
服务端代码结构自动生成
dotnet new install CoreWCF.Templates dotnet new corewcf --name MyServicek
客户端代码结构自动生成
dotnet tool install --global dotnet-svcutil dotnet-svcutil --roll-forward LatestMajor https://localhost:7116/Service.svc?wsdl
客户端需要安装System.ServiceModel.Http包支持
官方指导文档:CoreWCF 快速入门
数据契约和服务契约的定义与实现与 WCF 保持一致。主要区别在于宿主的定义(现已基于 ASP.NET Core)以及服务暴露的方式。以下内容基于 .NET 6,但相同步骤适用于其他 .NET 版本。
✨ 新增 - 使用项目模板
CoreWCF 1.1 版本已提供项目模板,包含以下几乎所有概念的预置实现。
通过以下命令安装模板:
dotnet new --install CoreWCF.Templates
安装完成后,可通过 Visual Studio 或命令行使用:
- Visual Studio:在「新建项目」对话框中搜索 CoreWCF 查找模板(需通过命令行安装后才会显示)。
- 命令行:使用
dotnet new corewcf --name CoreWCFDemoServer创建名为 CoreWCFDemoServer 的项目。
定义服务
1. 创建 ASP.NET Core 空应用(作为服务宿主)
Visual Studio:
命令行:
mkdir CoreWCFDemoServer
dotnet new web -n CoreWCFDemoServer -o CoreWCFDemoServer
2. 添加 CoreWCF NuGet 包引用
Visual Studio: 通过「包管理器控制台」安装以下包:
- CoreWCF.Primitives
- CoreWCF.Http
命令行: 编辑项目文件或直接执行以下命令:
dotnet add package CoreWCF.Primitives
dotnet add package CoreWCF.Http
3. 定义服务契约和数据契约
契约定义与 WCF 完全一致,现代化项目时该部分代码可基本保持不变。
文件:IEchoService.cs
using System.Diagnostics.CodeAnalysis; using System.Runtime.Serialization; using CoreWCF; namespace CoreWCfDemoServer { [DataContract] // 数据契约 public class EchoFault { [DataMember] // 数据成员 [AllowNull] public string Text { get; set; } } [ServiceContract] // 服务契约 public interface IEchoService { [OperationContract] // 操作契约 string Echo(string text); [OperationContract] string ComplexEcho(EchoMessage text); [OperationContract] [FaultContract(typeof(EchoFault))] // 错误契约 string FailEcho(string text); } [DataContract] public class EchoMessage { [AllowNull] [DataMember] public string Text { get; set; } } }
文件:EchoService.cs(服务实现)
using CoreWCF; namespace CoreWCfDemoServer { public class EchoService : IEchoService { public string Echo(string text) { System.Console.WriteLine($"收到客户端消息:{text}"); return text; } public string ComplexEcho(EchoMessage text) { System.Console.WriteLine($"收到客户端复杂消息:{text.Text}"); return text.Text; } public string FailEcho(string text) => throw new FaultException<EchoFault>(new EchoFault() { Text = "WCF 错误示例" }, new FaultReason("失败原因")); } }
4. 配置服务宿主(指定服务与绑定关系)
更新 Program.cs 以暴露服务绑定:
using CoreWCF; using CoreWCF.Configuration; using CoreWCF.Description; using CoreWCfDemoServer; var builder = WebApplication.CreateBuilder(args); // 添加 WSDL 支持 builder.Services.AddServiceModelServices().AddServiceModelMetadata(); builder.Services.AddSingleton<IServiceBehavior, UseRequestHeadersForMetadataAddressBehavior>(); var app = builder.Build(); // 配置 WSHttpBinding(显式指定无凭据类型,默认 Windows 凭据需额外配置) var myWSHttpBinding = new WSHttpBinding(SecurityMode.Transport); // Transport 模式(基于 TLS) myWSHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; // 配置 CoreWCF 服务 app.UseServiceModel(builder => { builder.AddService<EchoService>(serviceOptions => { }) // 添加 BasicHttpBinding 端点(HTTP 协议) .AddServiceEndpoint<EchoService, IEchoService>(new BasicHttpBinding(), "/EchoService/basichttp") // 添加 WSHttpBinding 端点(HTTPS 协议,带传输安全) .AddServiceEndpoint<EchoService, IEchoService>(myWSHttpBinding, "/EchoService/WSHttps"); }); // 启用 HTTP Get 元数据(WSDL) var serviceMetadataBehavior = app.Services.GetRequiredService<CoreWCF.Description.ServiceMetadataBehavior>(); serviceMetadataBehavior.HttpGetEnabled = true; app.Run();
5. 配置固定端口(appsettings.json)
在 appsettings.json 的「Logging」节点前添加以下配置:
"Urls": "http://localhost:5000;https://localhost:5001",
6. 运行服务
启动项目后,服务将在以下地址监听:
- HTTP:http://localhost:5000/EchoService/basichttp
- HTTPS:https://localhost:5001/EchoService/WSHttps
- WSDL 元数据:http://localhost:5000/EchoService/basichttp?wsdl
消费服务
1. 创建控制台应用(客户端)
2. 添加服务引用
Visual Studio:
- 右键项目 →「添加」→「服务引用」
- 选择「WCF Web 服务」
- 输入 WSDL 地址:
http://localhost:5000/EchoService/basichttp?wsdl
命令行:
- 安装 dotnet-svcutil 工具:
dotnet tool install --global dotnet-svcutil
- 生成服务引用代码:
dotnet-svcutil --roll-forward LatestMajor http://localhost:5000/EchoService/basichttp?wsdl
3. 客户端调用代码
替换控制台应用的 Program.cs 代码:
using ServiceReference1; // 服务引用生成的命名空间(需与实际一致) // 初始化客户端(指定 WSHttps 端点配置和服务地址) var client = new EchoServiceClient( EchoServiceClient.EndpointConfiguration.WSHttpBinding_IEchoService, "https://localhost:5001/EchoService/WSHttps" ); // 调用简单 Echo 方法 var simpleResult = await client.EchoAsync("Hello CoreWCF!"); Console.WriteLine("简单调用结果:" + simpleResult); // 调用复杂类型方法 var msg = new EchoMessage { Text = "Hello Complex Echo!" }; var msgResult = await client.ComplexEchoAsync(msg); Console.WriteLine("复杂调用结果:" + msgResult); // (可选)测试错误契约 try { await client.FailEchoAsync("测试错误"); } catch (FaultException<EchoFault> ex) { Console.WriteLine($"错误契约捕获:{ex.Detail.Text},原因:{ex.Reason}"); } client.CloseAsync().Wait(); Console.ReadKey();
其他示例
更多示例(包括桌面框架示例)请参考:CoreWCF/Samples
关键术语说明(保持技术准确性)
|
英文术语
|
中文翻译
|
说明
|
|---|---|---|
|
Service Contract
|
服务契约
|
定义服务暴露的方法接口
|
|
Data Contract
|
数据契约
|
定义服务间传输的数据结构
|
|
Operation Contract
|
操作契约
|
标记服务契约中可被客户端调用的方法
|
|
Fault Contract
|
错误契约
|
定义服务抛出的结构化错误信息
|
|
Binding
|
绑定
|
定义服务的通信协议、编码方式、安全配置
|
|
Endpoint
|
端点
|
服务的访问地址(URL + 绑定 + 契约)
|
|
WSDL
|
Web 服务描述语言
|
服务元数据,用于客户端生成调用代码
|
|
Transport Security
|
传输层安全
|
基于 TLS/SSL 的通信加密(HTTPS)
|
注意事项
- HTTPS 配置:示例中 WSHttpBinding 使用
SecurityMode.Transport(依赖 TLS),需确保服务端证书配置正确(可参考之前的自签名证书绑定方案)。 - 兼容性:CoreWCF 兼容大部分 WCF 契约定义,迁移项目时可直接复用原有契约代码。
- .NET 版本:示例基于 .NET 6,.NET 8/10 中可直接使用(需确保 CoreWCF 版本与 .NET 版本兼容)。
博客园发布提示: 1. 文中图片需先上传至博客园相册,替换对应
src 地址; 2. 代码块已适配博客园高亮,直接复制即可正常显示; 3. 若需代码块折叠,可在博客园后台「选项」中开启「代码折叠」功能。

浙公网安备 33010602011771号