CoreWCF 项目组正式发布 1.0 版本的 CoreWCF, 这是面向 .NET Core 平台的 WCF 移植版本。它支持 SOAP、NetTCP 和 WSDL 的相同实现。在代码中的使用方式于 WCF 相同,但是升级到使用 ASP.NET Core 作为服务宿主,并工作在 .NET Core 平台上。这是该项目的第一个主要发布,为 .NET Core、.NET Framework 和 .NET 5+ 提供 WCF 的特性。
CoreWCF 1.0 版本兼容于 .NET standard 2.0,所以它可以工作在:
.NET Framework 4.6.2 (及以上)
.NET Core 3.1
.NET 5 & 6
对于 .NET Framework 的支持简化了了迁移到 .NET Core 代价。依赖 WCF 的应用程序可以在 .NET Framewordk 平台就地升级到使用 CoreWCF。对于随后升级到使用 .NET Core 或者 .NET 5+ 也一样。
程序集可以通过 Nuget.org 得到,参见发布说明中的描述。
社区项目
CoreWCF 于 2019年6 月作为社区项目 发布,在随后的 3 年中有众多的贡献者。作为社区项目,CoreWCF 有大量的来自微软员工之外的贡献者,以及常规的来自 AWS 和其它组织的贡献者。
特别感想 所有 贡献代码的开发者、问题以及建议者。该项目能够发展到今天,社区的支持至关重要,我们希望今后继续得到大家的支持。如果我不特别提到@ mconnew,那将是我的失职,他一直是项目的骨干,并贡献了大部分代码。
作为社区项目,来自社区的声音引导着项目的方向。例如,Feature Roadmap Vote issue 是计划下一步工作的高度流畅的渠道。如果你是 WCF 用户,请提供你对今后版本的期待。
特性
CoreWF 是来自 WCF 功能子集,但是包含了我们相信是其中最为重要的部分功能,包括
Http & NetTCP transports
Bindings:
BasicHttpBinding
NetHttpBinding
NetTcpBinding – some WS-* features not supported
WebHttpBinding
WSHttpBinding – some WS-* features not supported
Security:
Transport
NetTcpBinding supports Certificate and Windows authentication
Http bindings require authentication to be configured in ASP.NET Core
Transport With Message Credentials
Username, Certificate and Windows Authentication are supported
WS Federation
WSDL generation
Partial configuration support including services & endpoints
Extensibility (IServiceBehavior and IEndpointBehavior) – most extensibility is available
没有实现的 WCF 主要功能有:
Transports other than Http and NetTCP.
Message security beyond Transport & Transport with Message Credentials
Distributed transactions
Message Queueing
谁应该使用 CoreWCF?
CoreWCF 面向的对象是曾经在 .NET Framework 下使用 WCF 的开发者,以及需要在 .NET Core 下需要使用 WCF 来现代化应用的开发者。尽管并没有什么可以阻止你对新项目适配 CoreWCF,我们还是建议你考虑更为现代的 SOAP 的替代品,例如 gRPC。CoreWCF 的关键点是对强依赖于 WCF 和 SOAP 的服务器和客户端应用更为简单的进行现代化。
来自微软的支持
我们认可对于企业客户的支持是如何重要,所以我们很高兴地宣布微软的产品支持将提供给 CoreWCF 客户。
对于 CoreWCF 1.x 的支持将基于底层运行的 .NET 平台状态。
运行时版本 | Support dependency duration |
---|---|
.NET Framework 4.x | The specific version of .NET Framework, and ASP.NET Core 2.1. |
.NET Core 3.1 | .NET 3.1 LTS – December 3, 2022 |
.NET 5 | .NET 5 – May 8, 2022 |
.NET 6 | .NET 6 LTS – November 8, 2024 |
CoreWCF 将使用 Major.Minor 版本策略:
1.0 将是 CoreWCF 的第一个主要版本
Minor 发布将标记为 1.x,对基础平台的要求与 1.0 相同
Minor 发布版本 (1.x) 将 API 兼容于 1.0 版本
对于主要版本的支持将会持续到最后的 major.minor 发布
当新的 major 或者 minor 发布的时候,上一版本将从新版本发布之日起,继续支持 6 个月,前提是正在使用的基础运行时依赖项仍在支持范围内。
后继的主要版本,例如 2.0,可能缩减支持的运行时。对于当前的 1.x 版本,会对于 2.x 版本不再支持的版本继续支持 6 个月,并且支持的时间仅限于底层的平台。
最可能涉及到 .NET Framework,并且意味着只要支持 ASP.NET Core 2.1 和 .NET Framework 4.x,就可以支持 1.x。
更多支持
其它的组织或者公司可能选择支持使用了 CoreWCF 的产品或者服务。
使用入门
对于数据和服务的定义与实现于 WCF 相同。主要的区别在于现在的宿主变成了 ASP.NET Core,以及服务暴露出来的方式。以下示例基于 .NET 6,但是同样的步骤也适用于其它平台。
1. 定义服务
1.1 创建空白的 ASP.NET Core 应用程序,它提供服务的寄宿支持
Visual Studio
命令行:
mkdir CoreWCFDemoServer
dotnet new web -n CoreWCFDemoServer -o CoreWCFDemoServer
1.2 添加 CoreWCF Nuget 包
Visual Studio
使用包管理器控制台,添加:
CoreWCF.Primitives
CoreWCF.Http
编辑项目文件,并添加:
<ItemGroup><PackageReference Include="CoreWCF.Http" Version="1.0.0" /><PackageReference Include="CoreWCF.Primitives" Version="1.0.0" />
</ItemGroup>
1.3 创建服务约定和数据约定定义
这些定义与 WCF 中相同。当改进项目的时候,这些代码很大部分不需要修改。
文件:IEchoService.cs
using System.Diagnostics.CodeAnalysis;
using System.Runtime.Serialization;
using CoreWCF;namespace CoreWCfDemoServer
{[DataContract]public class EchoFault{[AllowNull]private string _text;[DataMember][AllowNull]public string Text{get { return _text; }set { _text = value; }}}[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($"Received {text} from client!");return text;}public string ComplexEcho(EchoMessage text){System.Console.WriteLine($"Received {text.Text} from client!");return text.Text;}public string FailEcho(string text)=> throw new FaultException<EchoFault>(new EchoFault() { Text = "WCF Fault OK" }, new FaultReason("FailReason"));}
}
1.4 需要告诉服务宿主哪些服务需要通过绑定暴露出来
更新 Program.cs 来暴露绑定。
using CoreWCF;
using CoreWCF.Configuration;
using CoreWCF.Description;
using CoreWCfDemoServer;var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, options) =>
{options.AllowSynchronousIO = true;
});// Add WSDL support
builder.Services.AddServiceModelServices().AddServiceModelMetadata();
builder.Services.AddSingleton<IServiceBehavior, UseRequestHeadersForMetadataAddressBehavior>();var app = builder.Build();
app.UseServiceModel(builder =>
{builder.AddService((serviceOptions) => { })// Add a BasicHttpBinding at a specific endpoint.AddServiceEndpoint<EchoService, IEchoService>(new BasicHttpBinding(), "/EchoService/basichttp")// Add a WSHttpBinding with Transport Security for TLS.AddServiceEndpoint<EchoService, IEchoService>(new WSHttpBinding(SecurityMode.Transport), "/EchoService/WSHttps");
});
var serviceMetadataBehavior = app.Services.GetRequiredService();
serviceMetadataBehavior.HttpGetEnabled = true;app.Run();
1.5 更新 appsettings.json 来指定固定的服务监听端口
在 appsettings.json 文件中的 Logging
之前,增加如下行。
"Urls": "http://localhost:5000;https://localhost:5001",
1.6 运行项目以便服务可以被访问
2. 消费服务
2.1 创建控制台应用
2.2 添加服务引用
Visual Studio
使用 添加服务引用
命令,选择 WCF Web Service
作为服务类型
使用 http://localhost:5000/EchoService/basichttp
作为 WSDL 服务发现的 URL 地址。
命令行方式:
dotnet tool install --global dotnet-svcutil
dotnet-svcutil --roll-forward LatestMajor http://localhost:5000/EchoService/basichttp?wsdl
2.3 将控制台应用代码替换为如下代码
using ServiceReference1;
// Instantiate the Service wrapper specifying the binding and optionally the Endpoint URL. The BasicHttpBinding could be used instead.
var client = new EchoServiceClient(EchoServiceClient.EndpointConfiguration.WSHttpBinding_IEchoService, "https://localhost:5001/EchoService/WSHttps");var simpleResult = await client.EchoAsync("Hello");
Console.WriteLine(simpleResult);var msg = new EchoMessage() { Text = "Hello2" };
var msgResult = await client.ComplexEchoAsync(msg);
Console.WriteLine(msgResult);
其它示例
其它示例,包括桌面应用示例,请参阅:CoreWCF/src/Samples: https://github.com/CoreWCF/CoreWCF/tree/main/src/Samples
总结
我们很高兴看到社区在 CoreWCF 上的投入,并祝贺此发布。