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

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.xThe 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

444dd9d5bdb57053e8839f7f4a7eb6ac.png

命令行:

mkdir CoreWCFDemoServer
dotnet new web -n CoreWCFDemoServer -o CoreWCFDemoServer

1.2 添加 CoreWCF Nuget 包

Visual Studio

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

  • CoreWCF.Primitives

  • CoreWCF.Http

719baa738b2c6c6c5ca8b2fe82006943.png

编辑项目文件,并添加:

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

e54195e8ab8623717c77acfddacbb9ab.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287862.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

表头合并_多个Excel表格合并数据麻烦?试试Power Query轻松帮你解决

Hi!大家好&#xff01;欢迎来到小龙自修室&#xff01;又到了小龙分享时间&#xff01;(今天的内容有点多&#xff0c;希望各位看官一定要看到最后&#xff01;有惊喜)上一篇文字小龙和大家一起制作了一个限定数据内容录入的电子表格&#xff0c;我的表格我做主&#xff01;表格…

C++入门指南及实战 第三步 基本变量

在C编程中&#xff0c;内置了一些基本数据类型用来存储一些不同类型的值。有字符类型 char 用以存储字符&#xff0c;如a、b、c、d、-、、1、2、4、3、>、?等&#xff1b;有整形 int 用以存储整数类型&#xff0c;如1、2、3、4、5、11、111、2311等&#xff1b;有浮点类型 …

OPCServer Modbus使用和配置

一&#xff0c;安装KEPware.Enhanced.OPC.DDE.KEPServer。(PLC数据传送给KEPServer,开发的程序用OPCServer读KEPServer) 设置ip地址后面是指的plc站号&#xff0c;此处必须和plc上站号对应。否则无法接收数据。 打开quick client 查看传值情况 二.C#程序代码 引用opcdaauto.dll…

C# 创建命名管道服务器

通过创建 NamedPipeServerStream 的一个新实例&#xff0c;来创建服务器。NamedPipeServerStream 派生自基类 PipeStream&#xff0c;PipeStream 派生自 Stream 基类&#xff0c;因此可以使用流的所有功能&#xff0c;例如&#xff0c;可以创建CryptoStream 或 GZipStream&…

在香蕉派 Banana Pi BPI-M1上使用 开源 OxOffice Impress

2019独角兽企业重金招聘Python工程师标准>>> 在香蕉派 Banana Pi BPI-M1上使用 开源 OxOffice Impress 在Banana Pi BPI-M1上使用OxOffice Impress&#xff0c;該簡報大小約26MB&#xff0c;採用自動播放機制。 OxOffice提供 arm linux的版本&#xff0c;可佈署在ar…

免杀新姿势:利用线程将恶意代码注入到内存中

本文讲的是免杀新姿势&#xff1a;利用线程将恶意代码注入到内存中&#xff0c;产生存放远程攻击线程的进程在这篇文章中我不想一步一步解释我编写的C#代码&#xff0c;但是我会展示下它能够绕过杀毒软件&#xff0c;并且操作非常简单&#xff0c;而且实用。 首先说明一下&…

Java之解决散列表的冲突用开放定址法和链表法

1 问题 理想状态下&#xff0c;散列表就是一个包含关键字的固定大小的数组&#xff0c;通过使用散列函数&#xff0c;将关键字映射到数组的不同位置&#xff0c;哈希函数可以将关键字均匀的分散到数组的不同位置&#xff0c;不会出现两个关键字散列值相同&#xff08;假设关键…

python 手把手教你基于搜索引擎实现文章查重

前言 文章抄袭在互联网中普遍存在&#xff0c;很多博主都收受其烦。近几年随着互联网的发展&#xff0c;抄袭等不道德行为在互联网上愈演愈烈&#xff0c;甚至复制、黏贴后发布标原创屡见不鲜&#xff0c;部分抄袭后的文章甚至标记了一些联系方式从而使读者获取源码等资料。这…

lru算法实现 redis_使用数组与双向链表实现一个简单的LRU算法

什么是LRU算法&#xff1f;redis大家都玩过吧&#xff0c;你们好奇redis内存数据存满之后会发生什么吗&#xff1f;抛出异常&#xff1f;禁止使用&#xff1f;还是删除数据&#xff1f;其实redis设计了一种内润淘汰机制。noeviction(默认策略)&#xff1a;屏蔽写操作&#xff0…

bzoj3224 Tyvj 1728 普通平衡树题解--Treap

题面&#xff1a; Description您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一些数&#xff0c;其中需要提供以下操作&#xff1a; 1. 插入x数 2. 删除x数(若有多个相同的数&#xff0c;因只删除一个) 3. 查询x数的排名(若有多个相同的数&…

Blazor University (18)使用 RenderFragments 模板化组件 —— 创建 TabControl

原文链接&#xff1a;https://blazor-university.com/templating-components-with-renderfragements/creating-a-tabcontrol/创建一个 TabControl 组件源代码[1]接下来我们将创建一个 TabControl 组件。这将教您如何实现以下目标&#xff1a;将数据传递到 RenderFragment 以为其…

Java之GC机制

1 JVM基本结构 1&#xff09;类加载器classLoader&#xff1a;在JVM启动时或者类运行时将需要的.class文件加载到内存中 2&#xff09;内存区域&#xff08;运行时数据区&#xff09;&#xff1a; 是在JVM运行的时候操作所分配的内存区 3&#xff09;执行引擎&#xff1a;负…

《零基础看得懂的C语言入门教程 》——(一)脱离学习误区

本节视频连接&#xff1a; https://www.bilibili.com/video/BV1Qv411t7ae 新手C语言学习有些误区你应该知道&#xff0c;这样学习起来事半功倍~一、前言 距离上一次编写C语言的教程是5年前了&#xff08;2015年&#xff09;&#xff0c;由于自己是从初一时开始学习编程&#…

一套完整的导视设计案例_色彩导视艺术:乌克兰基辅语言学校导视设计案例

学校导视设计案例建筑师Emil Dervish为乌克兰基辅Underhub语言学校设计了色彩缤纷的导视系统&#xff0c;该设计灵感来源于伦敦地铁&#xff0c;他希望通过彩色线条的大胆应用来营造轻松而欢乐的氛围。让我们一起来看看这座由“彩虹”做导视的学校。彩虹导视设计跟着红色导视线…

C# 创建匿名管道

下面对匿名管道执行类似的操作。通过匿名管道&#xff0c;创建两个彼此通信的任务。为了给管道的创建发出信号&#xff0c;使用 ManualResetEventSlim 对象&#xff0c;与内存映射文件一样。在 Program 类的 Run 方法中&#xff0c;创建两个任务&#xff0c;调用 Reader 和 Wri…

内测投票

create table DiaoYanTiMu &#xff08;  Ids int(10) auto_increment not null primary key(),//把所需要的都写上中间不需要符号隔开&#xff0c;设自增长列类型必须是int&#xff0c;主键的话必须不能为空not null&#xff0c; Title varchar(50) not null &#xff09;;/…

Mysql 查询统计练习

2019独角兽企业重金招聘Python工程师标准>>> 1、建表 customers 顾客表 products 产品表 orders 订单表 -- 顾客表 CREATE TABLE customers (c_id INT NOT NULL AUTO_INCREMENT,lastname VARCHAR(255),firstname VARCHAR(255),address VARCHAR(255),birthday DATETI…

C++11模版元编程的应用

1.概述 关于C11模板元的基本用法和常用技巧&#xff0c;我在程序员2015年2月B《C11模版元编程》一文&#xff08;后称前文&#xff09;中已经做了详细地介绍&#xff0c;那么C11模版元编程用来解决什么实际问题呢&#xff0c;在实际工程中又该如何应用呢&#xff1f;本文将侧重…

《零基础看得懂的C语言入门教程 》——(二)C语言没那么难简单开发带你了解流程

一、学习目标 了解DevC集成开发环境了解集成开发环境了解HelloWorld程序了解HelloWorld程序的编写方法 目录 C语言真的很难吗&#xff1f;那是你没看这张图&#xff0c;化整为零轻松学习C语言。 第一篇&#xff1a;&#xff08;一&#xff09;脱离学习误区 第二篇&#xff1…

11选5下期算法_本周六周日【高二直播】辅导网课预告:通用技术电控二三极管、多用电表测量、数字逻辑电路、解析枚举递归算法,2022浙江选考技术...

01第19-21讲 2020年11月28日29日开课目录鲸学名师考点精讲系统提高高二共3阶段精品课夯实基础冲刺技术选考97-100分&#xff01;11月28日【高二|提高|直播】高二精品直播课讲授&#xff1a;浙江选考技术科目第19讲 高二综合提高鲸学名师讲授高中通用技术&#xff1a;第19讲 电控…