CoreWCF 1.0 正式发布,支持 .NET Core 和 .NET 5+ 的 WCF

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?

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

CoreWCF 1.0 正式发布,支持 .NET Core 和 .NET 5+ 的 WCF-LMLPHP

命令行:

mkdir CoreWCFDemoServer
dotnet new web -n CoreWCFDemoServer -o CoreWCFDemoServer

1.2 添加 CoreWCF Nuget 包

Visual Studio

使用包管理器控制台,添加:

  • CoreWCF.Primitives
  • CoreWCF.Http

CoreWCF 1.0 正式发布,支持 .NET Core 和 .NET 5+ 的 WCF-LMLPHP

编辑项目文件,并添加:

<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 作为服务类型

CoreWCF 1.0 正式发布,支持 .NET Core 和 .NET 5+ 的 WCF-LMLPHP

使用 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 上的投入,并祝贺此发布。

04-30 10:38