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 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 面向的对象是曾经在 .NET Framework 下使用 WCF 的开发者,以及需要在 .NET Core 下需要使用 WCF 来现代化应用的开发者。尽管并没有什么可以阻止你对新项目适配 CoreWCF,我们还是建议你考虑更为现代的 SOAP 的替代品,例如 gRPC。CoreWCF 的关键点是对强依赖于 WCF 和 SOAP 的服务器和客户端应用更为简单的进行现代化。
来自微软的支持我们认可对于企业客户的支持是如何重要,所以我们很高兴地宣布微软的产品支持将提供给 CoreWCF 客户。
对于 CoreWCF 1.x 的支持将基于底层运行的 .NET 平台状态。
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
总结我们很高兴看到社区在 CoreWCF 上的投入,并祝贺此发布。