如何同时使用 SOAP WCF 服务和 REST API

Posted

技术标签:

【中文标题】如何同时使用 SOAP WCF 服务和 REST API【英文标题】:How to Consume SOAP WCF Service and REST API Together 【发布时间】:2020-12-06 14:23:50 【问题描述】:

我正在编写一个非常基本的应用程序,它将从数据库中获取一些数据,并将这些数据传递给全国各地的不同网络服务。 我的问题是,我必须向其传递数据的服务是 WCF 服务,其中一些是 WEB API。 我想在不添加服务引用的情况下使用 wcf 服务,所以我不会为所有服务创建单独的代理类,因为将来我们将添加更多的客户端,我也会使用他们的服务,所以手动添加服务暂时不给大家参考。

我将使用以下代码来使用不同的 wcf 服务:

BasicHttpBinding binding = new BasicHttpBinding();
EndpointAddress address = new EndpointAddress("http://localhost:4684/Service1.svc");
ChannelFactory factory = new ChannelFactory<ServiceContract>(binding, address);
ServiceContract channel = factory.CreateChannel();
string resturnmessage = channel.YourMethod("test");

但是我不能使用这种方法来消费REST API,所以我必须为此单独编写一个专用函数,并且需要标记客户端是否有REST API或WCF服务。

请在这方面提供帮助。谢谢

【问题讨论】:

问题解决了吗?如果我的回复对您有帮助,您可以将其标记为答案。如果问题没有解决,请告诉我。 【参考方案1】:

您可以将SOAP 代码放在SOAPDriver 类中,将REST 代码放在RESTDriver 类中。

然后创建一个使用 SOAPDriver 或 RESTDriver 的 WebService 类,具体取决于它被告知与之通信的服务。

伪代码:

// Get database data
String data = getDatabaseData();

WebService webService = new WebService();
webService.send(WebService.REST, data); // REST and SOAP are variables in the WebService class

class WebService 
  public static final int REST = 1;
  public static final int SOAP = 2;

  public void send(int serviceType, String data) 
    switch (serviceType) 
      case REST:
        restDriver.send(data);
        break;
        ...
    
  

【讨论】:

【参考方案2】:

这是我的演示:

<endpoint address="REST"
    binding="webHttpBinding"
    contract="Demo_rest_ConsoleApp.IService1" behaviorConfiguration="ESEndPointBehavior"/>
<endpoint address="SOAP" 
    binding="basicHttpBinding" 
    contract="Demo_rest_ConsoleApp.IService1"></endpoint>

这是我的 WCF 服务。它发布了两个端点,一个是 SOAP 服务,另一个是 REST 服务。

 BasicHttpBinding binding = new BasicHttpBinding();
            EndpointAddress address = new EndpointAddress("http://localhost:8763/TEST/SOAP");
            ChannelFactory<IService1> factory = new ChannelFactory<IService1>(binding, address);
            IService1 channel = factory.CreateChannel();
            Console.WriteLine(channel.Test());
            Console.ReadLine();

调用 SOAP 服务:

WebHttpBinding binding = new WebHttpBinding();
            EndpointAddress address = new EndpointAddress("http://localhost:8763/TEST/REST");
            ChannelFactory<IService1> factory = new ChannelFactory<IService1>(binding, address);
            factory.Endpoint.EndpointBehaviors.Add(new WebHttpBehavior());
            IService1 channel = factory.CreateChannel();
            Console.WriteLine(channel.Test());
            Console.ReadLine();

调用 REST 服务:

调用 REST 服务时不要忘记添加 WebHttpBehavior:

factory.Endpoint.EndpointBehaviors.Add(new WebHttpBehavior());

如果问题仍然存在,请随时告诉我。

【讨论】:

以上是关于如何同时使用 SOAP WCF 服务和 REST API的主要内容,如果未能解决你的问题,请参考以下文章

将 WCF SOAP 和 WCF REST 服务托管为 Azure 应用服务

用于 Xamarin 表单的 Rest + WCF 集成

WCF 服务默认是restful 还是基于soap?

web service, wcf, wcf rest, web api之间的区别

快速入门系列--WCF--03RESTFUL服务与示例

休息与肥皂有啥区别[重复]