CoreWCF 1.0 正式发布,支持 .NET Core 和 .NET 5+ 的 WCF
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的更多相关文章
- CoreWCF 1.0.0 发布,微软正式支持WCF
2022年4月28日,我们达到了一个重要的里程碑,并发布了CoreWCF的1.0.0版本.对Matt Connew (微软WCF团队成员)来说,这是5年前即 2017年1月开始的漫长旅程的结束.Mat ...
- .NET Core 2.0 正式发布信息汇总
万众瞩目的.NET Core 2.0终于发布了,原定于9.19的dotnetconf大会的发布时间大大提前了1个月,.NET Core 2.0/.NET Standard 2.0的正式发布是.NET ...
- 全球首发-基于.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. ...
- 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 或 ...
- 微服务架构 - Jimu(积木) 升级 1.0.0 支持 .Net Core 3.0
如果不知道 Jimu(积木) 是啥,请移步 .Net Core 分布式微服务框架介绍 - Jimu 这次升级除了支持 .Net Core 3.0 还新增部分功能,如 REST, 链路跟踪等,以下为详细 ...
- 【重要更新】Senparc.Weixin SDK v6.5 升级说明(支持 .NET Core 3.0 及分布式消息上下文)
Senparc.Weixin SDK v6.5 开始支持 .NET Core 3.0,并将微信消息上下文进行了大幅度的重构,支持了使用分布式缓存存储上下文信息,这意味着在分布式系统中,现在 Senpa ...
- 号外号外!WPF界面开发者福音,DevExpress支持.NET Core 3.0!
通过DevExpress WPF Controls,你能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案. 无论是Office办公软件的衍 ...
- Spring Boot 2.2.0 正式发布,支持 JDK 13!
Java技术栈 www.javastack.cn 优秀的Java技术公众号 推荐阅读: Spring Boot 2.2.0 正式发布了,可从 repo.spring.io 或是 Maven Centr ...
- Sentinel 1.5.0 正式发布,引入 Reactive 支持
近日,流控降级组件 Sentinel 的又一个里程碑版本 1.5.0 正式发布. 该版本引入 Reactive 的支持,并提供多项新特性与改进.从 1.5.0 版本开始,Sentinel 仅支持 JD ...
随机推荐
- Intellij IDEA实现SpringBoot项目多端口启动的两种方法
有时候使用springboot项目时遇到这样一种情况,用一个项目需要复制很多遍进行测试,除了端口号不同以外,没有任何不同.遇到这种情况怎么办呢?这时候可以使用Intellij IDEA解决 前言 有时 ...
- Jenkins+Docker+Git 自动化部署
Jenkins+Docker+Git 自动化部署图文教程 https://blog.csdn.net/qq_38252039/article/details/89791247 前言: 通过几天的学习和 ...
- 哪个类包含 clone 方法?是 Cloneable 还是 Object?
java.lang.Cloneable 是一个标示性接口,不包含任何方法,clone 方法在 object 类中定义.并且需要知道 clone() 方法是一个本地方法,这意味着它是由 c 或 c++ ...
- OpenCV+QT5在Window下的环境配置记录
在安装OpenCV时最需要注意的是,OpenCV库,也就是我们需要的dll和动态库需要我们使用CMake来生成. 虽然在官网上下载得到的文件中已经包含了库文件和.h等头文件,但是在具体开发中编译器编译 ...
- 面试题目:手写一个LRU算法实现
一.常见的内存淘汰算法 FIFO 先进先出 在这种淘汰算法中,先进⼊缓存的会先被淘汰 命中率很低 LRU Least recently used,最近最少使⽤get 根据数据的历史访问记录来进⾏淘汰 ...
- C++ | 虚函数初探
虚函数 虚函数 是在基类中使用关键字 virtual 声明的函数.在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数. 我们想要的是在程序中任意点可以根据所调用的对象类型来选择调 ...
- 【Matlab】简单的滑模控制程序及Simulink仿真
文章: [控制理论]滑模控制最强解析 滑模控制程序及Simulink仿真 这篇文章仿真和输出U的推到有些问题,博主根据此篇文章进行修改进行对sin(t)曲线的追踪(使用滑模控制) 使用滑模控制对sin ...
- 安装TypeScript
安装TypeScript 创建工程文件夹:mkdir <project folder> 进入工程文件夹:cd <project folder> 快速创建程序包:npm init ...
- flex布局中父容器属性部分演示效果
如图可见flex的属性分为父容器和子容器的属性共12个.关于这些属性具体代表什么意思,网上有很多教程的文章,自觉不能写得比别人更好,所以这里主要写了一些例子关于父容器属性效果的演示,希望可以帮助大家理 ...
- background-clip 和 background-origin
下面都是我自己的理解, 如果有不对的地方, 还请大家帮忙指出.下面是在 chrome 浏览器上测试的 background-clip 和 background-origin 先说说background ...