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 平台状态。

运行时版本 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

总结

我们很高兴看到社区在 CoreWCF 上的投入,并祝贺此发布。

CoreWCF 1.0 正式发布,支持 .NET Core 和 .NET 5+ 的 WCF的更多相关文章

  1. CoreWCF 1.0.0 发布,微软正式支持WCF

    2022年4月28日,我们达到了一个重要的里程碑,并发布了CoreWCF的1.0.0版本.对Matt Connew (微软WCF团队成员)来说,这是5年前即 2017年1月开始的漫长旅程的结束.Mat ...

  2. .NET Core 2.0 正式发布信息汇总

    万众瞩目的.NET Core 2.0终于发布了,原定于9.19的dotnetconf大会的发布时间大大提前了1个月,.NET Core 2.0/.NET Standard 2.0的正式发布是.NET ...

  3. 全球首发-基于.NET 6长线支持Zoomla!逐浪CMS v8.6.0正式发布

    传送门: https://www.z01.com/down/3778.shtml 全新Zoomla!逐浪CMS v8.6.0 全于首个基于.net 6长线支持的CMS-Zoomla!逐浪CMS v8. ...

  4. C# 当前 .NET SDK 不支持将 .NET Core 2.1 设置为目标。请将 .NET Core 2.0 或更低版本设置为目标,或使用支持 .NET Core 2.1 的 .NET SDK 版本。

    报错信息: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 NETSDK1045 当前 .NET SDK 不支持将 .NET Core 2.2 设置为目标.请将 .NET Core 2.1 或 ...

  5. 微服务架构 - Jimu(积木) 升级 1.0.0 支持 .Net Core 3.0

    如果不知道 Jimu(积木) 是啥,请移步 .Net Core 分布式微服务框架介绍 - Jimu 这次升级除了支持 .Net Core 3.0 还新增部分功能,如 REST, 链路跟踪等,以下为详细 ...

  6. 【重要更新】Senparc.Weixin SDK v6.5 升级说明(支持 .NET Core 3.0 及分布式消息上下文)

    Senparc.Weixin SDK v6.5 开始支持 .NET Core 3.0,并将微信消息上下文进行了大幅度的重构,支持了使用分布式缓存存储上下文信息,这意味着在分布式系统中,现在 Senpa ...

  7. 号外号外!WPF界面开发者福音,DevExpress支持.NET Core 3.0!

    通过DevExpress WPF Controls,你能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案. 无论是Office办公软件的衍 ...

  8. Spring Boot 2.2.0 正式发布,支持 JDK 13!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 推荐阅读: Spring Boot 2.2.0 正式发布了,可从 repo.spring.io 或是 Maven Centr ...

  9. Sentinel 1.5.0 正式发布,引入 Reactive 支持

    近日,流控降级组件 Sentinel 的又一个里程碑版本 1.5.0 正式发布. 该版本引入 Reactive 的支持,并提供多项新特性与改进.从 1.5.0 版本开始,Sentinel 仅支持 JD ...

随机推荐

  1. Captcha生成验证码,docker部署时问题

    https://blog.csdn.net/huofuman960209/article/details/100738712 Dockerfile FROM openjdk:8-jdk-alpine ...

  2. 如何使用 Spring Boot 实现异常处理?

    Spring 提供了一种使用 ControllerAdvice 处理异常的非常有用的方法. 我们通过实现一个 ControlerAdvice 类,来处理控制器类抛出的所有异常.

  3. Kafka 新旧消费者的区别?

    旧的 Kafka 消费者 API 主要包括:SimpleConsumer(简单消费者) 和 ZookeeperConsumerConnectir(高级消费者).SimpleConsumer 名字看起来 ...

  4. MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么?

    以下是 MySQL_fetch_array 和 MySQL_fetch_object 的区别: MySQL_fetch_array() – 将结果行作为关联数组或来自数据库的常规数组返回. MySQL ...

  5. 单片,SOA 和微服务架构有什么区别?

    单片架构类似于大容器,其中应用程序的所有软件组件组装在一起并紧密 封装.第一个面向服务的架构是一种相互通信服务的集合.通信可以涉及简单的数 据传递,也可以涉及两个或多个协调某些活动的服务.微服务架构是 ...

  6. 动态规划 洛谷P1616 疯狂的采药

    动态规划 洛谷P1616 疯狂的采药 同样也是洛谷的动态规划一个普及-的题目,接下来分享一下我做题代码 看到题目,没很认真的看数据大小,我就提交了我的代码: 1 //动态规划 洛谷P1616 疯狂的采 ...

  7. 无人驾驶—高精地图和V2X

    高精地图将厘米级的静态信息传传递给无人车V2X将路况上的动态信息传递给无人车 高精地图的作用 高精地图与传统地图的对比 高精地图与定位的关系 上图左侧是感知到的区域,右侧是高精地图,之后进行拼接获得车 ...

  8. CEPH-4:ceph RadowGW对象存储功能详解

    ceph RadosGW对象存储使用详解 一个完整的ceph集群,可以提供块存储.文件系统和对象存储. 本节主要介绍对象存储RadosGw功能如何灵活的使用,集群背景: $ ceph -s clust ...

  9. css-theme 通过一套源码生成一份包含多套皮肤配置的样式文件

    css-theme 通过单一css文件生成多套主题,并合并入一个css文件中 特性 只加载一个css,通过切换rootClass瞬间切换主题 体积压缩,将多套css合并,去除冗余代码,避免文件体积膨胀 ...

  10. 一个命令完成[打包+同步七牛cdn+上传服务器]

    webpack+gulp+qshell+npm-scripts实现一个命令完成[打包+同步cdn+上传服务器] 说明 由于我们用的七牛云存储,所以cdn也是走的七牛,所以并不适用于其他的cdn,但是思 ...