更改 WCF 服务以与 .NET Framework 和 .NET Core 调用方兼容
Alter a WCF Service for Compatibility with both .NET Framework & .NET Core Callers
TL;DR 我有一个现有的 WCF 服务作为 Windows 服务托管,我想修改它以便它可以被现有的 .NET Framework 调用4.7 应用程序以及新的 .NET Core 2.2 应用程序。解决这个问题最简单的方法是什么?
完整说明:我有一个现有的 Web 应用程序(称之为 'A')运行正在 .NET Framework 4.7 上运行。它与也在 .NET 4.7 上的现有 WCF 服务 'B'(Windows 服务)对话。他们通过 NetTcpBinding 进行通信。
我正在 .NET Core 2.2 上构建一个新的 Web 应用程序 'C'。我需要它与现有服务 B 通信。我可以根据需要修改 A 和 B,但时间和金钱有限。此外,B 使用了一个 API,而 运行 仅在 .NET Framework 上使用,因此它可以 not 在 .NET Core 上转换为 运行,令我很沮丧。
服务 B 很小。它的整个公开合同是 5 种方法。安全性真的很低。这是一家小公司的仅限内部网的应用程序。
修改现有 WCF 服务 B(如果需要,还有 A)以便它可以与应用程序 A 和 C 通信的最快、最简单的方法是什么?
我猜我应该 change the WCF Binding 在应用程序 A 和 B 上使用 C 上的 HttpClient 可以轻松与之交谈的东西;如果是这样,那是哪个绑定以及如何使用 HttpClient 与其交互?此外,是否有任何隐藏的 "gotchas" 将 WCF 绑定从 NetTcpBinding 更改为其他会咬我的东西?
是的,我们可以使用 Basichttpbinding 和 WebHttpBinding 发布服务,因为 Core 与 WS-binding 的兼容性不佳。
使用 basichttpbinding 创建服务很简单,只需将 System.servicemodel 部分替换为以下代码片段即可。
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpBinding" scheme="http" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
然后我们可以通过添加服务引用来调用服务。
或者我们使用Webhttpbinding发布restful风格的服务,就像Asp.NetWebAPI一样。
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/wcf-web-http-programming-model
然后我们可以通过构造带有请求正文的 HTTP 请求 GET/POST/PUT/Delete 来调用该服务。 Core 和 .netframework 都支持它,因为 Http 协议是通用的。
TL;DR 我有一个现有的 WCF 服务作为 Windows 服务托管,我想修改它以便它可以被现有的 .NET Framework 调用4.7 应用程序以及新的 .NET Core 2.2 应用程序。解决这个问题最简单的方法是什么?
完整说明:我有一个现有的 Web 应用程序(称之为 'A')运行正在 .NET Framework 4.7 上运行。它与也在 .NET 4.7 上的现有 WCF 服务 'B'(Windows 服务)对话。他们通过 NetTcpBinding 进行通信。
我正在 .NET Core 2.2 上构建一个新的 Web 应用程序 'C'。我需要它与现有服务 B 通信。我可以根据需要修改 A 和 B,但时间和金钱有限。此外,B 使用了一个 API,而 运行 仅在 .NET Framework 上使用,因此它可以 not 在 .NET Core 上转换为 运行,令我很沮丧。
服务 B 很小。它的整个公开合同是 5 种方法。安全性真的很低。这是一家小公司的仅限内部网的应用程序。
修改现有 WCF 服务 B(如果需要,还有 A)以便它可以与应用程序 A 和 C 通信的最快、最简单的方法是什么?
我猜我应该 change the WCF Binding 在应用程序 A 和 B 上使用 C 上的 HttpClient 可以轻松与之交谈的东西;如果是这样,那是哪个绑定以及如何使用 HttpClient 与其交互?此外,是否有任何隐藏的 "gotchas" 将 WCF 绑定从 NetTcpBinding 更改为其他会咬我的东西?
是的,我们可以使用 Basichttpbinding 和 WebHttpBinding 发布服务,因为 Core 与 WS-binding 的兼容性不佳。
使用 basichttpbinding 创建服务很简单,只需将 System.servicemodel 部分替换为以下代码片段即可。
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpBinding" scheme="http" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
然后我们可以通过添加服务引用来调用服务。
或者我们使用Webhttpbinding发布restful风格的服务,就像Asp.NetWebAPI一样。
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/wcf-web-http-programming-model
然后我们可以通过构造带有请求正文的 HTTP 请求 GET/POST/PUT/Delete 来调用该服务。 Core 和 .netframework 都支持它,因为 Http 协议是通用的。