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