CoreWCF 1.0 正式發佈,支持 .NET Core 和 .NET 5+ 的 WCF
CoreWCF 1.0 正式發佈,支持 .NET Core 和 .NET 5+ 的 WCF
//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?
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": "//localhost:5000;//localhost:5001",
1.6 運行項目以便服務可以被訪問
2. 消費服務
2.1 創建控制台應用
2.2 添加服務引用
Visual Studio
使用 添加服務引用 命令,選擇 WCF Web Service 作為服務類型

使用 //localhost:5000/EchoService/basichttp 作為 WSDL 服務發現的 URL 地址。
命令行方式:
dotnet tool install --global dotnet-svcutil
dotnet-svcutil --roll-forward LatestMajor //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, "//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 上的投入,並祝賀此發佈。

