https://devblogs.microsoft.com/dotnet/corewcf-v1-released/
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 的支持简化了了迁移到 .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 功能子集,但是包含了我们相信是其中最为重要的部分功能,包括
没有实现的 WCF 主要功能有:
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 版本策略:
其它的组织或者公司可能选择支持使用了 CoreWCF 的产品或者服务。
对于数据和服务的定义与实现于 WCF 相同。主要的区别在于现在的宿主变成了 ASP.NET Core,以及服务暴露出来的方式。以下示例基于 .NET 6,但是同样的步骤也适用于其它平台。
Visual Studio
命令行:
mkdir CoreWCFDemoServer dotnet new web -n CoreWCFDemoServer -o CoreWCFDemoServer
Visual Studio
使用包管理器控制台,添加:
编辑项目文件,并添加:
<ItemGroup> <PackageReference Include="CoreWCF.Http" Version="1.0.0" /> <PackageReference Include="CoreWCF.Primitives" Version="1.0.0" /> </ItemGroup>
这些定义与 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")); } }
更新 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();
在 appsettings.json 文件中的 Logging
之前,增加如下行。
"Urls": "http://localhost:5000;https://localhost:5001",
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
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
我们很高兴看到社区在 CoreWCF 上的投入,并祝贺此发布。