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:
  1. 右键项目 →「添加」→「服务引用」
  2. 选择「WCF Web 服务」
  3. 输入 WSDL 地址:http://localhost:5000/EchoService/basichttp?wsdl
命令行:
  1. 安装 dotnet-svcutil 工具:
dotnet tool install --global dotnet-svcutil
  1. 生成服务引用代码:
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)

注意事项

  1. HTTPS 配置:示例中 WSHttpBinding 使用 SecurityMode.Transport(依赖 TLS),需确保服务端证书配置正确(可参考之前的自签名证书绑定方案)。
  2. 兼容性:CoreWCF 兼容大部分 WCF 契约定义,迁移项目时可直接复用原有契约代码。
  3. .NET 版本:示例基于 .NET 6,.NET 8/10 中可直接使用(需确保 CoreWCF 版本与 .NET 版本兼容)。
博客园发布提示: 1. 文中图片需先上传至博客园相册,替换对应 src 地址; 2. 代码块已适配博客园高亮,直接复制即可正常显示; 3. 若需代码块折叠,可在博客园后台「选项」中开启「代码折叠」功能。
posted @ 2025-12-07 10:58  XUEZEJUN  阅读(15)  评论(0)    收藏  举报