返回

用C#语言开发一服务,让Python通过PO/PI的方式调用

闲谈

先说下为什么讲soap(后文开始是用 SOAP ):soap 这个东西在如今微服务普遍存在的时候,其实被诟病的地方不少,但历史沉淀的东西,尤其像 soap 这种,虽然出现的早,但至今依然可用,当然如果业务需要,还是有存在的价值。而且 SOAP 有规范,标准通用,不用担心兼容性的问题,还有一点 SOAP 协议是建立在HTTP上,HTTP 是个开放协议,也就是 SOAP 可以跑在多种语言中,但.net 可以通过 wshttp 协议,在内部可以同 rpc 或者其他协议关联,所以我们可以很方便在 Web 应用程序、Web Service、分布式对象之间传输数据。soap 的底层使用 XML 数据格式传输数据。

注意,不是 WCF + Web Api,而 WCF + SOAP。

WebService 是一个分布式的应用,它可以让我们通过网络互相通信。我们可以在某个电脑上使用 WCF 创建一个服务,然后在其他电脑上使用 WCF来调用这些服务。WebService 的一个特别之处是通信的方式。

我们使用 Soap 提供网络通信协议,那么就可以实现跨语言调用了,今天我们尝试使用 C# 的 WCF 构建一个简单的服务,然后使用 python 的 soaplib 去调用这个服务,当然 Python 中也有好多支持 SOAP 协议的库,如 zeep 等,当然原生带的 soap 依然还是好用。

话不多说,先上代码:

服务端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace service
{
    [ServiceContract]
    public interface ICalculator
    {
        [OperationContract]
        int Add(int a, int b);

        [OperationContract]
        int Sub(int a, int b);

        [OperationContract]
        int Mul(int a, int b);

        [OperationContract]
        int Div(int a, int b);
    }

    public class Calculator : ICalculator
    {
        public int Add(int a, int b)
        {
            return a + b;
        }

        public int Sub(int a, int b)
        {
            return a - b;
        }

        public int Mul(int a, int b)
        {
            return a * b;
        }

        public int Div(int a, int b)
        {
            return a / b;
        }
    }
}

调用端:

from suds.client import Client

url = 'http://localhost:8000/CalculatorService?wsdl'
client = Client(url)

print(client.service.Add(1, 2))
print(client.service.Sub(3, 2))
print(client.service.Mul(4, 2))
print(client.service.Div(8, 2))

注意,这种方式有个明显缺点,就是每个服务都需要生成对应的 wsdl,依赖 wsdl 编译成客户端调用,如果使用 Python 的 xmlrpclib 或者 zeep 等,它们默认会产生代理类,使用起来更方便些,只需要配置一下,相当于是封装了 soap 协议,更方便开发,感兴趣可以了解下,今天的内容不多。