CoreWCF项目组已经发布了CoreWCF的1.0版本,这是WCF在.NET Core平台上的一个移植。它提供了一个兼容的SOAP、NetTCP和WSDL的实现。代码中的用法与WCF相似,但更新后使用ASP.NET Core作为服务主机,并与.NET Core一起工作。这是该项目第一个主要版本,为.NET Core、.NET Framework和.NET 5+提供WCF功能。
CoreWCF的1.0版本与.NET标准2.0兼容,因此它可以在以下情况下工作:
- .NET Framework 4.6.2(及以上)。
- .NET核心3.1
- .NET 5和6
对.NET框架的支持将使.NET Core的现代化之路更容易实现。有WCF依赖关系的应用程序可以更新为在.NET框架上使用CoreWCF,然后在更新为使用.NET Core或.NET 5+时也能正常工作。
这些程序集可以在Nuget.org上找到,如发行说明中所述。
社区项目
CoreWCF在2019年6月被宣布为一个社区项目,在过去3年中有许多贡献者。作为一个社区项目,CoreWCF有更多来自其他贡献者的提交,而不是微软员工,以及来自AWS和其他组织的定期贡献。
作为一个社区项目,社区的声音引导着项目的方向。例如,功能路线图的投票问题对下一步工作的规划过程有很大影响。如果你是WCF用户,请提供你希望在后续版本中看到的反馈。
特点
CoreWCF是WCF功能的一个子集,但代表了我们认为最常用的功能,包括:
- Http和NetTCP传输
- 绑定
- BasicHttpBinding
- NetHttpBinding
- NetTcpBinding - 不支持某些WS-*特性
- WebHttpBinding
- WSHttpBinding - 不支持某些WS-*功能
- 安全性
- 运输
- NetTcpBinding支持证书和Windows认证
- Http绑定需要在ASP.NET Core中配置认证
- 带有消息凭证的传输
- 支持用户名、证书和Windows认证
- WS联盟
- 生成WSDL
- 部分配置支持,包括服务和端点
- 可扩展性(IServiceBehavior和IEndpointBehavior)--大部分可扩展性是可用的
尚未实现的主要WCF特性包括:
- 除Http和NetTCP之外的传输。
- 超越传输的消息安全和带消息凭证的传输
- 分布式事务
- 消息队列
谁使用CoreWCF?
CoreWCF是为那些已经在.NET框架上使用WCF并需要在.NET Core中支持WCF以促进应用程序现代化的客户准备的。虽然没有什么可以阻止你在绿地项目中采用CoreWCF,但我们建议你考虑更现代的SOAP替代品,如gRPC。CoreWCF的优势在于使那些对WCF和SOAP有强烈依赖性的服务器和客户端更容易实现现代化。
微软的支持
我们认识到支持对企业客户的重要性,因此我们很高兴地宣布,微软的产品支持将为CoreWCF客户提供。
对CoreWCF 1.x的支持将取决于它所运行的底层.NET平台的支持状况。
| 运行时间版本 | 支持依赖期 |
|---|---|
| .NET框架4.x | .NET Framework的具体版本,以及ASP.NET Core 2.1。 |
| .NET核心3.1 | .NET 3.1 LTS - 2022年12月3日 |
| .NET 5 | .NET 5 - 2022年5月8日 |
| .NET 6 | .NET 6 LTS - 2024年11月8日 |
CoreWCF将使用Major.Minor版本策略:
- 1.0将是CoreWCF的第一个主要版本
- 次要版本将被编号为1.x,并将具有与1.0相同的基础平台要求。
- 次要版本的发布(1.x)将与1.0版本的API兼容。
- 支持将主要针对每个支持的主要版本的最新major.minor版本。
- 当新的主要或次要版本发布时,那么以前的版本将在新版本发布之日起的6个月内得到支持,前提是正在使用的底层运行时依赖性仍在支持范围内。
- 后续的主要版本,如2.0,可能会减少被支持的运行时的地图。在这种情况下,1.x将在6个月后继续支持不被2.0支持的运行时,而支持时间将只受底层平台的限制。
- 这很可能适用于.NET框架,这意味着只要ASP.NET核心2.1和.NET框架4.x都在支持范围内,1.x就会被支持。
更多支持
其他组织/公司可能会选择在使用其产品和服务的同时为CoreWCF提供支持。
开始使用
数据和服务合同的定义和实现与WCF相同。主要的区别在于主机的定义,现在是基于ASP.NET Core,以及服务如何被暴露的仪式。以下是基于.NET 6的内容,但同样的步骤也适用于其他版本的.NET。
定义服务
1.创建一个ASP.NET Core Empty应用程序,这为服务提供了主机。
Visual Studio。

命令行:
mkdir CoreWCFDemoServer
dotnet new web -n CoreWCFDemoServer -o CoreWCFDemoServer
2.添加对CoreWCF Nuget包的引用
Visual Studio。
使用包管理器控制台,添加:
- 基元
- Http

命令行。
编辑项目文件并添加。
<ItemGroup>
<PackageReference Include="CoreWCF.Http" Version="1.0.0" />
<PackageReference Include="CoreWCF.Primitives" Version="1.0.0" />
</ItemGroup>
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"));
}
}
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();
5.更新appsettings.json,指定服务要监听的固定端口
在appsettings.json的 "Logging "行前添加以下一行。
"Urls": "http://localhost:5000;https://localhost:5001",
6.运行该项目,以便可以调用服务
要使用该服务
1.创建一个控制台应用程序
2.添加一个服务引用
视觉工作室
使用 "Add Service Reference "命令,并选择 "WCF Web Service "作为服务类型。

使用http://localhost:5000/EchoService/basichttp 作为发现WSDL的URL。
命令行
在命令行中,可以使用svcutil生成相同的代码。
dotnet tool install --global dotnet-svcutil
dotnet-svcutil --roll-forward LatestMajor http://localhost:5000/EchoService/basichttp?wsdl
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中找到。
看它的运行情况
在最近的一集 On .NET节目中,Matthew Connew和James Montemagno一起讲解了CoreWCF的所有新功能和发展路线。
摘要
我们很高兴看到社区对CoreWCF项目的投资,并祝贺他们发布了这个版本。该项目正在进行中,他们欢迎你通过GitHub上的问题和讨论提供反馈,特别是你认为下一步应该做哪些功能。