更改 WCF 服务以与 .NET Framework 和 .NET Core 调用者兼容

Posted

技术标签:

【中文标题】更改 WCF 服务以与 .NET Framework 和 .NET Core 调用者兼容【英文标题】:Alter a WCF Service for Compatibility with both .NET Framework & .NET Core Callers 【发布时间】:2019-10-21 02:15:06 【问题描述】:

TL;DR 我有一个作为 Windows 服务托管的现有 WCF 服务,我想对其进行修改,以便现有的 .NET Framework 4.7 应用程序以及新的 .NET 可以调用它核心 2.2 应用程序。解决这个问题最简单的方法是什么?

完整说明:我有一个在 .NET Framework 4.7 上运行的现有 Web 应用(称为“A”)。它还与 .NET 4.7 上的现有 WCF 服务“B”(Windows 服务)对话。它们通过 NetTcpBinding 进行通信。

我正在 .NET Core 2.2 上构建一个新的 Web 应用“C”。我需要它与现有的服务 B 对话。我可以根据需要修改 A 和 B,但时间和金钱是有限的。此外,B 使用仅在 .NET Framework 上运行的 API,因此它不能转换为在 .NET Core 上运行,这让我很沮丧。

服务 B 很小。它的整个暴露合约是 5 种方法。安全性真的很低。这是一家小公司的仅限 Intranet 的应用程序。

修改现有 WCF 服务 B(和 A,如果需要)以使其可以与应用 A 和 C 通信的最快、最简单的方法是什么?

我猜我应该只在应用程序 A 和 B 上使用 change the WCF Binding 来处理我可以在 C 上使用 HttpClient 轻松交谈的内容;如果是这样,那是哪个绑定以及如何使用 HttpClient 与之交互?此外,是否有任何隐藏的“陷阱”将 WCF 绑定从 NetTcpBinding 更改为其他会咬我的东西?

【问题讨论】:

【参考方案1】:

是的,我们可以使用 Basichttpbinding 和 WebHttpBinding 发布服务,因为 Core 与 WS-binding 不兼容。 使用 basichttpbinding 创建服务很简单,只需将 System.servicemodel 部分替换为以下代码 sn-ps。

  <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.Net WebAPI一样。https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/wcf-web-http-programming-model 然后我们可以通过构造一个带有请求主体的 HTTP 请求 GET/POST/PUT/Delete 来调用该服务。 Core 和 .netframework 都支持它,因为 Http 协议是通用的。

【讨论】:

谢谢。你推荐 BasicHttpBinding 还是 WebHttpBinding? 看你自己,但客观来说,构建restful服务并不是wcf的强项,或许用webapi构建会更好。如果要保留wcf服务,使用basichtttpbinding,很简单,还可以使用证书对客户端进行认证,保证通信安全。如果有什么可以帮助的,请随时告诉我。 WebHttpBinding 是否与您上面使用的添加服务引用功能兼容?它为我生成了代码,但是我无法从 .NET Core 代码中找到可以使用的 WebHttpBinding,这使它变得有用。这似乎是一个死胡同。 webhttpbinding创建的WCF服务称为Restful风格的服务,可以通过我们用http客户端构造http请求的方式来消费。例如,[WebGet]修饰的方法可以通过在浏览器地址栏中输入服务地址来调用。 ***.com/questions/53200663/…code-maze.com/different-ways-consume-restful-api-csharp 此外,它也可以通过生成客户端代理(添加服务引用)来调用,可能与传统的SOAP服务有些不同。 ***.com/questions/54018130/…

以上是关于更改 WCF 服务以与 .NET Framework 和 .NET Core 调用者兼容的主要内容,如果未能解决你的问题,请参考以下文章

通过 WCF 服务传递 NetworkCredential 以与 EWS API 一起使用

在 IIS6 上托管 WCF,是不是需要任何特殊设置?

更改 WCF 服务的绑定?

当 Fiddler 运行 .Net 4.5 时,WCF 服务正在工作

WCF 服务中的 SignalR 用于更新网站客户端

具有相对路径的 Asp.net 自托管 WCF 服务 WSDL