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 上的投入,并祝賀此發布。