WCF适用于.NET Core和.NET 5+的WCF1.0特点展示及上手教程

615 阅读6分钟

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。
Project Template

命令行:

mkdir CoreWCFDemoServer
dotnet new web -n CoreWCFDemoServer -o CoreWCFDemoServer

2.添加对CoreWCF Nuget包的引用

Visual Studio。

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

  • 基元
  • Http

Package Manager Console

命令行。

编辑项目文件并添加。

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

Add Service Reference Dialog

使用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上的问题讨论提供反馈,特别是你认为下一步应该做哪些功能。